预计阅读本页时间:-
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脚本时可以参考上述步骤,一步一步地来,这样就不容易出错了,以后熟练了就会习惯成自然。