我怎样才能为iptables编写自动化testing?

我正在用iptablesconfiguration一个Linux路由器。 我想写一些validationtesting来确认这样的configuration:

  • 互联网上的一些家伙的stream量不会被转发
  • 转发到公司LAN上的主机在DMZ中的Web服务器上的端口80。

一个古老的常见问题提到了一个iptables -C选项,它允许有人问这样的问题:“给定一个从X到Y的包,在Z端口,它会被接受还是被丢弃? 虽然常见问题解答表明它是这样工作的,但对于iptables (但可能不是ipchains因为它在示例中使用) -C选项似乎不模拟testing数据包运行通过所有规则,而是检查存在一个完全匹配规则。 这个testing没有什么价值。 我想断言规则具有预期的效果,而不仅仅是存在。

我已经考虑过创build更多的testing虚拟机和虚拟networking,然后用像nmap这样的工具来探索效果。 但是,由于创build所有这些额外的虚拟机的复杂性,我避免了这个解决scheme,这实际上是一个非常繁重的方式来产生一些testingstream量。 有一个自动化的testing方法也可以,这个方法也可以在真实的服务器上运行。

我还能怎样解决这个问题? 有什么机制可以用来生成或模拟任意stream量,然后知道是否(或将)被丢弃或被iptables接受?

如果你准备做一些编码,你可以试试这个:

  • 使用clone系统调用的CLONE_NEWNET标志或使用ip netns addip netns exec命令创build新的networking名称空间。
  • 在这个命名空间中,使用tun驱动程序或ip link add一组虚拟networking接口。
  • 使用iptables-restore加载configuration
  • 通过tunveth设备向规则提供多个数据包
  • 注意你从tunveth设备中得到正确的数据包

这种方法很可能对于转发数据包的testing规则来说效果最好。 与使用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 

这将创build三个networking命名空间用于testing,并在其中之一中加载一组iptables规则。 另外两个作为互联网上的一些人的angular色和局域网上的主机。

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

这不会触及初始networking命名空间,这是默认情况下所有生产都将发生的命名空间。 从生产中获得更多分离的唯一方法是在单独的主机(物理或虚拟)上运行它。

专业世界在2个公司提供的硬件/软件的帮助下做到这一点。

http://www.ixiacom.com

http://www.spirent.com

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

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

这些设备可以(除其他外)模拟大量客户端在您select的目标服务器上执行不同types的请求。 他们准备好testing您的服务器安全性,包括预先定义的一组攻击testing,并且您始终可以定义自己的设置。 他们还有许多其他function,如负载压力testing等。

不是一个便宜的select。