7장 iptable 예  ---  iptable-firewall.txt

화면확대유틸 --- proshow.zip

마우스위치알려주는 유틸 --- Sonar4Setup.exe

 

 

 

 

###########################################
# 리눅스 방화벽 구축 및 운영 7장 page 397 #
###########################################

#!/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

#  -- infraware 무선IP 대역
$IPTABLES -A INPUT -i eth0 -s 172.16.0.0/12 -j ACCEPT
#  -- infraware 사설IP 대역
#  $IPTABLES -A INPUT -i eth0 -s 192.168.0.0/16 -j ACCEPT
#    -- mq 대역
$IPTABLES -A INPUT -i eth0 -s 224.0.0.0/4 -j ACCEPT
#    -- mq 대역
$IPTABLES -A INPUT -i eth0 -s 240.0.0.0/5 -j ACCEPT
#    -- mq 대역
$IPTABLES -A INPUT -i eth0 -s 248.0.0.0/5 -j ACCEPT
#

# http://wirelessness.wordpress.com/2007/02/02/iptables-and-activemq/
$IPTABLES -A INPUT -i eth0 -s 239.255.2.3 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -d 239.255.2.3 -j ACCEPT

# 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

# josso 웹 서비스를 제공하기 위해 8443번으로 향하는 초기(NEW) 패킷은 허용한다
# 이후 OUTPUT은 모두 허용하였고 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로
# 이 한줄만으로도 웹 서비스가 허용된다

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

# josso 웹 서비스를 제공하기 위해 8080번으로 향하는 초기(NEW) 패킷은 허용한다
# 이후 OUTPUT은 모두 허용하였고 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로
# 이 한줄만으로도 웹 서비스가 허용된다

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

# mq 웹 서비스를 제공하기 위해 61616번으로 향하는 초기(NEW) 패킷은 허용한다
# 이후 OUTPUT은 모두 허용하였고 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로
# 이 한줄만으로도 웹 서비스가 허용된다

$IPTABLES -A INPUT -i eth0 -p TCP --sport 1024: --dport 61616 -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p UDP --sport 1024: --dport 6155: -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p UDP --sport 1024: --dport 6155: -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 서비스를 허용하기 위해 #.#.#.0/24 대역에서 22(#)으로
# 향하는 초기(NEW) 패킷은 허용한다 이후 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로
# 이 한줄만으로 SSH 서비스가 허용된다

#PJW
#$IPTABLES -A INPUT -i eth0 -p TCP -s #.#.#.0/24 --sport 1024: --dport # -m state --state NEW -j ACCEPT

# 특정한 IP 대역에서만 SSH 서비스를 허용하기 위해 #.#.#.0/24 대역에서 22(#)으로
# 향하는 초기(NEW) 패킷은 허용한다 이후 응답 패킷 등은 앞에서 ESTABLISHED로 허용하였으므로
# 이 한줄만으로 SSH 서비스가 허용된다

#PJW
#$IPTABLES -A INPUT -i eth0 -p TCP -s #.#.#.0/24 --sport 1024: --dport # -m state --state NEW -j ACCEPT

# 서버에서 snmpd를 설치하여 cacti등으로 모니터링 할 경우 cacti가 설치된
# 서버에서의 161/udp 트래픽을 허용하여야 한다

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

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

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

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

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

# openldap에서 인증을 처리하기 위해 #/tcp를 허용해야 한다
# openldap에서 패스워드를 바꿔야 하기 위해 #/tcp(usermin)를 허용해야 한다
# webmin을 관리하기 위해 #/tcp를 허용해야한다
# openldap에서 패스워드를 바꿔야 하기 위해 #/udp(usermin)를 허용해야 한다
# webmin을 관리하기 위해 #/udp를 허용해야한다
# josso를 관리하기 위해 8080/tcp를 허용해야 한다
# josso를 관리하기 위해 8443/tcp를 허용해야 한다
# mq를 관리하기 위해서 61616/tcp를 허용해야 한다
# mq를 관리하기 위해서 61613/tcp를 허용해야 한다

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

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

# Windows

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

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

$IPTABLES -A INPUT -p ICMP --icmp-type echo-reply -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p TCP --sport 1024: --dport 61616 -m state --state NEW -j ACCEPT
#PJW
#$IPTABLES -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -s #.#.#.#/24 -j ACCEPT
#PJW
#$IPTABLES -A INPUT -i eth0 -p icmp --icmp-type echo-request -s #.#.#.#/24 -j ACCEPT

#PJW
#$IPTABLES -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -s #.#.#.#/24 -j ACCEPT
#PJW
#$IPTABLES -A INPUT -i eth0 -p icmp --icmp-type echo-request -s #.#.#.#/24 -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