본문 바로가기
승환이의 IT 이야기/iptables

Project iptables - Ubuntu

by Baci_Lao 2014. 1. 3.

하도 머리가 복잡해 예전 기술문서 살펴보다가 도움이 될 만한 문서가 있어서 올려 봅니다. 


지금 보니 머리가 더욱 복잡해지네요 ㅎ 


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




############################################################

# 다음의 문서는 Ubuntu 기반으로 작성하였습니다.

# TMS_Project iptables

# 작성자 : 이승환

# 작성일 : 2009 09 10일 목요일

# 최종 수정일 : 2009 09 10일 목요일

# 이메일 : lucifertear@gmail.com

############################################################

 

#!/bin/sh

 

# iptables 실행 파일의 경로를 정의 한다

IPTABLES="/sbin/iptables"

 

# 기존 설정되어 있는 룰을 모두 초기화 한다

$IPTABLES -F

 

# standalone 형태이므로 INPUT은 기본적으로 DROP한다

# FORWARD는 사용할 필요가 없으므로 역시 기본 정책으로 DROP한다

# 하지만 룰을 단순화 하기 위해 OUTPUT ACCEPT한다 어쨌든 INPUT에서는

# 기본적으로 DROP 하였으므로 OUTPUT에서 허용을 해도 관계없다

 

$IPTABLES -P INPUT DROP

$IPTABLES -P FORWARD DROP

$IPTABLES -P OUTPUT ACCEPT

 

# 내부 트래픽인 루프백 트래픽은 허용한다

 

$IPTABLES -A INPUT -i lo -j ACCEPT

$IPTABLES -A OUTPUT -o lo -j ACCEPT

 

# INPUT chain에서 필터링을 설정한다

# RFC 1918에 정의된 사설 IP 및 공인 네트워크에서 라우팅 될 수 없는 IP 대역을 소스로

# 한 패킷이 서버를 향하는 패킷을 차단한다 라우터가 있다면 라우터에서 차단하는 것도

# 좋은 방법이며 인터페이스로 eth0만 사용한다면 아래와 같이 인터페이스는 지정하지 않아도

# 된다

 

$IPTABLES -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP

$IPTABLES -A INPUT -i eth0 -s 255.255.255.255/32 -j DROP

$IPTABLES -A INPUT -i eth0 -s 0.0.0.0/8 -j DROP

$IPTABLES -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP

$IPTABLES -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP

$IPTABLES -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP

$IPTABLES -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP

$IPTABLES -A INPUT -i eth0 -s 240.0.0.0/5 -j DROP

$IPTABLES -A INPUT -i eth0 -s 248.0.0.0/5 -j DROP

 

# OUTPUT chain에서 필터링 설정한다

# RFC 1918에 정의된 사설IP 및 공인 네트워크에서 라우팅 될 수 없는 IP 대역을 목적지로 한

# 패킷이 서버에서 외부 네트워크로 나가는 것을 차단한다 FORWARD는 어떠한 트래픽도

# 허용하지 않았으므로 별도로 지정할 필요가 없다

 

$IPTABLES -A OUTPUT -d 10.0.0.0/8 -j DROP

$IPTABLES -A OUTPUT -d 255.255.255.255/32 -j DROP

$IPTABLES -A OUTPUT -d 0.0.0.0/8 -j DROP

$IPTABLES -A OUTPUT -d 169.254.0.0/16 -j DROP

$IPTABLES -A OUTPUT -d 172.16.0.0/12 -j DROP

$IPTABLES -A OUTPUT -d 192.168.0.0/16 -j DROP

$IPTABLES -A OUTPUT -d 224.0.0.0/4 -j DROP

$IPTABLES -A OUTPUT -d 240.0.0.0/5 -j DROP

$IPTABLES -A OUTPUT -d 248.0.0.0/5 -j DROP

 

# 이미 세션을 맺어 상태추적 테이블 목록에 있는 ESTABLISHED, RELATED 패킷은 허용한다

# 이 룰을 앞쪽에 설정하면 할수록 이미 허용된 트래픽에 대해 불필요하게 각 패킷마다 일일이

# 룰을 매칭하지 않으므로 방화벽의 성능을 높일 수 있다

 

$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

 

# 서버를 향해 들어오는 패킷 중 포트 스캔이라 의심되는 패킷이 있을 경우 해당 정보를

# 1분에 1개꼴로 로그에 남기도록 한다 psd 사용 시 정상접속도 필터링 되어 느릴 수 있다

 

$IPTABLES -A INPUT -m psd -m limit --limit 1/minute -j LOG

 

# 로그에 남긴 이후에는 포트 스캔 패킷을 차단한다

 

$IPTABLES -A INPUT -m psd -j DROP

 

# 방화벽을 향해 들어오는 tcp 패킷 중 상태추적 테이블에는 NEW이면서 syn 비트를 달지

