Я пытаюсь выполнить эмуляцию сети с помощью dummynet в FreeBSD 10. У меня это работает в 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
Когда я провожу тест ping с 10.25.0.129 по 10.25.0.11, он всегда проходит успешно, однако попадания брандмауэра выглядят так:
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, эхо-запросы перестают работать, поэтому я знаю, что по какой-то причине BSD определенно передает эхо-запросы, но правило не срабатывает, как это было в FreeBSD9.3.
Это все из-за net.inet.ip.dummynet.io_fast=1
. Эта переменная включает быструю обработку пакетов: пока полоса пропускания не исчерпана, все пакеты пересылаются напрямую через мост. Shaper полностью игнорируется - пакеты в DUMMYNET не учитываются.
Такое поведение предназначено специально для сильно загруженных шлюзов для разгрузки ЦП за счет нерелевантной статистики.
Попробуйте выключить его и убедитесь, что количество пакетов рассчитано по оценкам.