Данная схема шейпера работает следующим образом.
При старте системы инициализируются правила обрезки скорости для каждого тарифного плана, два правила на каждый класс трафика. При подключении абонента его IP вносится в 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


Отслеживание проблем

при подключении абонента должен попасть в 10 и 11 таблицу

ipfw table 10 list | grep [IP  клиента]
ipfw table 11 list | grep [IP  клиента]

результат

ipfw table 10 list | grep 10.0.0.1
--- table(10), set(0) ---
10.0.0.1/32 5024

Если результат пустой значит не срабатывает linkupdown

5024 - номер Pipe канала для шейпера

ipfw pipe 5024  list

отображение правил шейпера

проверка включен ли редирект трафика на шейпер

ipfw show


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*

если вторая и третья колонка - нули, значит трафик не попадает.