已经在具有桥接接口的 Linux KVM 虚拟机(Fedora 12 & 13 64 位)上测试了一些 iptables 字符串匹配规则,例如,INPUT 链中位于其他端口 80 规则之前的规则
-m 字符串 --algo bm --icase --string “phpMyAdmin” -j LOG --log-prefix “phpmyadmin 测试”
然而,尽管“phpMyAdmin”的各种 GET 命令都进入了服务器日志,但却从未记录过任何流量。
另一方面,如果我在 KVM 主机的 FORWARD 链中放入相同的规则,然后-m physdev --physdev-is-bridged -j 接受规则,这些 GET 请求已被成功记录。
有人知道这是为什么吗?或者这可能是客户机的 virtio LAN 驱动程序中的一个错误?我知道 GET 请求可能跨越多个数据包,但是我已经通过 tcpdump 捕获验证了这不是问题。
[编辑] 另外要提一下,客人输入链中的其他规则都按预期工作。只有字符串匹配规则不起作用时才出现问题。
答案1
我在使用 VirtualBox 时也遇到过类似的问题,输入时无法进行字符串匹配。后来我发现匹配的字符串必须经过 HTML 编码;因此,如果您有空格,则需要将编码的 HTML 放在空格处,正斜杠也是如此。
我建议使用 tcpdump;它帮助我调试了这个问题。