6.6 如何流程化编写iptables脚本

(1)根据需求调整系统内核

例如TCP的SYN缓冲(syncookies)是一种快速检测和防御SYN洪水攻击的机制,如下的命令可以启用SYN缓冲:

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

echo "1" > /proc/sys/net/ipv4/tcp_syncookies

另外,如果以iptables作为NAT路由器,对于存在着多个网卡的情况,则要开启IP转发功能,用于多网卡之间数据的流通,命令如下:

echo "1" > /proc/sys/net/ipv4/ip_forward

其他适用于iptables防火墙的内核调整可以根据需求自行设定。

(2)加载iptables模块

由于这里不是以服务的方式启动iptables的,而是采用service的方式,所以需要手动加载iptables模块,例如:

modprobe ip_tables

modprobe iptable_nat

modprobe ip_nat_ftp

modprobe ip_nat_irc

modprobe nf_conntrack

modprobe ip_conntrack_ftp

modprobe ipt_MASQUERADE

接下来可以用lsmod来查看加载的模块,命令如下:

lsmod | grep "ip"

此命令显示结果如下:

ipt_MASQUERADE 2466 0

iptable_nat 6158 0

nf_nat 22759 4 ipt_MASQUERADE,nf_nat_irc,nf_nat_ftp,iptable_nat

nf_conntrack_ipv4 9506 3 iptable_nat,nf_nat

nf_conntrack 79357 8 ipt_MASQUERADE,nf_nat_irc,nf_conntrack_irc,nf_nat_ftp,nf_conntrack_ftp,iptable_nat,nf_nat,nf_conntrack_ipv4

nf_defrag_ipv4 1483 1 nf_conntrack_ipv4

ip_tables 17831 1 iptable_nat

新版的iptables会自动使用新模块的名称来代替旧模块的名称。

(3)清空所有的表链规则(包括自定义的)

命令如下:

iptables -F

iptables -X

iptables -Z

iptables -F -t nat

iptables -X -t nat

iptables -Z -t nat

iptables -X -t mangle

(4)定义默认策略

一般来说为了搭建安全的防火墙,默认是拒绝一切流量连接的,所以三表五链默认规则都应该是DROP,但对于实际线上的iptables脚本,建议按如下方式配置(因为一般认为从服务器OUTPUT出去的数据和NAT出去的数据都是安全的):

iptables -P INPUT DROP

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

iptables -t nat -P PREROUTING ACCEPT

iptables -t nat -P POSTROUTING ACCEPT

iptables -t nat -P OUTPUT ACCEPT

(5)打开“回环”

这样做是为了避免不必要的麻烦,命令如下:

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

(6)允许状态为ESTABLISHED的数据包进入机器

命令如下:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

(7)根据需求建立防火墙规则

比如6.5.1节介绍的完整的桌面主机防火墙脚本如下:

#/bin/bash

modprobe ip_tables

modprobe iptable_nat

modprobe pf_conntrack

iptables -F

iptables -X

iptables -Z

iptables -F -t nat

iptables -X -t nat

iptables -Z -t nat

iptables -X -t mangle

iptables -P INPUT DROP

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

iptables -t nat -P PREROUTING ACCEPT

iptables -t nat -P POSTROUTING ACCEPT

iptables -t nat -P OUTPUT ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -m state --state NEW -j DROP

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

此脚本执行后,本来正常提供的samba服务马上就断开了,客户端连接此机的samba报错,可以查看iptables的conntrack记录,命令如下:

cat /proc/net/pf_conntrack

此命令显示结果如下:

udp 17 15 src=192.168.1.101 dst=192.168.1.255 sport=137 dport=137 packets=20 bytes=1920 [UNREPLIED] src=192.168.1.255 dst=192.168.1.101 sport=137 dport=137 packets=0 bytes=0 mark=0 secmark=0 use=1

udp 17 12 src=192.168.1.101 dst=192.168.1.255 sport=138 dport=138 packets=1 bytes=269 [UNREPLIED] src=192.168.1.255 dst=192.168.1.101 sport=138 dport=138 packets=0 bytes=0 mark=0 secmark=0 use=1

samba建立连接的137、138端口只有一边有流量,TCP的三次握手被拒,这个肯定是提供不了samba服务的,证明此脚本是有效的。

(8)给脚本x权限

给脚本x权限后就可以直接执行此脚本了。

大家编写iptables脚本时可以参考上述步骤,一步一步地来,这样就不容易出错了,以后熟练了就会习惯成自然。