레이블이 컴파일인 게시물을 표시합니다. 모든 게시물 표시
레이블이 컴파일인 게시물을 표시합니다. 모든 게시물 표시

2012년 8월 1일 수요일

iptables 를 이용한 트래픽 복사하기

특정 인터페이스에서 발생한 트래픽을 다른쪽으로 전달하고자 할때 사용할 수 있는 방법이 있다. 스위치에서 '미러링'을 하는 것과 같은 기능을 구현할 수 있는 것으로 iptables 을 이용하고 있다면 어렵지 않게 만들어 볼 수 있다. iptables 의 모듈중 TEE 를 이용하면 간단하다. *NIX 시스템을 이용해본 사용자라면 tee 명령어에 대해서 알고 있을 것이다. tee 명령어가 수행하는 것과 같은 기능이며 아래 예제는 PREROUTING 으로 설정하고 인터페이스 eth2 에서 발생되는 tcp 프로토쿨 중 목적지가 80번인 트래픽을 192.168.0.1 로 보낸다는 것이다.

iptables -A PREROUTING -t mangle -i eth2 -p tcp --dport 80 -j TEE --gateway 192.168.0.1

그런데 실행하다보면 TEE 모듈이 없다고 아래와 같이 에러가 발생하는 경우가 있다.

iptables v1.4.8: Couldn't load target `TEE':/lib/xtables/libipt_TEE.so: cannot open shared object file: No such file or directory


