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 뿐만 아니라 다른 부분에서도 유용할 수 있으니 알아두면 유익할 것이다. :-)

댓글 없음:

댓글 쓰기