本文假设你已经对iptables有基本的了解,否则请先阅读iptables入门。
在我们的Web服务器上,系统的默认策略是INPUT为DROP,OUTPUT;FORWARD链为ACCEPT,DROP则设置得比较宽松,因为我们知道出去的数据包比较安全。
准备工作
为了验证脚本的通用性,我特地查看了服务器的内核及iptables版本:
# uname -a Linux ud50041 2.6.9-34.ELsmp #1 SMP Fri Feb 24 16:54:53 EST 2006 i686 i686 i386 GNU/Linux # iptables -V iptables v1.2.11 # lsb_release -a LSB Version: :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarch Distributor ID: RedHatEnterpriseAS Description: Red Hat Enterprise Linux AS release 4 (Nahant Update 3) Release: 4 Codename: NahantUpdate3 |
大家可以发现,这台服务器的系统、内核和iptables版本是比较老的。本文中介绍的脚本涉及到recent安全模块,这对系统内核有要求(recent模块在主机防护脚本中也经常用到)。因此,如果大家要采用iptables作为主机防火墙时,建议用CentOS 5.6 x86_64或更高级版本,不然系统会有如下提示错误信息:
iptables: Unknown error 18446744073709551615 iptables:Invalid argument |
在tail -f /var/log/messages时会有如下出错提示:
ip_tables: connlimit match: invalid size 32 != 16 ip_tables: connlimit match: invalid size 32 != 24 |
另外,在生产环境下进行iptables脚本的调试之前,强烈建议编写crontab任务,每5分钟关闭一次iptables脚本,防止操作失误而将自己的SSH客户端锁在外面:
*/5 * * * * root /etc/init.d/iptables stop |
准备工作就是这些,下面是iptables脚本内容。
脚本内容
#!/bin/bash iptables -F iptables -F -t nat iptables -X iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT #load connection-tracking modules modprobe iptable_nat modprobe ip_conntrack_ftp modprobe ip_nat_ftp iptables -A INPUT -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 10 -j ACCEPT iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 20/sec --limit-burst 200 -j ACCEPT iptables -A INPUT -s 122.70.x.x -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport 80,22 -j ACCEPT |