FreeBSD Dummynet/table шейпер

Данная схема шейпера работает следующим образом
При старте системы инициализируются правила обрезки скорости для каждого тарифного плана два правила на каждый класс трафика. При подключении абонента его ип вносится в IPFW таблицу 10 и 11 (входной и исходящий трафик) с аргументом номер тарифного плана

Опции ядра

options         IPFIREWALL
options         IPFIREWALL_DEFAULT_TO_ACCEPT
options         DUMMYNET

Таблицы сетей. Данные о сетях

table 1 Всегда глобальная таблица. Значение по умолчанию 0.0.0.0/0
table 2 Таблица с пиринговыми сетями

В таблицу пиринговых сетей данные заносятся следующим образом

ipfw table add ip_адрес_пиринговой_сети клас_к_которому_относиться_пиринговая_сеть

Таблицы клиентов. В них сохраняются данные по клиентам.

table 9 Добавляются абоненты у которых нет ограничения по глобальному трафику
table 10 Таблица клиентов для входящего трафика
table 11 Таблица клиентов для исходящего трафика
table 12 Таблица клиентов для входящего пирингового трафика класс 2
table 13 Таблица клиентов для исходящего пирингового трафика класс 2
table 14 Таблица клиентов для входящего пирингового трафика класс 3
table 15 Таблица клиентов для исходящего пирингового трафика класс 3

В таблицы заносятся следующие данные

ipfw table 10 add ip_адрес_клиента  тарифный_план_клиента
ipfw table 11 add ip_адрес_клиента  тарифный_план_клиента

При подключении абонента система автоматически заноси IP адресами в таблицы пользователей и сетей

Правила шейпера проверяются и формируются командой

# /usr/abills/libexec/billd checkspeed NAS_ID=... 

Для поднятий правил шейпирования при старте системы используется программа

# cp /usr/abills/misc/freebsd/shaper_start.sh /usr/local/etc/rc.d/shaper_start.sh

/etc/rc.conf

abills_shaper_enable="YES"
abills_nas_id="1"
abills_shaper_if=""  # По умолчанию ng

При установке скорости в аккаунте пользователя если она еще не указывалась другим пользователям нужно переинициализировать шейпер

Дополнительные параметры:

NAS_IDS Номера серверов доступа
FW_DIRECTION_OUT Параметры направления.
по умолчанию out xmit _out_interface_
FW_DIRECTION_IN Параметр направления трафика.
по умолчанию in recv _out_interface_

По умолчанию _out_interface_ считается интерфейс шлюза по умолчанию.

для mpd пример направлений

/usr/abills/libexec/billd checkspeed NAS_IDS=1 RECONFIGURE=1 FW_DIRECTION_OUT=out FW_DIRECTION_IN=in; ipfw /etc/fw.conf

Переинициализация шейпера

# /usr/local/etc/rc.d/shaper_start.sh restart

Проверка работоспособности

правил перенаправления в Pipe

# ipfw show
08000     0        0 pipe tablearg ip from table(14) to table(2,2) out xmit ng*
08010     0        0 pipe tablearg ip from table(2,2) to table(15) in recv ng*
09000     0        0 pipe tablearg ip from table(12) to table(2,1) out xmit ng*
09010     0        0 pipe tablearg ip from table(2,1) to table(13) in recv ng*
10000     0        0 pipe tablearg ip from table(10) to any out xmit ng*
10010     0        0 pipe tablearg ip from any to table(11) in recv ng*
10020     0        0 allow ip from table(9) to any out xmit ng*
10025     0        0 allow ip from any to table(9) in recv ng*

Занесённые адреса в таблицы 10,11 (глобальный шейпер)

# ipfw table 10 list
 10.11.1.1/32 5145
# ipfw table 11 list
 10.11.1.1/32 6145

Поднятые пайпы (правила нарезки скорости)

# ipfw pipe show 5145 6145

5145:   2.028 Mbit/s    0 ms burst 0
q136217 202 KB 0 flows (1 buckets) sched 70681 weight 0 lmax 0 pri 0 droptail
 sched 70681 type FIFO flags 0x1 64 buckets 0 active
  mask:  0x00 0x00000000/0x0000 -> 0xffffffff/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp

06145:   1.024 Mbit/s    0 ms burst 0
q137217 102 KB 0 flows (1 buckets) sched 71681 weight 0 lmax 0 pri 0 droptail
 sched 71681 type FIFO flags 0x1 64 buckets 0 active
   mask:  0x00 0xffffffff/0x0000 -> 0x00000000/0x0000
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp  

Оптимизации

/etc/sysctl.conf

net.inet.ip.fastforwarding=1
net.inet.ip.portrange.randomized=0
net.inet.tcp.nolocaltimewait=1
kern.ipc.nmbclusters=65536
kern.ipc.maxsockets=204800
net.inet.ip.dummynet.expire=0
net.inet.ip.dummynet.hash_size=2048
net.inet.ip.fw.dyn_buckets=2048

net.inet.tcp.maxtcptw=40960
kern.ipc.maxsockbuf=8388608
net.graph.recvspace=256000

# TCP bufer size
kern.ipc.maxsockbuf=8388608
net.inet.tcp.recvspace=65535

# incoming TCP queue size
kern.ipc.somaxconn=4096
# incoming packets queue size
net.inet.ip.intr_queue_maxlen=2000

net.inet.flowtable.enable=0