서버 보안의 기초가 되는 방화벽. 현재 리눅스에선 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 포트 여는 것을 잊지 마시길 바랍니다.
- 우선 기존 chain 들에 있던 룰 삭제
iptables -F [chain명] 지정 해주지 않을 경우 모든 체인의 설정이 날아갑니다.
- 체인 별 기본 정책 수립
iptables -P [ INPUT / OUTPUT / FORWARD ] [ ACCEPT / DROP ]
- 루프백 허용
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 대역으론 못 가게 함.
방화벽은 서버로 들어오는 공격을 막는 최선이자 최후의 수단입니다. 필요없는 접근을 막는 것이 보안 강화의 지름길입니다.