9.10. 测试防火墙配置

在您设计了合适的防火墙配置之后,验证它是否确实能实现您想要的功能非常重要。一种方法是使用您网络外部的测试主机尝试穿透您的防火墙:但这可能相当笨拙和缓慢,并且仅限于测试您可以实际使用的那些地址。

Linux 防火墙实现提供了一种更快更简便的方法。它允许您手动生成测试,并通过防火墙配置运行它们,就像您使用实际数据报进行测试一样。所有类型的 Linux 内核防火墙软件,ipfwadmipchainsiptables,都为此类测试提供支持。该实现涉及使用相关的 check 命令。

一般的测试步骤如下

  1. 使用 ipfwadmipchainsiptables 设计和配置您的防火墙。

  2. 设计一系列测试,以确定您的防火墙是否真的按照您的意图工作。对于这些测试,您可以使用任何源地址或目标地址,因此请选择一些应该被接受的地址组合,以及一些应该被丢弃的地址组合。如果您只允许或不允许某些地址范围,则最好测试范围边界两侧的地址——一个地址正好在边界内,一个地址正好在边界外。这将有助于确保您配置了正确的边界,因为有时很容易在配置中错误地指定网络掩码。如果您按协议和端口号进行过滤,则您的测试还应检查这些参数的所有重要组合。例如,如果您打算在某些情况下仅接受 TCP,请检查 UDP 数据报是否被丢弃。

  3. 开发 ipfwadmipchainsiptables 规则以实现每个测试。将所有规则写入脚本可能是有价值的,这样您可以在纠正错误或更改设计时轻松地进行测试和重新测试。测试使用的语法与规则规范几乎相同,但参数的含义略有不同。例如,规则规范中的源地址参数指定与此规则匹配的数据报应具有的源地址。相反,测试语法中的源地址参数指定将要生成的测试数据报的源地址。对于 ipfwadm,您必须使用–c选项来指定此命令是测试,而对于 ipchainsiptables,您必须使用–C选项。在所有情况下,您 必须始终 指定用于测试的源地址、目标地址、协议和接口。其他参数(例如端口号或 TOS 位设置)是可选的。

  4. 执行每个测试命令并记录输出。每个测试的输出将是一个单词,指示数据报在通过防火墙配置运行后的最终目标——即处理结束的位置。对于 ipchainsiptables,除了内置链之外,还将测试用户指定的链。

  5. 将每个测试的输出与期望的结果进行比较。如果存在任何差异,您将需要分析您的规则集以确定您在哪里犯了错误。如果您已将测试命令写入脚本文件,则可以在纠正防火墙配置中的任何错误后轻松地重新运行测试。一个好的做法是完全刷新您的规则集并从头开始重建它们,而不是动态地进行更改。这有助于确保您正在测试的活动配置实际上反映了您的配置脚本中的命令集。

让我们快速看一下使用 ipchains 进行的简单示例的手动测试记录是什么样的。您会记得,示例中我们的本地网络是 172.16.1.0,网络掩码为 255.255.255.0,我们允许 TCP 连接到网络上的 Web 服务器。没有其他任何东西可以通过我们的转发链。首先进行我们知道应该有效的传输,即从本地主机到外部 Web 服务器的连接
# ipchains -C forward -p tcp -s 172.16.1.0 1025 -d 44.136.8.2 80 -i eth0
accepted

请注意必须提供的参数以及它们用于描述数据报的方式。命令的输出表明该数据报已被接受转发,这正是我们所希望的。

现在尝试另一个测试,这次使用不属于我们网络的源地址。这个应该被拒绝
# ipchains -C forward -p tcp -s 172.16.2.0 1025 -d 44.136.8.2 80 -i eth0
denied

再尝试一些测试,这次的细节与第一个测试相同,但协议不同。这些也应该被拒绝
# ipchains -C forward -p udp -s 172.16.1.0 1025 -d 44.136.8.2 80 -i eth0
denied
# ipchains -C forward -p icmp -s 172.16.1.0 1025 -d 44.136.8.2 80 -i eth0
denied

尝试另一个目标端口,再次期望它被拒绝
# ipchains -C forward -p tcp -s 172.16.1.0 1025 -d 44.136.8.2 23 -i eth0
denied

如果您设计一系列详尽的测试,您将在实现安心方面取得很大进展。虽然这有时可能与设计防火墙配置一样困难,但这也是了解您的设计是否提供您期望的安全性的最佳方法。