# 않고 들어오는 패킷은 차단한다 tcp 패킷 중 상태추적 테이블에 NEW라면 반드시 syn 비트가

# 설정된 패킷이어야 할것이며 이외의 패킷은 모두 위조된 패킷이므로 차단한다

 

$IPTABLES -A INPUT -i eth0 -p TCP ! --syn -m state --state NEW -j DROP

 

# 상태추적 테이블에서 INVALID인 패킷은 차단한다

# -p ALL로 설정하면 tcp, udp, icmp 등 모든 프로토콜에 해당한다

 

$IPTABLES -A INPUT -i eth0 -p ALL -m state --state INVALID -j DROP

 

# 이번에는 tcp-flag에 대한 설정으로 포트스캔 등에 민감하지 않다면 설정하지 않아도 된다

# NMAP등을 이용한 FIN/URG/PSH 스캔을 차단하기 위해 모든 비트를 살펴보아

# FIN,URG,PSH가 설정된 패킷은 1분에 5개 비율로 로그에 남긴 후 차단하도록 한다

# 로그를 남길 때는 로그 정보의 앞에 "NMAP-XMAS:"가 추가되도록 한다

 

$IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit 5/minute -j LOG --log-prefix "NMAP-XMAS:"

$IPTABLES -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

 

# tcp 패킷 중 SYN FIN 비트를 살펴보아 SYN FIN비트가 함께 설정된 패킷은

# 비정상이므로 차단한다

 

$IPTABLES -A INPUT -p TCP --tcp-flags SYN,FIN SYN,FIN -j DROP

 

# tcp 패킷 중 SYN RST 비트를 살펴보아 SYN RST비트가 함께 설정된 패킷은

# 차단한다

 

$IPTABLES -A INPUT -p TCP --tcp-flags SYN,RST SYN,RST -j DROP

 

# tcp 패킷 중 FIN RST 비트를 살펴보아 FIN RST비트가 함께 설정된 패킷은 차단한다

 

$IPTABLES -A INPUT -p TCP --tcp-flags FIN,RST FIN,RST -j DROP

 

# tcp 패킷 중 ACK FIN 비트를 살펴보아 ACK는 설정되지 않고 FIN 비트만 설정된

# 패킷은 차단한다

 

$IPTABLES -A INPUT -p TCP --tcp-flags ACK,FIN FIN -j DROP

 

# tcp 패킷 중 ACK PSH 비트를 살펴보아 ACK는 설정되지 않고 PSH 비트만 설정된

# 패킷은 차단한다

 

$IPTABLES -A INPUT -p TCP --tcp-flags ACK,PSH PSH -j DROP

 

# tcp 패킷 중 ACK URG 비트를 살펴보아 ACK는 설정되지 않고 URG 비트만 설정된

# 패킷은 차단한다

 

$IPTABLES -A INPUT -p TCP --tcp-flags ACK,URG URG -j DROP

 

# tcp 패킷 중 모든 비트를 살펴보아 다른 비트는 설정되지 않고 FIN 비트만 설정된

# 패킷은 차단한다

 

$IPTABLES -A INPUT -p TCP --tcp-flags ALL FIN -j DROP

 

# tcp 패킷 중 모든 비트를 살펴보아 아무런 비트도 설정되지 않은 패킷은 차단한다

 

$IPTABLES -A INPUT -p TCP --tcp-flags ALL NONE -j DROP

 

# tcp 패킷 중 모든 비트를 살펴보아 다른 비트는 설정되지 않고 PSH FIN 비트만 설정

# 된 패킷은 차단한다

 

$IPTABLES -A INPUT -p TCP --tcp-flags ALL PSH,FIN -j DROP

 

# 웹 서비스를 제공하기 위해 80번으로 향하는 초기(NEW) 패킷은 허용한다

# 이후 OUTPUT은 모두 허용하였고 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로

# 이 한줄만으로도 웹 서비스가 허용된다

 

$IPTABLES -A INPUT -i eth0 -p TCP --sport 1024: --dport 80 -m state --state NEW -j ACCEPT

 

# 웹 서비스를 제공하기 위해 443번으로 향하는 초기(NEW) 패킷은 허용한다

# 이후 OUTPUT은 모두 허용하였고 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로

# 이 한줄만으로도 웹 서비스가 허용된다

 

$IPTABLES -A INPUT -i eth0 -p TCP --sport 1024: --dport 443 -m state --state NEW -j ACCEPT

 

# ntop을 제공하기 위해 3000번으로 향하는 초기(NEW) 패킷은 허용한다

# 이후 OUTPUT은 모두 허용하였고 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로

# 이 한줄만으로도 ntop 허용된다

 

$IPTABLES -A INPUT -i eth0 -p TCP --sport 1024: --dport 3000 -m state --state NEW -j ACCEPT

 

