我正在尝试使用 FreeBSD 10 中的 dummynet 进行网络模拟。我在 9.3 中可以做到这一点,但是肯定发生了变化,我无法确定具体是什么,但我的设置不再有效。我有非常基本的配置:
**/boot/loader.conf**
dummynet_load="YES"
if_bridge_load="YES"
ipfw_load="YES"
kern.hz=10000
**/etc/sysctl.conf**
net.link.bridge.ipfw=1
net.inet.ip.fw.one_pass=1
net.inet.ip.forwarding=1
net.inet.ip.fastforwarding=1
net.inet.ip.dummynet.io_fast=1
net.inet.ip.dummynet.pipe_byte_limit=16777216
**/etc/rc.conf**
cloned_interfaces="bridge0"
ifconfig_bridge0="addm em0 addm em1 up"
ifconfig_em0="up"
ifconfig_em1="up"
在我的防火墙脚本中我有:
ipfw pipe 111 config bw 1Mbit/s delay 10ms plr .01 queue 1000KB
ipfw add pipe 111 log all from 10.25.0.129 to 10.25.0.11
当我从 10.25.0.129 到 10.25.0.11 进行 ping 测试时,它总是成功,但是防火墙命中如下所示:
root@dummynet:/etc/dummynet # ipfw -a list
00100 0 0 pipe 111 log ip from 10.25.0.129 to 10.25.0.11
65535 77 15511 deny ip from any to any
如果我关闭 BSD 机器,ping 将停止工作,所以我知道 ping 肯定是由 BSD 桥接的,但由于某种原因,规则没有像在 FreeBSD9.3 中那样受到打击。
答案1
这一切都是因为net.inet.ip.dummynet.io_fast=1
。此变量启用了快速数据包处理:当带宽未耗尽时,所有数据包都直接通过网桥转发。Shaper 被完全绕过 - 并且 DUMMYNET 中不计算任何数据包。
该行为专门用于高负载网关,以不相关的统计数据为代价来卸载 CPU。
尝试将其关闭并确保数据包的数量符合估计。