iptables 의 기초

| 2017년 9월 30일 | 0 Comments

서버 보안의 기초가 되는 방화벽. 현재 리눅스에선 centos 7 이후에 적용되는 firewalld를 제외하곤 기본적으로 iptables를 많이 사용하고 있습니다. 하지만 실제로 윈도우 방화벽처럼 UI가 제공되지 않아 어렵게 생각하실 수도 있습니다. 이 글에서는 명령어를 통해 간단한 iptables 설정하는 법을 알아보겠습니다. 기존에 있는 방화벽 설정 하나를 예시로 보겠습니다.

 

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
RH-Firewall-1-INPUT  all  —  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
RH-Firewall-1-INPUT  all  —  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain RH-Firewall-1-INPUT (2 references)
target     prot opt source               destination         
ACCEPT     all  —  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp —  0.0.0.0/0            0.0.0.0/0           icmp type 255
ACCEPT     all  —  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:20
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:21
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:25
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:110
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:143
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
ACCEPT     tcp  —  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpts:50001:50005
REJECT     all  —  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

먼저 iptables 의 구조와 작동 방식에 대해 알아보겠습니다.

1. 패킷이 들어오면 INPUT, 나가는 경우에는 OUTPUT에서 위에서 부터 순차적으로 룰과 비교해보고 일치 할 경우 ACCEPT, DROP 등의 작업을 수행합니다.

2. 작업이 수행 된 패킷에 대해서는 더 이상 검사하지 않으며 작업 결과 처리를 진행합니다.

 

3. 패킷이 체인의 모든 룰과 매치되지 않아 규칙의 바닥에 도달하면 정해진 기본 정책이 수행됩니다.

4. 기본 정책은 policy ACCEPT , policy DROP 으로 설정할 수 있다

 

iptables의 경우 Chain 단위로 설정 구성이 가능합니다. 체인은 하나의 그룹이라고 볼 수 있는데요, 체인 내에 룰을 넣어줄 수가 있습니다. 위의 설정을 보시면 iptables에서 기본으로 인식하는 INPUT, OUTPUT, FORWARD가 있고 추가로 RH-Fierwall-1-INPUT 이라는 체인이 있습니다.

INPUT – 호스트로 들어오는 패킷에 대한 체인

OUTPUT – 호스트에서 나가는 패킷에 대한 체인

FORWARD – 호스트를 지나가는 패킷들에 대한 체인 ( 라우터 혹은 방화벽으로 이용할 경우)

그 외에는 전부 사용자가 만들어 내는 체인입니다. 체인은 체인 내에 적용도 가능 합니다. 위에 INPUT을 보시면 RH 체인이 들어가 있는 것이 보입니다. 이처럼 체인 하나를 이용하여 IN 과 OUT 모두 적용도 가능하며 INPUT OUTPUT을 따로 수정할 필요 없이 체인만 수정하면 두 개 다 모두 변경이 적용되기 때문에 적용할 룰이 많다면 체인에 적용하는 것이 운영하기 더 편할 것입니다.

 

iptables 명령어를 통해 간단한 룰셋 적용을 해보도록 하겠습니다. 해당 작업을 진행하기 전 주의 사항으로는 ssh 접속을 하여 작업을 진행할 경우 sshd의 포트를 개방하지 않고 iptables를 재시작 할 경우

원격 접속이 끊길 수 있으므로, 콘솔 상에서 작업하는 것을 추천하며, 여의치 않을 경우 sshd 포트 여는 것을 잊지 마시길 바랍니다.

  1. 우선 기존 chain 들에 있던 룰 삭제

    iptables -F [chain명]     지정 해주지 않을 경우 모든 체인의 설정이 날아갑니다.

  2. 체인 별 기본 정책 수립

    iptables -P [ INPUT / OUTPUT / FORWARD ] [ ACCEPT / DROP ]

  3. 루프백 허용

    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o -lo -j ACCEPT

이후 필요한 룰은 등록해주시면 됩니다.

 

iptables 명령 
-A : 새로운 규칙을 추가한다. 
-D : 규칙을 삭제한다. 
-C : 패킷을 테스트한다. 
-I : 새로운 규칙을 삽입한다. 
-R : 새로운 규칙으로 교체한다. 
-L : 새로운 규칙을 출력한다. 
-F : 체인의 모든 규칙을 삭제한다. 
-Z : 모든 체인의 패킷과 바이트 카운터 값을 0으로 만든다. 
-N : 새로운 체인을 만든다. 
-X : 체인을 삭제한다. 
-P : 기본 정책을 변경한다. 

iptables 옵션 
-p : 패킷의 프로토콜의 포트번호 또는 이름을 명시한다. ( tcp , udp , icmp ..)
-s : 패킷의 발신지를 명시한다.
-d : 패킷의 도착지를 명시한다.                                                       
–sport : 패킷의 발신 포트를 명시한다.
–dport : 패킷의 도착 포트를 명시한다.
-i : 규칙을 적용할 인터페이스 이름을 명시한다. (ex : eth0, eth1) 
-j : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다. [ ACCEPT / DROP / LOG / REJECT ]
-y : 접속 요청 패킷인 SYN 패킷을 허용하지 않는다. 
-f : 두 번째 이후의 조각에 대해 규칙을 명시한다. 

 

주의 : -s -d –sport –dport의 경우 명시하지 않으면 any로 인식하게 된다.

추가 : DROP 과 REJECT의 차이

  • DROP : 패킷을 그냥 차단함
  • REJECT : 패킷을 차단하며 차단 되었다는 응답을 발신지로 보내줌

ex)

iptables -A INPUT -p tcp -s 192.168.9.0/24 -dport 80 -i eth0 -j ACCEPT

= 192.168.9.0/24 에서 eth0를 타고 tcp 80번 포트로 들어오는 모든 패킷을 허용한다.

= 해당 대역에 대해 eth0로 들어오는 웹서버 요청을 허용한다.

 

iptables -A OUTPUT -udp –sport 53 -d 192.168.10.0/24 -j DROP

= udp 53번 포트에서 192.168.10.0/24 대역으로 가는 모든 패킷을 차단

= 해당 서버의 dns 질의 응답을 192.168.10.0/24 대역으론 못 가게 함.

 

방화벽은 서버로 들어오는 공격을 막는 최선이자 최후의 수단입니다. 필요없는 접근을 막는 것이 보안 강화의 지름길입니다.

Category: LINUX, 네트워크/관제, 보안

윤 황용

About the Author ()