[보안] iptables 예제 -2
#!/bin/sh
# http://woogi.org
# 이 설정은 김정균님의 iptables 의 내용을 기초로 하여 작성된 것입니다.
# iptables Path
iptables=/sbin/iptables
# 모듈 올리기
modprobe iptable_filter
#/sbin/depmod -a
#/sbin/insmod ip_tables
#/sbin/insmod ip_conntrack
#/sbin/insmod ip_conntrack_ftp
#/sbin/insmod iptable_nat
#/sbin/insmod ip_nat_ftp
# SERVER IP 받아오기.
HOST_IP=”`/sbin/ifconfig eth0 | grep ‘inet addr’ | awk ‘{print $2}’ | sed \\
-e ‘s/.*://’`”
NETMASK=”`/sbin/ifconfig eth0 | grep ‘inet addr’ | awk ‘{print $4}’ | cut -d : \\
-f 2`”
# INPUT Rules 설정
$iptables -Z INPUT
$iptables -P INPUT ACCEPT
$iptables -F INPUT
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A INPUT -s $HOST_IP/$NETMASK -j ACCEPT
# 알 수 없는 패킷 즉, NETWORK 상태가 INVALID 인 패킷들을 막아 버린다.
# 정상적인 접근에서는 나올 수 없는 상태이다.
$iptables -A INPUT -m state –state INVALID -j DROP
$iptables -A OUTPUT -m state –state INVALID -j DROP
# Nimda, CodeRed 등의 바이러스 문자열 차단.
#$iptables -A INPUT -p tcp –tcp-flags ACK ACK –dport 80 -m string \\
–string “/default.ida?” -j REJECT –reject-with tcp-reset
#$iptables -A INPUT -p tcp –tcp-flags ACK ACK –dport 80 -m string \\
–string “XXXXXXXX” -j REJECT –reject-with tcp-reset
#$iptables -A INPUT -p tcp –tcp-flags ACK ACK –dport 80 -m string \\
–string “cmd.exe” -j REJECT –reject-with tcp-reset
#$iptables -A INPUT -p tcp –tcp-flags ACK ACK –dport 80 -m string \\
–string “root.exe?” -j REJECT –reject-with tcp-reset
# 외부 서비스를 위한 설정. / TCP service
#$iptables -A INPUT -p tcp –sport 20 -m state –state ESTABLISHED,RELATED -j \\
ACCEPT
#$iptables -A INPUT -i eth0 -p tcp –sport 1024:65535 –dport 1024:65535 -m state \\
–state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 21 -m state –state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 23 -m state –state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 25 -m state –state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 110 -m state –state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 143 -m state –state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 443 -m state –state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 873 -m state –state ESTABLISHED -j ACCEPT
#$iptables -A INPUT -p tcp –sport 2401 -m state –state ESTABLISHED -j ACCEPT
#
# 외부 서비스를 위한 설정. / udp service
$iptables -A INPUT -p udp –sport 53 -m state –state ESTABLISHED -j ACCEPT
# 위의 설정은 내부에서 외부의 서비스를 이용할수 있도록 하기 위한 설정이
# 다. ftp 와 같이 특수한 경우를 제외하고는 ESTABLISHED 만 있으면 외부의
# 서비스를 이용하는데 지장이없다. ftp의 경우에는 active mode 와 passive
# mode 처리를 모두 해 줘야 한다. 마지막의 Name Service Config 는 일반적
# 으로 네트워크에 연결이 되어 있는 서버들의 경우에는 모두 자신이 아니더
# 라도 외부의 name 질의를 해야 하므로 강제적으로 열리게 해 놓은 것이다.
# TCP service
$iptables -A INPUT -p tcp –dport 20 -m state –state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp –dport 20 -m state –state ESTABLISHED -j ACCEPT
$iptables -A INPUT -i eth0 -p tcp –sport 1024:65535 –dport 1024:65535 -m state \\
–state ESTABLISHED,RELATED -j ACCEPT
$iptables -A INPUT -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp –dport 23 -m state –state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp –dport 25 -m state –state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp –dport 110 -m state –state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp –dport 113 -m state –state NEW,ESTABLISHED -j ACCEPT
$iptables -A INPUT -p tcp –dport 3306 -m state –state NEW,ESTABLISHED -j ACCEPT
# ip 대역 예제.
#$iptables -A INPUT -s 211.0.0.0/8 -p tcp –dport 23 -m state –state \\
NEW,ESTABLISHED -j ACCEPT
#$iptables -A INPUT -s 210.0.0.0/8 -p tcp –dport 23 -m state –state \\
NEW,ESTABLISHED -j ACCEPT
#$iptables -A INPUT -s 211.0.0.0/8 -p tcp –dport 993 -m state –state \\
NEW,ESTABLISHED -j ACCEPT
# UDP service
$iptables -A INPUT -p udp –dport 53 -m state –state NEW,ESTABLISHED -j ACCEPT
# ICMP service
$iptables -A INPUT -s 211.0.0.0/8 -p icmp –icmp-type echo-request -j ACCEPT
$iptables -A INPUT -s 210.0.0.0/8 -p icmp –icmp-type echo-request -j ACCEPT
# 서버로 들어오는 SYN packet 을 모두 거절한다.
$iptables -A INPUT -p tcp –syn -j REJECT
# Drop All packet
$iptables -A INPUT -p tcp –dport 1:1023 -j DROP
$iptables -A INPUT -p udp –dport 1:1023 -j DROP
$iptables -A INPUT -p icmp –icmp-type echo-request -j REJECT
# OUTPUT SERVICE
#$IPTABLES -Z OUTPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -A OUTPUT -o eth0 -p tcp –dport 20 -m state –state NEW,ESTABLISHED -j \\
DROP
$IPTABLES -A OUTPUT -o eth0 -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j \\
DROP
$IPTABLES -A OUTPUT -o eth0 -p tcp –dport 23 -m state –state NEW,ESTABLISHED -j \\
DROP
# 각종 서비스들에 대해 최대의 성능을 발휘할 수 있도록 TOS 설정을 한다.
#$iptables -t mangle -A OUTPUT -p tcp -s 0/0 –sport 80 -j TOS –set-tos 0x10
#$iptables -t mangle -A OUTPUT -p tcp -d 0/0 –dport 21 -j TOS –set-tos 0x10
#$iptables -t mangle -A OUTPUT -p tcp -d 0/0 –dport 22 -j TOS –set-tos 0x10
#$iptables -t mangle -A OUTPUT -p tcp -d 0/0 –dport 23 -j TOS –set-tos 0x10
#$iptables -t mangle -A OUTPUT -p tcp -s 0/0 –sport 20 -j TOS –set-tos 0x08