현재 woogi.org 서버의 iptables script 입니다.
방화벽용 스크립트와는 구별됩니다. 이것은 서버용입니다.
사용자에 맞게 설정을 하셔야 할 겁니다. 특히 ssh 같은 shell 쪽은 접속자체에 문제가 될 수
있으므로…======================================
#!/bin/sh
# http://woogi.org ^-^v
# 모듈 같은건 올리지 않습니다. 기본적으로 올라와 있으므로…# iptables Path
iptables=/sbin/iptables# 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`"# rule delete
# 모두 지우고 다시 재설정합니다.
$iptables -F# INPUT Rules 설정
$iptables -Z INPUT
$iptables -P INPUT ACCEPT# local 과 자기자신의 IP 는 허용.
$iptables -A INPUT -i lo -j ACCEPT
$iptables -A INPUT -s $HOST_IP -j ACCEPT# 알 수 없는 패킷 즉, NETWORK 상태가 INVALID 인 패킷들을 막아 버린다.
# 정상적인 접근에서는 나올 수 없는 상태.$iptables -A INPUT -m state --state INVALID -j DROP
# 외부 서비스를 위한 설정. / udp service
# dns 상호 쿼리를 위해서…
$iptables -A INPUT -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT# TCP service
# ftp-data, 서버자체가 클라이언트가 될 경우…
$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# ftp service
# ftp 를 이용할 수 있는 대역을 지정하였습니다. 좀더 세밀해 질 수 있겠죠.
$iptables -A INPUT -s 61.0.0.0/8 -p tcp --dport 21 -j ACCEPT
$iptables -A INPUT -s 210.0.0.0/8 -p tcp --dport 21 -j ACCEPT
$iptables -A INPUT -s 211.0.0.0/8 -p tcp --dport 21 -j ACCEPT# ssh service
# ssh 접속 지역 지정.
$iptables -A INPUT -s 61.0.0.0/8 -p tcp --dport 22 -j ACCEPT
$iptables -A INPUT -s 210.0.0.0/8 -p tcp --dport 22 -j ACCEPT
$iptables -A INPUT -s 211.0.0.0/8 -p tcp --dport 22 -j ACCEPT# telnet
# telnet은 현재 서비스 하지 않습니다.
#$iptables -A INPUT -s 210.0.0.0/8 -p tcp --dport 23 -j ACCEPT
#$iptables -A INPUT -s 211.0.0.0/8 -p tcp --dport 23 -j ACCEPT# etc service
# 25(메일), 80(웹)은 모든 곳에서 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# AUTH 는 서비스를 하지 않더라도 열어야 합니다. 클라이언트에서 요청합니다.
$iptables -A INPUT -p tcp --dport 113 -m state --state NEW,ESTABLISHED -j ACCEPT# pop3s 를 이용하는 관계로 995번을 열고 있습니다.
$iptables -A INPUT -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT# mysql
# 기본적으로 mysql 은 local에서만 접속하면 됩니다. DB 공유를 할 경우 대역 지정.
$iptables -A INPUT -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT# ip 대역 예제.
# ip 대역뿐만 아니라 아래와 같이 상태접속을 지정할 수도 있습니다.
#$iptables -A INPUT -s 211.0.0.0/8 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -
j ACCEPT# UDP service
# udp 서비스는 하나뿐이죠?
$iptables -A INPUT -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT# ICMP service
# ping은 별 의미가 없지만…
$iptables -A INPUT -s 211.0.0.0/8 -p icmp --icmp-type echo-request -j ACCEPT
$iptables -A INPUT -s 211.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
# 원활한 서비스를 위해 1023 포트까지만 DROP 을 합니다. 물론 다 막아도 상관 없습니다.
$iptables -A INPUT -p tcp --dport 0:1023 -j DROP
$iptables -A INPUT -p udp --dport 0:1023 -j DROP
$iptables -A INPUT -p icmp --icmp-type echo-request -j REJECTecho -e "\nDone.\n"
exit;
[실전] 서버용 IPTABLES script