Try `iptables -h' or 'iptables --help' for more information.

/lib/xtables/libipt_TEE.so 파일이 존재하지 않기 때문이다. so 파일을 찾아보면 찾아볼 수가 없다.

# ls -l *.so
-rwxr-xr-x 1 root root  8116 Jul 27 18:57 libxt_CHAOS.so
-rwxr-xr-x 1 root root  8545 Jul 27 18:57 libxt_condition.so
-rwxr-xr-x 1 root root  6833 Jul 27 18:57 libxt_DELUDE.so
-rwxr-xr-x 1 root root  9482 Jul 27 18:57 libxt_dhcpmac.so
-rwxr-xr-x 1 root root  9491 Jul 27 18:57 libxt_DHCPMAC.so

libipt_TEE.so 파일이 필요하고 이것이 /lib/xtables 경로에 있어야 한다는 뜻이 된다.

해당 so 파일을 만들어 내기 위해서는 itables 컴파일등 복잡한 과정이 필요해질 수 있다. iptables 가 기본으로 설치되어 있는 경우라면 이것을 다시 컴파일 하기 까지는 적지않은 시간이 소요될 수가 있는 것이다. 데비안, 우분투와 같은 패키지 사용자라면 다음과 같이 쉽게 사용해 볼 수 있다.

우선 xtables 패키지를 검색해 보자.


# apt-cache search xtables
iptables-dev - iptables development files
xtables-addons-common - Extensions targets and matches for iptables [tools, libs]
xtables-addons-source - Extensions targets and matches for iptables [modules sources]

xtables-addons 에 관련 모듈이 들어 있는데, 패키지로 찾을 수가 있다. 소스파일이 보이니 이것을 컴파일 해주면 되는 것이다.

# apt-get install xtables-addons-common xtables-addons-source

로 설치해 주면 /usr/src 밑에 xtables-addons.tar.bz2 파일이 생성되게 된다. 그런데 이 소스를 가지고 어떻게 해 주어야 하는 것인가?

데비안의 경우 module-assistant 를 이용하면 쉽게 컴파일이 가능하다. 크게 다음과 같은 순서로 설치가 가능해진다.


# apt-get install module-assistant 
# ./module-assistant prepare
# ./module-assistant auto-install xtables-addons-source

module-assistant 를 이용하여 build 를 할 수 있고 module-assistant 를 설명을 보면 아래와 같다. 사용가능한 옵션들이 보이는데, build 는 컴파일을 수행하는 것이고 install 은 설치 purge 는 삭제다.

NAME
       module-assistant - manage kernel modules packages

SYNOPSIS
       module-assistant  [  -fihnqstv  ]  [ -k source/headers directory ] [ -l
       kernel versions ] { update | search | prepare | auto-install |  list  |
       list-available | list-installed | auto-unpacked | get | build | install
       | clean | purge | fakesource } [ pkg ... ]

       m-a ...

위 예에서는 auto-install 을 통해 한번에 자동으로 설치되는 것을 예로 들었는데, 직접 build 만을 하기 위해서는  " m-a build xtables-addons-source " 와 같이 사용하면 된다. module-assistant 가 길기 때문에 'm-a' 로 줄여서 사용할 수 있다.

실행하게 되면 /usr/src 에 존재하는 xtables-addons 소스를 확인하고 압축해제후 컴파일을  수행한다. 완료되면 deb 패키지로 만들어 주게되는데, 수동으로 이 deb 패키지를 설치하면 된다. dpkg -i 패키지명.deb 와 같이 말이다.

# m-a build xtables-addons-source
Extracting the package tarball, /usr/src/xtables-addons.tar.bz2, please wait...
Done with /usr/src/xtables-addons-modules-2.6.32-5-amd64_1.26-2+2.6.32-45_amd64.deb .



auto-install 은 컴파일과 설치까지 한번에 다 진행하게 되는데, 만약 이런 과정에 문제가 있을시에 각 단계를 따로 진행하면서 문제의 원인을 파악해 볼 수 있다. 더불어
텍스트 모드로드 실행할 수 있는데 -t 옵션을 사용하면 된다.

# m-a -t  build xtables-addons-source
Extracting the package tarball, /usr/src/xtables-addons.tar.bz2, please wait...
dh_testdir
/usr/bin/make -C /lib/modules/2.6.32-5-amd64/build M=/usr/src/modules/xtables-addons XA_ABSTOPSRCDIR=/usr/src/modules/xtables-addons clean
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-5-amd64'
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-5-amd64'
dh_clean

-t 옵션은 텍스트로 설치과정을 세세하게 보여주므로 어디서 문제가 발생하는지 쉽게찾을 수 있다. 만약 제거를 한다면 아래와 같이 사용하면 된다.

# m-a purge --force xtables-addons-source

이외 m-a 를 그냥 실행하면 아래와 같이 interactive 화면을 볼 수 있으며, overview 를 통해서 사용가능한 명령어들을 세부적으로 확인할 수 있다.


그런에 위와 같이 설치가 완료되더라도 so 파일이 존재하지 않는다고 나타난다. 커널 모듈 형태로 컴파일이 되었기 때문에 *.ko 와 같은 파일을 대신 볼 수 있을 것이다. iptables 가 설치된 환경이 다르지만 나의 경우는 so 파일이 필요하였기에 다음과 같이 컴파일을 수행했다.

/usr/src/modules/xtables-addons 경로로 이동 후 아래와 같이 실행한다.

# /usr/bin/make -f Makefile.iptrules M=/usr/src/modules/xtables-addons XA_TOPSRCDIR=/usr/src/modules/xtables-addons XA_SRCDIR=/usr/src/modules/xtables-addons
  CC     libxt_CHAOS.oo
  CCLD   libxt_CHAOS.so
  CC     libxt_DELUDE.oo
  CCLD   libxt_DELUDE.so

그러면 .so 파일이 만들어지는 것을 볼 수 있을 것이다. 그럼 이것을 경로에다 복사해 넣어주면 OK 다. iptables 를 이용한 설정은 간단하였는데, 오히려 libipt_TEE 를 사용하기 위해서 기술한 내용이 많았다. iptables 뿐만 아니라 다른 부분에서도 유용할 수 있으니 알아두면 유익할 것이다. :-)

2011년 1월 11일 화요일

tshark 파일 사이즈가 이렇게 컸었나?

와이어 샤크를 자주 사용했는데, 문득 사이즈는 얼마나 되었는지 깊게 보지 않았던것 같다.
리눅스 환경에서 자주 사용하던 tshark 용량을 살펴보니, 작은 크기가 아니었다.

정적으로 컴파일된 tshark 의 경우는 무려 49메나 되었다.
# ls -lh tshark
-rwxr-xr-x 1 root root 49M 2010-12-16 10:48 tshark

반면 Shared 로 컴파일한 tshark 는 겨우 300K 이었다. 물론, 공유 라이브러리 이기 때문에 이 내면을 들여다 보면, 큰 라이브러리들을 로드한다.
# ls -l tshark
-rwxr-xr-x 1 root root 301978 2010-12-16 11:22 tshark

ldd 로 사용되는 라이브러리 들을 살펴보자.

# ldd tshark
        linux-vdso.so.1 =>  (0x00007fffaf5ff000)
        libwiretap.so.0 => /home/wireshark-1.4.2/lib/libwiretap.so.0 (0x00007f43ac07a000)
        libwireshark.so.0 => /home/wireshark-1.4.2/lib/libwireshark.so.0 (0x00007f43a88c7000)
        libwsutil.so.0 => /home/wireshark-1.4.2/lib/libwsutil.so.0 (0x00007f43a86c5000)
        libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007f43a8402000)
        libm.so.6 => /lib/libm.so.6 (0x00007f43a817f000)
        libpcap.so.1 => /usr/local/lib/libpcap.so.1 (0x00007f43a7f47000)
        libz.so.1 => /usr/lib/libz.so.1 (0x00007f43a7d30000)
        libc.so.6 => /lib/libc.so.6 (0x00007f43a79dd000)
        libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007f43a77da000)
        libdl.so.2 => /lib/libdl.so.2 (0x00007f43a75d6000)
        libpcre.so.3 => /usr/lib/libpcre.so.3 (0x00007f43a73ae000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f43ac2e2000)

이중 libwireshark.so 를 들여다 보니, 그 크기는 무려 60메가다.

-rwxr-xr-x 1 root root  60M 2010-12-16 11:22 ../lib/libwireshark.so.0.0.1

이렇게 사이즈가 컸었나 하는 생각이 문득 든다. 참고로, 정적 방식과 Shared 방식으로 컴파일 시간을 비교해 보았더니 정적 컴파일은 8분 Shared 방식에는 4분이 소요되었다.

1) 정적컴파일
real    8m44.375s
user    7m28.108s
sys     1m5.848s
2) Shared 방식 컴파일
real    4m52.040s
user    4m12.156s
sys     0m40.743s

컴파일도 오래 걸리고, 그 크기도 크지만 그래도 네트워크 분석에는 최고의 도구임은 틀림없다.   :-)

2010년 8월 4일 수요일

리눅스 환경의 간단한 와이어샤크 컴파일은...

바로 전 포스팅에서 tshark 를 약간 수정하여 사용하는 부분에 대해서 설명하였다.


여기에 추가로 컴파일 과정에 대해서 간단히 덧붙이고자 한다. 컴파일은 *NIX 환경에서 한 것이고, 컴파일 전에
필요한 패키지들이 있다. 나의 경우는 기본으로 설치된 리눅스 환경에서, 필요한 패키지는 다음과 같은 것들이 있었다.

bison
flex
pkg-config
libglib

APT 패키지 설치가 가능한 환경이라면,
# apt-get install bison 과 같이 쉽게 설치가 가능하므로, ./configure 를 하는 과정에서 무엇이 없다고 하면
# apt-cache search pkg_name 으로 해서 찾아보면 쉽게 설치가 가능하다. X-Windows 가 설치되어 있지 않아
굳이 GUI 기반의 와이어샤크는 필요없었기에 --enable-wireshark=no 옵션으로 컴파일을 제외했고, GTK 도
사용안 하므로 --disable-gtktest 옵션을 주었다.

그럼 다음과 같이 컴파일을 위한 환경 준비를 위해 configure 를 실행해 주면 된다.

$ ./configure --enable-wireshark=no --disable-gtktest
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
.
. (삭제)
The Wireshark package has been configured with the following options.
                    Build wireshark : no
                       Build tshark : yes
                     Build capinfos : yes
                      Build editcap : yes
                      Build dumpcap : yes
                     Build mergecap : yes
                    Build text2pcap : yes
                      Build idl2wrs : yes
                      Build randpkt : yes
                       Build dftest : yes
                     Build rawshark : yes

             Install dumpcap setuid : no
                        Use plugins : yes
                    Use lua library : no
                   Build rtp_player : no
                        Use threads : no
             Build profile binaries : no
                   Use pcap library : yes
                   Use zlib library : yes
                   Use pcre library : no
               Use kerberos library : no
                 Use c-ares library : no
               Use GNU ADNS library : no
                Use SMI MIB library : no
             Use GNU crypto library : no
             Use SSL crypto library : no
           Use IPv6 name resolution : yes
                 Use gnutls library : no
     Use POSIX capabilities library : no
                  Use GeoIP library : no
$ make
$ make install


위 결과를 보는 것과 같이 와이어샤크는 컴파일하지 않는다고 "no" 가 나왔고 기타, 다른 라이브러리나
컴파일 되는 패키지 정보가 나온다. 즉, 본인이 사용하고자 하는 기능에 따라 해당 라이브러리도 있어야 되므로
configure 시 적절히 추가해 주어야 한다. 예를 들어, GeoIP 를 사용하겠다고 하면 --with-geoip=[경로] 옵션이
필요하게 된다. 사용가능한 옵션은

$ ./configure --help

로 확인할 수 있다. 와이어샤크는 오픈소스인 만큼 소스를 자유롭게 사용가능하므로 원하는 형태로
자유롭게 기능을 추가하거나 제거할 수 있다. 바로 이것이 오픈소스의 매력이며,
여러분들만의 와이어샤크를 만들어 볼 수 있는 기회를 줄것이다.

이전 포스팅에서 사용한 컴파일에 대해서 간략하게 소개한 것이므로, 좀더 깊게 컴파일 과정을 소개할 기회가
되는 대로 준비하겠다.

2010년 8월 2일 월요일

패킷 오픈 중 'appears to have been cut short in the middle of a packet' 메시지가 나타난다면..

와이어샤크 또는 tshark 를 사용하다 보면 패킷이 중간에 끊기어 다음과 같은 메시지를 보는 경우가 있다.

$ tshark -q -z io,phs -r test.pcap
tshark: "test.pcap" appears to have been cut short in the middle of a packet.

tshark 를 사용해 로드하는데 메시지가 패킷중간이 잘린것 같다고 나온다. GUI 환경의 와이어샤크에서도
이런 메시지가 나온다. 이유는, 코드 상에서 로드하다가 이런 경우가 발생되면 빠져나가도록
되어 있기 때문이다. 하지만 때로는, 어쩔수 없이 이런 패킷을 많이 봐야 할 경우도 생긴다.
(와이어샤크로 보는 경우라면 말이다)
특히 유닉스 상에서 덤프를 하는데 tcpdump 와 같이 패킷 덤프를 저장하다가 kill 로 해당 프로세스를 죽이지 않고 kill -9 와 같이 하는 경우는 이런 경우가 종종 발생한다.

일단 소스를 재 컴파일 해야 하는데, 일단 tshark 를 기준으로 설명한다. GUI 기반으로 컴파일 하려면 이것저것 더 필요한 것들이 많아서 귀차니즘으로 tshark 를 기준으로 한다. 물론, GUI 환경으로 컴파일이 다 준비되었다면 똑같이 wireshark 소스코드를 찾아 바꾸면 될 것이다.

와이어샤크 최신버전인 1.2.9 의 경우는 tshark.c 의 2279 라인을 보면 된다.

    case WTAP_ERR_SHORT_READ:
      cmdarg_err("\"%s\" appears to have been cut short in the middle of a packet.",
                 cf->filename);
//      break;    ---> 이 부분을 "//" 로 주석처리한다.
        return 0;     ---> 그리고 리턴 시켜준다.

break; 라고 되어 있는 부분을 주석처리 하면 된다. 이것은 일부로 에러가 발생해도 계속 동작하도록
수정하는 것이다. 나의 경우는 이런 것이 필요하여 코드를 보다가 이렇게 간단히 수정하여 사용하고 있다.

아래와 같이 실행하면 에러 메시지는 나와도 결과를 볼 수 있다. 필요하면 좀더 자기 입맛에 맞도록 수정하면 된다.
# ./tshark -q -z io,phs -r test.pcap
tshark: "test.pcap" appears to have been cut short in the middle of a packet.

===================================================================
Protocol Hierarchy Statistics
Filter: frame

frame                                    frames:394341 bytes:49686922
  eth                                    frames:394341 bytes:49686922
    ip                                   frames:394341 bytes:49686922
      tcp                                frames:394318 bytes:49683678
        http                             frames:78864 bytes:31308464
          data-text-lines                frames:39431 bytes:26418684
      udp                                frames:23 bytes:3244
        dns                              frames:20 bytes:2499
        nbdgm                            frames:3 bytes:745
          smb                            frames:3 bytes:745
            mailslot                     frames:3 bytes:745
              browser                    frames:3 bytes:745
===================================================================
필요에 의해서 간단하게 언급을 해 보았는데, 기회가 되면 다음번에 컴파일 과정에 대해서도 소개하도록 하겠다.