하도 머리가 복잡해 예전 기술문서 살펴보다가 도움이 될 만한 문서가 있어서 올려 봅니다.
지금 보니 머리가 더욱 복잡해지네요 ㅎ
-----------------------------------------------------------------------------------------------------------------
############################################################
# 다음의 문서는 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
-----------------------------------------------------------------------------------------------------------------