더북(TheBook)

하지만, 이것만으로는 부족합니다. 텔넷 서버에 대한 접속 요청은 허용하지만, 텔넷 서버가 처리한 결과를 다시 클라이언트에게 전송해야 하는데 처리 결과를 전달할 패킷을 허용할 방법이 없기 때문입니다.

여기에서 iptables의 막강한 기능인 상태 기반 패킷 필터링 Stateful Packet Filtering이 등장합니다. 서버/클라이언트 사이에 이미 접속이 이루어졌다면 이후에 주고받는 패킷에 대해서는 자동으로 패킷의 상태를 확인해서 전송을 허용할 수 있습니다. 텔넷 서버에 대한 접속 요청이 전달된 다음에는 패킷의 상태를 확인( -m state)해서, 텔넷 서버에서 클라이언트로 가는 응답 패킷( ESTABLISHED), 텔넷과 관련된 패킷( RELATED)들을 허용( -j ACCEPT)하도록 FORWARD 사슬에 규칙을 정의합니다( -A FORWARD).

administrator@test05:~$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Tip

TCP/IP 통신은 클라이언트와 서버가 서로 접속 요청(syn), 응답(syn ack), 확인(ack), 패킷을 주고받는 과정을 거쳐 시작됩니다. ESTABLISHED는 3단계 접속 절차를 거쳐 접속이 허가된 패킷을 의미하며 RELATED는 해당 접속과 관련 있는 패킷을 의미합니다.

추가로 게이트웨이 장치에서도 인터넷 접속이 가능하려면 외부에서 들어오는 응답 패킷에 대한 접근을 허용해야 합니다. 외부 네트워크와 연결된 네트워크 인터페이스( -i eth0)로 들어오는 패킷의 상태를 확인( -m state)한 다음, 요청에 대한 응답 패킷( ESTABLISHED)과 관련 패킷( RELATED)을 허용( -j ACCEPT)하도록 INPUT 사슬에 규칙을 정의합니다( -A INPUT). 조금 복잡하지만, 하나하나 보면 이해가 될 것입니다.

administrator@test05:~$ sudo iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

지금까지 정의한 filter 테이블의 규칙을 확인해봅시다. 이젠 test03과 test04에서도 test05를 거쳐 test02의 텔넷 서버에 접속할 수 있습니다. 이렇게 iptables만 잘 이용하면 꽤 복잡한 방화벽 규칙을 사용자가 직접 설정해서 활용하는 것도 가능합니다.

필터링 규칙은 순서가 매우 중요합니다. iptables로 정의한 순서에 따라 규칙이 적용되기 때문입니다. 예를 들어 10.0.0.0/24에서 들어오는 모든 패킷을 제한하도록 정의한 다음 10.0.0.1에서 들어오는 패킷을 허용하도록 정의하면, 뒤에 추가한 규칙은 무시됩니다. -A 옵션 대신 -I 옵션으로 규칙을 정의하면 그 규칙은 위로 삽입되기 때문에 순서를 변경할 수 있습니다.

administrator@test05:~$ sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source              destination
ACCEPT     all -- anywhere              anywhere
ACCEPT     all -- anywhere              anywhere
ACCEPT     all -- anywhere              anywhere                state RELATED,ESTABLISHED

Chain FORWARD (policy DROP)
target     prot opt source              destination
ACCEPT     all -- anywhere              anywhere
ACCEPT     all -- anywhere              anywhere
ACCEPT     tcp -- anywhere              10.0.0.2                tcp dpt:telnet
ACCEPT     all -- anywhere              anywhere state          RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source              destination

이제 test03과 test04에서도 test02(10.0.0.2)의 텔넷 서버에 접속 가능해야 합니다.

administrator@test03:~$ telnet 10.0.0.2
Trying 10.0.0.2...
Connected to 10.0.0.2.
Escape character is '^]'.
Ubuntu 12.04.3 LTS
test02 login:
Tip

실제 가정용 네트워크 공유기, 네트워크 라우터 장치 또한 iptables와 같은 도구를 이용해서 패킷을 제어합니다. IP 매스커레이드와 패킷 필터링 이러한 장치들의 핵심 기능입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.