Это старая версия документа.


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 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/ipfw/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

Оптимизации

/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