# 특정한 IP 대역에서만 SSH 서비스를 허용하기 위해 211.45.70.0/24 대역에서 22(1997)으로

# 향하는 초기(NEW) 패킷은 허용한다 이후 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로

# 이 한줄만으로 SSH 서비스가 허용된다

 

$IPTABLES -A INPUT -i eth0 -p TCP -s 211.45.70.0/24 --sport 1024: --dport 1997 -m state --state NEW -j ACCEPT

 

# 특정한 IP 대역에서만 SSH 서비스를 허용하기 위해 61.96.206.0/24 대역에서 22(1997)으로

# 향하는 초기(NEW) 패킷은 허용한다 이후 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로

# 이 한줄만으로 SSH 서비스가 허용된다

 

$IPTABLES -A INPUT -i eth0 -p TCP -s 61.96.206.0/24 --sport 1024: --dport 1997 -m state --state NEW

-j ACCEPT

 

# 서버에서 snmpd를 설치하여 cacti등으로 모니터링 할 경우 cacti가 설치된

# 서버에서의 161/udp 트래픽을 허용하여야 한다

 

$IPTABLES -A INPUT -i eth0 -p UDP -s 211.45.70.80 --sport 1024: --dport 161 -m state --state NEW -j ACCEPT

 

# 서버에서 RSYNC를 설치하여 backup을 할 경우 backup 서버에서의 873/tcp 트래픽을 허용하여야 한다

 

$IPTABLES -A INPUT -i eth0 -p TCP -s 61.96.206.66 --sport 1024: --dport 873 -m state --state NEW -j ACCEPT

 

# 서버에서 로그 수집을 위하여 remotelog를 할 경우 log 서버에서의 514/udp 트래픽을 허용하여야 한다

 

$IPTABLES -A INPUT -i eth0 -p UDP -s 211.45.70.80 --sport 1024: --dport 514 -m state --state NEW -j ACCEPT

 

# openldap에서 인증을 처리하기 위해 389/tcp를 허용해야 한다

# openldap에서 패스워드를 바꿔야 하기 위해 20000/tcp(usermin)를 허용해야 한다

# webmin을 관리하기 위해 2009/tcp를 허용해야한다

# openldap에서 패스워드를 바꿔야 하기 위해 20000/udp(usermin)를 허용해야 한다

# webmin을 관리하기 위해 2009/udp를 허용해야한다

# josso를 관리하기 위해 8080/tcp를 허용해야 한다

# josso를 관리하기 위해 8443/tcp를 허용해야 한다

 

# 외부에서 서버로 traceroute를 허용해야 한다

 

$IPTABLES -A INPUT -m state --state NEW -p udp --dport 33434:38000 -j ACCEPT

 

# icmp 패킷 중 ping 요청에 대한 응답 즉, echo-reply를 허용한다

 

$IPTABLES -A INPUT -p ICMP --icmp-type echo-reply -j ACCEPT

 

# icmp 패킷 중 network-unreachable을 허용한다 서비스거부로 악용될 수 있으므로

# limit를 지정하여 초당 1회씩만 허용한다

 

$IPTABLES -A INPUT -p ICMP --icmp-type network-unreachable -m limit --limit 1/s --limit-burst 5 -j ACCEPT

 

# icmp 패킷 중 host-unreachable을 허용한다 서비스거부로 악용될 수 있으므로

# limit를 지정하여 초당 1회씩만 허용한다

 

$IPTABLES -A INPUT -p ICMP --icmp-type host-unreachable -m limit --limit 1/s --limit-burst 5 -j ACCEPT

 

# icmp 패킷 중 port-unreachable을 허용한다 서비스거부로 악용될 수 있으므로

# limit를 지정하여 초당 1회씩만 허용한다

 

$IPTABLES -A INPUT -p ICMP --icmp-type port-unreachable -m limit --limit 1/s --limit-burst 5 -j ACCEPT

 

# icmp 패킷 중 fragmentation-needed을 허용한다 서비스거부로 악용될 수 있으므로

# limit를 지정하여 초당 1회씩만 허용한다

 

$IPTABLES -A INPUT -p ICMP --icmp-type fragmentation-needed -m limit --limit 1/s --limit-burst 5 -j ACCEPT

 

# icmp 패킷 중 time-exceeded을 허용한다 서비스거부로 악용될 수 있으므로

# limit를 지정하여 초당 1회씩만 허용한다

 

$IPTABLES -A INPUT -p ICMP --icmp-type time-exceeded -m limit --limit 1/s --limit-burst 5 -j ACCEPT

 

# tcp 패킷 중 identd (113/tcp) 서비스를 향하는 패킷은 거부하되 DROP 하지 말고

# RST 비트를 설정하여 REJECT로 응답하도록 한다

 

$IPTABLES -A INPUT -p TCP --syn --dport 113 -j REJECT --reject-with tcp-reset

 

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