如何为 iptables 编写自动化测试?

如何为 iptables 编写自动化测试?

我正在使用 配置 Linux 路由器iptables。我想为配置编写验收测试,以断言以下内容:

  • 来自互联网上某个人的流量没有被转发,并且
  • 从企业 LAN 上的主机到 DMZ 中的 Web 服务器上的端口 80 的 TCP 被转发。

一个古老的常见问题解答提到一个iptables -C选项,允许人们询问类似这样的问题:“给定一个从 X 到 Y 的数据包,在端口 Z 上,它会被接受还是被丢弃?”尽管 FAQ 建议它是这样工作的,但对于iptables(但可能不是ipchains像它在示例中使用的那样)该-C选项似乎并没有模拟一个通过所有规则的测试数据包,而是检查是否存在完全匹配的规则。这作为测试没有什么价值。我想断言规则具有预期的效果,而不仅仅是它们存在。

我考虑过创建更多测试虚拟机和虚拟网络,然后使用类似工具进行探测nmap。但是,我避免使用这种解决方案,因为创建所有这些额外的虚拟机非常复杂,这实际上是一种生成一些测试流量的繁重方式。如果有一种可以在生产中的真实服务器上工作的自动化测试方法,那就太好了。

我还能如何解决这个问题?我可以使用某种机制来生成或模拟任意流量,然后知道它是否被(或将被)丢弃或接受iptables

答案1

如果您准备进行一些编码,您可以尝试以下操作:

  • 使用系统调用CLONE_NEWNET的标志clone或使用ip netns addip netns exec命令来创建新的网络命名空间。
  • tun在这个命名空间中,使用驱动程序或创建一组虚拟网络接口ip link add
  • 使用加载配置iptables-restore
  • tun通过或veth设备向规则提供一定数量的数据包
  • 观察你是否从tunveth设备中获取了正确的数据包

这种方法可能最适合测试转发数据包的规则。与使用 iptables 的机器建立连接需要付出更多努力,但这种方法也应该可行。

以下是可使用的命令序列的示例:

ip netns add test-iptables
ip netns add test-iptables-some-guy-on-the-internet
ip netns add test-iptables-lan-host

ip netns exec test-iptables ip link add eth0 type veth peer name eth0-peer
ip netns exec test-iptables ip link set eth0-peer netns test-iptables-some-guy-on-the-internet
ip netns exec test-iptables ip link add eth1 type veth peer name eth1-peer
ip netns exec test-iptables ip link set eth1-peer netns test-iptables-lan-host

ip netns exec test-iptables ifconfig eth0 192.0.2.2 netmask 255.255.255.0
ip netns exec test-iptables ifconfig eth1 203.0.113.1 netmask 255.255.255.0

ip netns exec test-iptables-some-guy-on-the-internet ifconfig eth0-peer 192.0.2.1 netmask 255.255.255.0
ip netns exec test-iptables-some-guy-on-the-internet route add default gateway 192.0.2.2

ip netns exec test-iptables-lan-host ifconfig eth1-peer 203.0.113.2 netmask 255.255.255.0
ip netns exec test-iptables-lan-host route add default gateway 203.0.113.1

ip netns exec test-iptables-some-guy-on-the-internet telnet 203.0.113.2
ip netns exec test-iptables iptables-restore < /tmp/iptables-test
ip netns exec test-iptables-some-guy-on-the-internet telnet 203.0.113.2

ip netns del test-iptables
ip netns del test-iptables-some-guy-on-the-internet
ip netns del test-iptables-lan-host

这将创建三个网络命名空间用于测试,并在其中一个中加载一组 iptables 规则。另外两个则充当互联网上的某个人和 LAN 上的主机的角色。

在上面的例子中,第一个telnet命令获取来自命名空间的拒绝连接test-iptables-lan-host,第二个telnet命令在规则集丢弃数据包时获取超时。

这不会影响初始网络命名空间,默认情况下,您的所有生产都将在此命名空间中进行。与生产进一步分离的唯一方法是在单独的主机(物理或虚拟)上运行它。

答案2

专业领域在两家公司提供的硬件/软件的帮助下实现了这一点。

www.ixiacom.com

www.spirent.com

在第一种情况下,您可以使用类似 Ixia 400T 底盘 + Ixload 的东西。

在第二种情况下,Smartbits 或 Testcenter 及其相应的应用程序

这些设备可以(除其他功能外)模拟大量客户端在您选择的目标服务器上执行不同类型的请求。它们随时可以测试您的服务器安全性,包括一组预定义的攻击测试,而且您可以随时定义自己的一组测试。它们还具有许多其他功能,例如负载压力测试等。

这不是一个便宜的选择。

相关内容