您可以通过在端口层过滤来获得更加精细的粒度。前一个示例过滤源地址,因此会阻塞所有服务。如果在您的主机上有一个 web 服务器,您想让它对一般的 Internet 开放访问,那么之前的策略就不起作用了。
回想一下 “学习 Linux,302(混合环境):配置 Samba”,Samba 使用了四种不同的端口:
● 137 UDP。 网络基本输入/输出系统 (NetBIOS) 名称服务。
● 138 UDP。 NetBIOS 数据报服务。
● 139 TCP。 NetBIOS 会话服务。
● 445 TCP。 直接托管(TCP 上的 Common Internet File System [CIFS])。
清单 1 演示了一个策略,允许从 10.0.0.0/8 网络连接到 Samba 服务,也允许 web 服务器没有任何限制地进行操作。
清单 1. 在端口层操作的策略
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT iptables -A INPUT -p udp -s 10.0.0.0/8 --dport 137 -j ACCEPT iptables -A INPUT -p udp -s 10.0.0.0/8 --dport 138 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.0/8 --dport 139 -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -s 10.0.0.0/8 --dport 445 -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -P INPUT DROP |
清单 1 的策略比之前的策略复杂得多,因为它对不同的应用程序进行了设置,每个都有不同的策略。前两条规则匹配所有作为新会话(-m state --state NEW)的一部分,并且发送到端口 80 或端口 443(--dport 80、 --dport 443)的传入的 TCP 数据包(-p tcp)。对于源地址没有任何限制,因此会支持所有人。
接下来的两行匹配所有从内部网络(-s 10.0.0.0/8)发送到端口 137 或端口 138(--dport 137、--dport 138)的 UDP 数据包(-p udp)。UDP 没有状态,因此无需担心连接是新的还是已建立的。
第 5 行和第 6 行结合状态匹配器和源地址过滤器,仅仅允许端口 139 和端口 445 上来自内部网络的新连接。
最后两行与之前策略的操作相同。如果数据包与当前连接有关,则支持它。其他的将会被丢弃。
排除防火墙故障
防火墙问题很常见,因为会遇到没有想到的的需求或发现应用程序并没有按您预计的方式运行。规则本身的错误也很常见,尤其是处理一长串端口号和 IP 地址时。但也不是所有问题都与防火墙有关,因此您应该了解一些基本的网络故障排除步骤。
查看策略
使用 iptables 命令查看策略。-L 选项会列出策略,而 verbose(-v)选项会添加额外的细节信息,比如数据包计数器。清单 2 显示了 清单 1 的策略。
清单 2. 查看详细策略
# iptables -L -v Chain INPUT (policy DROP 47 packets, 5125 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:http 0 0 ACCEPT tcp -- any any anywhere anywhere state NEW tcp dpt:https 0 0 ACCEPT udp -- any any 10.0.0.0/8 anywhere udp dpt:netbios-ns 0 0 ACCEPT udp -- any any 10.0.0.0/8 anywhere udp dpt:netbios-dgm 0 0 ACCEPT tcp -- any any 10.0.0.0/8 anywhere state NEW tcp dpt:139 0 0 ACCEPT tcp -- any any 10.0.0.0/8 anywhere state NEW tcp dpt:445 214 15216 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 292 packets, 35009 bytes) pkts bytes target prot opt in out source destination |
明细统计数据会显示匹配头两列规则的数据包数目和字节数目。对于清单 2,您会看到该数据包只匹配最后一条规则。仔细看输出的第一行,您会看到默认的目标也有一个数据包数目。有 45 个数据包被丢弃,因为它们不匹配任何一条规则;这表示或者是未授权的用户试图访问主机,或者是合法的流量被不正确的防火墙策略所阻塞。
查看防火墙策略的另一用途是完整地了解策略。由于处理会在第一次匹配后停止,因此您应该从策略开头处开始,一直往下看,确定是否有一条规则会丢弃您的流量。