我正在制作一个在 Ubuntu 12.04 上运行的数据包过滤程序,它使用 libipq 作为将数据包复制到用户空间的库。libipq 的逻辑对我来说很好,我的问题是我注意到从使用 libipq 到不使用 libipq 对性能的影响很大。如果我删除为程序添加的 iptable 规则并让内核处理数据包,则速度为 50 MB/s。但是,当使用 libipq 并恢复我的 iptables 规则时,速度会下降到 1 MB/s(如果我幸运的话),通常是一半。
我想知道,我的 iptable 规则可能有问题吗?是否可以更有效地使用规则,或者 libipq 只是效率低下(或者我的代码,即使我没有做那么多)?这是我用来设置我的 iptable 规则的脚本:
#!/bin/sh
modprobe iptable_filter
modprobe ip_queue
iptables -A FORWARD -p icmp -j QUEUE
iptables -A FORWARD -p tcp -j QUEUE
iptables -A FORWARD -p udp-j QUEUE
iptables -A INPUT -p icmp -j QUEUE
iptables -A INPUT -p tcp -j QUEUE
iptables -A INPUT -p udp -j QUEUE
除此之外,我的 iptable 规则是 Ubuntu 附带的默认设置。
注意:我的设置是针对两个不同子网上的客户端和服务器虚拟机,并使用我的 Ubuntu 虚拟机通过 NAT 和 ip 伪装桥接两者。