上QQ阅读APP看书,第一时间看更新
2.2.2 实际生产中的iptables脚本编写
图2-1展示了netfilter钩子与iptables表和链的处理顺序,显示了其强大的处理功能。在实际生产中,使用比较多的是filter表,这个表用于对进入主机或者从主机发出的数据进行访问控制。在实践中,笔者建议使用iptables脚本来管理访问控制规则,而不是通过编辑和修改系统自带的/etc/sysconfig/iptables文件,这样做的好处是可以更加清晰地理解规则。
下面以代码清单2-1作为一个实际生产中的iptables脚本,讲解iptables的语法与使用的最佳实践。
代码清单2-1 实际生产中的iptables脚本
#!/bin/sh #首先清除所有规则 iptables -F #以下两行允许某些调用localhost的应用访问 iptables -A INPUT -i lo -j ACCEPT #规则1 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #规则2 #以下一行允许从其他地方ping iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT #规则3 #以下一行允许从其他主机、网络设备发送MTU调整的报文 #在一些情况下,例如通过IPSec VPN隧道时,主机的MTU需要动态减小 iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT #规则4 #以下两行分别允许所有来源访问TCP 80、443端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #规则5 iptables -A INPUT -p tcp --dport 443 -j ACCEPT #规则6 #以下一行允许104.224.147.43来源的IP访问TCP 22 端口(OpenSSH) iptables -A INPUT -p tcp -s 104.224.147.43 --dport 22 -j ACCEPT #规则7 #以下一行允许104.224.147.43来源的IP访问UDP 161 端口(SNMP) iptables -A INPUT -p udp -s 104.224.147.43 --dport 161 -j ACCEPT #规则8 #以下一行禁止所有其他的进入流量 iptables -A INPUT -j DROP #规则9 #以下一行允许本机响应规则编号为01~08的数据包发出 iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT #规则10 #以下一行禁止本机主动发出外部连接 iptables -A OUTPUT -j DROP #规则11 #以下一行禁止本机转发数据包 iptables -A FORWARD -j DROP #规则12
注意 1)代码清单2-1中的规则9明确禁止了所有未被允许的网络访问。这是1.3.4节白名单机制原则的贯彻实践。
2)代码清单2-1中的规则11明确禁止了主机主动发出外部连接,这可以有效地防范类似“反弹Shell”的攻击。在很多情况下,当主机被黑客入侵后,其留下的后门并不以监听端口的形式接收外部连接,因为在这种情况下,监听很容易被识别出来,也很容易被外部网络设备的防火墙所截获并禁止;相反,这些后门会主动向黑客所控制的外部主机发起网络连接,把被入侵主机的Shell反弹到外部主机上,从而进行反向形式的控制。防止反弹Shell的最有效手段就是禁止本机主动向未被明确信任的外部主机发起连接。