2009. 3. 24. 18:25

FTester를 이용한 방화벽(FireWall) 룰 테스트

홍석범 | 오늘과내일 차장



파이어월을 구축한 후 특정한 패킷을 허용 또는 차단하고자 하는 정책이 정상적으로 작동하는지 확인하기 위해서는 특정 포트로 telnet을 해 보거나 nmap 등으로 포트스캔을 해 보는 것 외에는 별다른 방법이 없는 것이 사실이다.

 

이럴 때 좀더 유용하고 체계적으로 필터링 여부를 확인할 수 있는 방법이 있는데, 바로 파이어월 테스트툴인 FTester라는 프로그램을 이용하는 것이다. 여기서는 Ftester라는 프로그램을 이용하여 필터링 정책을 디버깅할 수 있는 방법에 대해 살펴보도록 하자.

 

FTester는 Firewall Tester라는 의미로 홈페이지

 

(http://dev.inversepath.com/trac/ftester/)에서 소스와 설명서 등을 제공하고 있는데, 소스는 perl 스크립트로 이루어져 있으므로 쉽게 설치할 수 있다.

 

FTester는 다음과 같이 3개의 perl 스크립트로 이뤄져 있다.

 

       - ftest : ftest.conf 파일에서 정의한 대로 또는 별도의 옵션을 주어 임의의 패킷을 생성하는 역할을 한다. 따라서 만약 파이어월에서 들어오는(inbound) 트래픽을 잘 차단하는지 확인하려면 외부에서 이 스크립트를 실행하면 되고, 파이어월 내부에서 나가는(outbound) 트래픽이 제대로 차단되는지 확인하려면 파이어월 내부에서 외부로 이 스크립트를 실행하면 된다.즉, ftest는 일종의 패킷생성 프로그램이라고 생각하면 된다

 

      - ftestd : 이 스크립트는 파이어월 내부 또는 외부에 있는 서버에서 실행될 스크립트로 ftest에서 생성한 패킷 중 파이어월을 통과하여 보이는 패킷을 저장하는 역할을 한다.따라서 이 스크립트는 파이어월을 기준으로 ftest가 실행되는 서버와 반대편의 서버에서 실행하여야 한다. 즉, 패킷 sniffer라고 생각하면 된다.

 

      - freport : 앞에서 살펴본 두 스크립트는 어떤 패킷을 생성하였는지 그리고 파이어월을통과하여 어떠한 패킷을 수신 하였는지 등에 대한 로그를 파일에 저장하게 된다.따라서 freport라는 스크립트를 이용하면 두 로그를 비교함으로써 어떤 패킷이 필터링되고 어떤 패킷이 통과되었는지 알게 되는 것이다.

 

이제 본격적으로 FTester를 사용해 보자. 이 프로그램이 정상적으로 작동하려면 패킷캡처와 생성을 위해 몇 개의 모듈을 추가로 설치해야 하는데, 먼저 각각의 서버에서 다음과 같이 설치하면 된다.

 

# perl -MCPAN -e shell

cpan> install Net::RawIP

cpan> install Net::PcapUtils

cpan> install NetPacket

 

만약 설치가 잘 안 되면 http://search.cpan.org/에서 각각 Net::RawIP, Net::PcapUtils,  Net::NetPacket으로 검색해 소스를 다운로드 후 설치해도 된다.

 

이후 ftester 프로그램을 설치한다. 설치 방법은 매우 쉬운데, 단지 홈페이지에서 소스를 다운로드한 후 압축을 해제하기만 하면 된다. 압축 해제된 디렉토리에는 생성할 패킷을 정의하는 ftest.conf 라는 설정 파일이 있는데, tcp나 udp의 경우 형식은 다음과 같다.


소스주소:소스포트:목적지주소:목적지포트:Flag:프로토콜:tos

 

주소를 적을 때 단일한 IP가 아닌 IP 대역인 경우 192.168.0.1-255와 같이 표현해도 되고, 또는 192.168.3.128/25와 같이 CIDR 형식으로 써도 된다. 포트 번호 역시 1024-65535와 같은 형식으로 지정하면 된다.

 

tcp-flag로는 S, A, P, U, R, F 등이 가능한데, 각각 SYN, ACK, PSH, URG, RST, FIN을 뜻하는 것이다. 그리고 프로토콜은 tcp인지 udp인지 지정하면 되고, 마지막의 tos는 IP 헤더의 tos값을 지정하면 된다. 

 

icmp인 경우에는 다음과 같이 지정한다.

 

소스주소::목적지주소::ICMP:타입(type):코드(code)

 

앞에서 살펴본 tcp나 udp와는 달리 포트 번호와 flag가 빠진 것을 알 수 있을 것이다.

 

왜냐하면 tcp나 udp는 포트 번호로 서비스를 구분하지만, icmp는 타입과 코드로 구분하기 때문이다. 타입과 코드는 40여 가지가 넘는데, 이를테면 ping(echo request)의 경우 icmp type 8이고, pong(echo reply)은 타입이 0이다. icmp 타입과 코드에 대해서는 다음의 주소를 참고하기 바란다. 

http://www.iana.org/assignments/icmp-parameters
 
이제 몇 가지 예를 살펴보도록 하자.

 

- 192.168.0.10:1024:10.1.7.1:80:S:TCP:0

 

192.168.0.10에서 10.1.7.1의 80번 포트를 향하는 SYN 패킷을 뜻한다.

 

- 192.168.0.10:20:10.1.7.1:1022:AP:TCP:22

 

10.1.7.1의 1022번으로 향하는 PSH,ACK 패킷을 뜻한다.

 

- 192.168.0.10:53:10.1.7.1:53::UDP:0

 

10.1.7.1로 향하는 53/UDP패킷을 뜻한다.

 

- 192.168.0.10::10.1.7.1:::ICMP:3:5

 

10.1.7.1로 향하는 ICMP 타입 3 코드 5 패킷을 뜻한다.

 

- 192.168.0.1:1-1024:10.7.0.1:20-25:S:TCP:22

 

앞서 IP 주소와 포트 번호도 각각 범위를 지정할 수 있다고 설명했다. 따라서 소스 포트가 1부터 1024까지, 그리고 목적지 포트가 20번부터 25번까지의 SYN 패킷을 뜻한다.

 

그럼, 이제 다음과 같은 네트워크 구성이라고 가정하고, 실제로 ftester를 테스트해 보자.

 

여기서 호스트 A는 파이어월 외부에서 임의의 패킷을 생성할 서버고, 호스트 B는 NAT 파이어월 내부에 있는 서버다. 호스트 A, B는 모두 리눅스 기반의 서버라고 가정하자.
 

먼저 호스트 A에서 다음과 같은 ftest.conf 파일을 정의한다. 이는 211.47.64.210의 1000번부터 1100번 사이의 포트에 대한 tcp 패킷을 생성한다는 의미이다.
 
# ftest.conf

 

192.168.43.75:1025:211.47.64.210:1000-1100:S:TCP:0

 

먼저 패킷이 통과하는지 여부를 모니터링할 호스트 B에서 다음과 같이 실행해 대기하도록 하자. 이는 eth0 인터페이스에 리슨하고 -v는 자세하게 결과 값을 보여준다는 의미이다.  

 

[root@hostb]# ./ftestd -i eth0 -v

 

이제 준비가 되었으면 호스트 A에서 다음과 같이 실행해 패킷을 생성해 보도록 하자.

 

다음과 같이 생성되는 패킷이 보여지게 된다.

 

[root@hosta]# ./ftest -f ftest.conf -v -d 0.01

 

1 - 192.168.43.75:1025 > 211.47.64.209:1000 S TCP 0


2 - 192.168.43.75:1025 > 211.47.64.209:1001 S TCP 0

 

3 - 192.168.43.75:1025 > 211.47.64.209:1002 S TCP 0


4 - 192.168.43.75:1025 > 211.47.64.209:1003 S TCP 0


5 - 192.168.43.75:1025 > 211.47.64.209:1004 S TCP 0


6 - 192.168.43.75:1025 > 211.47.64.209:1005 S TCP 0


7 - 192.168.43.75:1025 > 211.47.64.209:1006 S TCP 0


8 - 192.168.43.75:1025 > 211.47.64.209:1007 S TCP 0


......

 

호스트 B에서도 비슷한 화면이 나타날 것이다.

 

잠시 후 패킷 생성이 완료되면 각각의 서버에는 ftest.log와 ftestd.log 파일이 생성되는데, 호스트 A에 생성된 ftest.log 파일을 B로 복사한 후 다음과 같이 실행해 보기 바란다.

 

[root@hostb]# ./freport ftest.log ftestd.log

 

Authorized packets:

-------------------


Modified packets (probably NAT):

--------------------------------

 

2 - 192.168.43.75:1025 > 211.47.64.210:5001 S TCP 0

 

3 - 192.168.43.75:1025 > 211.47.64.210:5002 S TCP 0


                              >>>>>>>>

 

2 - 192.168.43.75:1025 > 172.16.0.28:1001 S TCP 0


3 - 192.168.43.75:1025 > 172.16.0.28:1002 S TCP 0

 

Filtered or dropped packets:

----------------------------

 

1 - 192.168.43.75:1025 > 211.47.64.210:1000 S TCP 0

 

4 - 192.168.43.75:1025 > 211.47.64.210:1003 S TCP 0

 

5 - 192.168.43.75:1025 > 211.47.64.210:1004 S TCP 0


6 - 192.168.43.75:1025 > 211.47.64.210:1005 S TCP 0


7 - 192.168.43.75:1025 > 211.47.64.210:1006 S TCP 0


8 - 192.168.43.75:1025 > 211.47.64.210:1007 S TCP 0


9 - 192.168.43.75:1025 > 211.47.64.210:1008 S TCP 0


10 - 192.168.43.75:1025 > 211.47.64.210:1009 S TCP 0


11 - 192.168.43.75:1025 > 211.47.64.210:1010 S TCP 0


12 - 192.168.43.75:1025 > 211.47.64.210:1011 S TCP 0
..................

 

현재의 테스트에서는 NAT로 구성된 환경이므로 Modified packets(probably NAT) 부분이 보이며, 실제로 NAT된 시스템의 1001과 1002번 포트가 외부에 허용돼 있어 접근할 수 있는 상태임을 알 수 있다. 그리고 그 다음으로 차단된 패킷들이 보여지고 있다.

 

만약, 파이어월이 NAT가 아닌 TP모드(브리지 모드)인 경우에는 Authorized packets: 부분에 허용된 패킷들이 보여질 것이다.

만약 위조된 패킷, 이를테면 소스 IP가 현재 서버의 인터페이스에 할당된 IP가 아닌 10.10.10.10과 같이 임의의 IP를 생성해 테스트하고자 한다면 어떻게 해야 할까. ftest는 현재 인터페이스에 할당된 IP를 소스로 하므로, 이 경우에는 다음과 같이 ftest를 실행할 서버의 lo:0이나 eth0:0 등에 임의의 IP를 생성한 후 실행하면 될 것이다.

 

# ifconfig lo:0 10.10.10.10

 

ftest는 이외에도 다양한 옵션을 제공하고 있으며, 부가적으로 최근 버전에서는 IDS에 대한 탐지 기능도 제공하고 있으니 자세한 내용은 홈페이지를 참고하기 바란다.

 

파이어월을 설치하는 것도 중요하지만, 설치 자체보다 중요한 것은 정책에 따라 규칙을 정확하게 설정하는 것이. 파이어월을 설치한 후 정책 오류로 허용하지 말아야 할 서비스까지 허용한다면, 설치 자체의 의미가 없어지거나 그 효과가 반감되기 때문이다.

 

따라서 규칙을 설정한 후에 점검하는 것은 물론, ftester와 같은 전용 프로그램을 이용해 의도한대로 패킷이 필터링되고 있는지 확인하는 것도 중요하다.


Trackback 0 Comment 0