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