더북(TheBook)

iptables 다루기

리눅스에서는 iptables 도구를 이용해서 패킷을 제어합니다. iptables의 제어 규칙을 정의하는 기본 단위를 사슬Chain이라고 하며 특정한 정책에 따라 사슬을 모아 테이블로 정의합니다. 리눅스 서버를 통과하는 패킷은 사용자가 정의해둔 테이블과 사슬의 영향을 받아 제어됩니다. iptables의 기본 테이블로 filter, nat, mangle이 있지만 사용자가 필요에 따라 테이블을 추가하거나 삭제할 수 있습니다.

Tip

iptables 명령은 NetworkManager 패키지와 충돌 가능성이 있습니다. 게이트웨이 장치에서 NetworkManager 패키지가 설치되어 있다면 2장의 ‘네트워크 설정하기’에서 설명하는대로 삭제해둡니다.

매스커레이드 설정을 해보겠습니다. -L 옵션은 사슬에 정의되어 있는 규칙을 보여줍니다. 패킷의 주소 변환 규칙을 정의하는 nat 테이블(-t nat)에는 PREROUTING 사슬과 POSTROUTING 사슬을 확인할 수 있습니다. PREROUTING 사슬은 패킷이 리눅스 서버에 전달되기 전 규칙을 정의하고, POSTROUTING 사슬은 리눅스 서버에서 나가는 규칙을 정의합니다. 아직 사슬에 정의된 규칙은 존재하지 않습니다.

administrator@test05:~$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
Tip

iptables로 패킷 제어 규칙을 확인하거나 정의하는 모든 일은 루트 권한을 요구합니다. sudo가 필요합니다.

IP 주소 매스커레이드는 nat 테이블의 POSTROUTING 사슬에 설정합니다. 외부와 연결된 네트워크 인터페이스 eth0을 거쳐(-o eth0) 리눅스 서버에서 외부로 나가는 패킷에 대해 매스커레이드 규칙(-j MASQUERADE)을 POSTROUTING 사슬에 추가합니다(-A POSTROUTING).

administrator@test05:~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

다시 nat 테이블을 확인하면 POSTROUTING 사슬에서 MASQUERADE 항목을 찾을 수 있습니다. 이 설정 하나로 게이트웨이 장치를 거쳐 외부로 나가는 패킷의 출발지 주소는 게이트웨이 장치에 부여된 공인 IP 주소로 변경됩니다.

administrator@test05:~$ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source              destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source              destination
MASQUERADE all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source              destination

매스커레이드 설정은 이게 전부입니다. 각 게스트에서 외부 네트워크로 연결 상태를 확인해봅니다. 모든 게스트가 게이트웨이 장치인 test05를 통해 인터넷에 접속 가능합니다.

administrator@test01:~$ ping kldp.org

리눅스 서버의 방화벽 기능을 담당하는 filter 테이블을 살펴봅시다. filter 테이블은 패킷을 거르기 위한 규칙을 정의합니다. -t 옵션을 생략하면 iptables는 기본적으로 filter 테이블을 대상으로 규칙을 설정합니다. -L 옵션으로 filter 테이블을 확인하면 INPUT, FORWARD, OUTPUT 사슬에 적용된 규칙을 확인할 수 있습니다. INPUT 사슬과 OUTPUT 사슬은 리눅스 서버로 들어오거나 나가는 규칙을 정의하고 FORWARD 사슬은 리눅스 서버를 거쳐 외부로 나가는 규칙을 정의합니다.

administrator@test05:~$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source             destination

Chain FORWARD (policy ACCEPT)
target     prot opt source             destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source             destination

각 사슬의 기본 정책은 접근을 ACCEPT(허용함)하도록 설정되어 있습니다. 따라서 지금까지 게이트웨이를 오가는 모든 패킷은 아무런 제한이 없이 통과 가능했습니다. 확인을 위해 test02에 원격 접속을 위한 텔넷 서버를 설치( sudo apt-get install telnetd)해보겠습니다.

administrator@test02:~$ sudo apt-get update
administrator@test02:~$ sudo apt-get install telnetd
Tip

텔넷은 네트워크 원격 접속을 위한 프로토콜입니다. 우분투에는 기본적으로 텔넷 클라이언트가 설치되어 있지만 텔넷 서버는 설치되어 있지 않습니다. apt-get 명령으로 텔넷 서버 패키지인 telnetd를 설치합니다.

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