FreeBSD ng_car шейпер

ng_car является частью netgraph и используется для ограничения трафика на интерфейсах, представляет из себя модуль ядра системы.

ng_car можно использовать как на физических интерфейсах, так и на виртуальных интерфейсах и интерфейсах MPD. Разграничения скорости трафика по сетям и Ip адресам, можно использовать ng_car совместно с ng_bpf.

Для ограничения пропускной способности интерфейса потребуется собрать ядро с поддержкой netgraph.

В файле конфигурации ядра убираем комментарий со строк:

        options         NETGRAPH
        options         NETGRAPH_ETHER

и пересобираем ядро.

Описание принципов работы шейпера FreeBSD + ng_car

Для работы нужно указать в конфигурационном файле config.pl

$conf{ng_car}=1;
$conf{ng_car_prefix}=10000; Префикс для для добавления в номеру входящего правила

1. Поднятия правил ipfw заворота в ng_car шейпер осуществляется скриптом misc/ipfw/shaper_start.sh

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

/etc/rc.conf

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

Пример поднятых правил:

# перекинуть трафик в правила заворота в ng_car
09020        7        363 skipto 10120 ip from table(12) to table(2) in recv ng*  
09025        1        214 skipto 10125 ip from table(2) to table(13) out xmit ng*
09030        0          0 skipto 10130 ip from table(14) to table(3) in recv ng*
09035        0          0 skipto 10135 ip from table(3) to table(15) out xmit ng*

# Заворот глобального для прописанных пользователей в таблице 10 в ng_car
10000     1720     106227 netgraph tablearg ip from table(10) to any in recv ng*
10010     2863    3965522 netgraph tablearg ip from any to table(11) out xmit ng*
# Весь остальной трафик пропускать
10015        0          0 allow ip from any to any via ng*
#Локальный заворот в ng_car
10120        7        363 netgraph tablearg ip from table(12) to any in recv ng*
10125        1        214 netgraph tablearg ip from any to table(13) out xmit ng*

10130        0          0 netgraph tablearg ip from table(14) to any in recv ng*
10135        0          0 netgraph tablearg ip from any to table(15) out xmit ng

Описание таблиц:

2 Список сетей для локального класса трафика с номером 2. Номера формируются соответственно с номером класса трафика в журнале классов трафика.
10 список пользователей которые попадают в правила шейпера для исходящего глобального трафика
11 список пользователей которые попадают в правила шейпера для входящего глобального трафика
12 список пользователей которые попадают в правила шейпера для исходящего локального трафика с номером класса 2. Номера формируются соответственно номер класса трафика + 10.
13 список пользователей которые попадают в правила шейпера для входящего локального трафика с номером класса 2. Номера формируются соответственно номер класса трафика + 10 + 1.
3 Список сетей для локального класса трафика с номером 3. Номера формируются соответственно с номером класса трафика в журнале классов трафика.
14,15 Соответственно класс 3 трафика

Для поднятия шейпера используется программа linkupdown. Программа прописывает пользователей в таблицы ipfw и присваивает им скорость. Для проверки правил которые она выполняет нужно указать последним параметром параметр debug.
Например:

abills/libexec/linkupdown up ng0 test 10.11.11.11 debug

Внимание!!! При использовании ng_car шейпера можно использовать одновременно только одну активную сессию для учётной записи

Проверка установленного шейпера

Для проверки назначено скорости и её изменения используется программа:

  • Проверка установленной скорости и изменение для активных абонентов
/usr/abills/libexec/billd checkspeed NAS_IDS=10
  • Просмотр установленной скорости
/usr/abills/libexec/billd checkspeed NAS_IDS=10 SHOW_SPEED=1 
 

Также можно просмотреть установлен ли шейпер на абонента следующим способом

  • Найти IP адрес абонента в 10 таблице фаервола
# ipfw table 10 list | grep [IP  адрес пользователя]
  • Установлен ли шейпер ng_car
# ngctl list | grep [логин абонента]
  • Подняты ли правила заворота абонента в ng_car
# ipfw show | grep netg

Все эти команды должны возвращать строки с параметрами если не возвращают значит шейпер не присвоился абоненту

Опитимизация системы

/etc/sysctl.conf

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

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