Здесь предлагается пример manad'а для шлюзов под управлением Linux. Скачать его можно здесь. Необходимо установить его на вашем шлюзе (предварительно потребуется установить Perl) и добавить в автозапуск. В данном примере происходит управление службой iptables и ограничение трафика с помощью iproute2. Архив состоит из 3 частей:
1.manad_linux.pl - сам manad (написан на perl);
2.init_shaping.sh - инициализация правил ограничения трафика в системе (описано ниже);
3. start_manad.sh - скрипт запуска (вызывает вначале init_shaping.sh, а потом manad_linux.pl);
4. stop_manad.sh - скрипт остановки.
На вкладке
в типе шлюза добавим команды для данного типа шлюза. Пусть мы хотим для всех ip-адресов клиента (т.е. все они поделят между собой канал) ограничивать входящий трафик значением в 256 кбит/с, а исходящий трафик значением 128 кбит/с. Для этого создадим 2 класса, отдельно для входящего и исходящего трафика .[DEFAULT] [OPEN] <LOOP> iptables -A FORWARD -t filter -s {A} -j ACCEPT </LOOP> /sbin/tc class add dev eth0 parent 1:0 classid 1:[N1] htb rate 256kbit burst 4k prio 1 /sbin/tc qdisc add dev eth0 parent 1:[N1] handle [N1]: sfq perturb 10 quantum 1500 /sbin/tc class add dev eth0 parent 1:0 classid 1:[N2] htb rate 128kbit burst 4k prio 1 /sbin/tc qdisc add dev eth0 parent 1:[N2] handle [N2]: sfq perturb 10 quantum 1500 <LOOP> /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio [N1] u32 match ip dst {A} flowid 1:[N1] </LOOP> <LOOP> /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio [N2] u32 match ip src {A} flowid 1:[N2] </LOOP> [/OPEN] [CLOSE] <LOOP> /sbin/iptables -D FORWARD -t filter -s {A} -j ACCEPT </LOOP> /sbin/tc filter del dev eth0 parent 1:0 protocol ip prio [N1] /sbin/tc filter del dev eth0 parent 1:0 protocol ip prio [N2] /sbin/tc class del dev eth0 parent 1:0 classid 1:[N1] htb rate 256kbit burst 4k prio 1 /sbin/tc class del dev eth0 parent 1:0 classid 1:[N2] htb rate 128kbit burst 4k prio 1 [/CLOSE] [/DEFAULT]
Здесь теги [OPEN][/OPEN] и [CLOSE] [/CLOSE] - это теги, которые обрабатывает данный конкретный тип manad'а и означают они, соответственно, набор открывающих правил и набор закрывающих правил . Аналогично тег [NX] - тоже обрабатывается самим manad'ом , туда просто вставляется свободный индекс, который увеличивается с каждым новой командой на открытие manad'а. В данном случае отличие от {NX} в том, что это комбинации не обрабатывается га стороне сервера(сервер увеличивает N для каждого ip), а обрабатывается самим manad'ом Т.е. в данном случае на стороне сервера данный набор правил преобразится в:
[OPEN] iptables -A FORWARD -t filter -s 192.168.184.10 -j ACCEPT iptables -A FORWARD -t filter -s 192.168.184.11 -j ACCEPT /sbin/tc class add dev eth0 parent 1:0 classid 1:[N1] htb rate 256kbit burst 4k prio 1 /sbin/tc qdisc add dev eth0 parent 1:[N1] handle [N1]: sfq perturb 10 quantum 1500 /sbin/tc class add dev eth0 parent 1:0 classid 1:[N2] htb rate 128kbit burst 4k prio 1 /sbin/tc qdisc add dev eth0 parent 1:[N2] handle [N2]: sfq perturb 10 quantum 1500 /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio [N1] u32 match ip dst 192.168.184.10 flowid 1:[N1] /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio [N1] u32 match ip dst 192.168.184.11 flowid 1:[N1] /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio [N2] u32 match ip src 192.168.184.10 flowid 1:[N2] /sbin/tc filter add dev eth0 parent 1:0 protocol ip prio [N2] u32 match ip src 192.168.184.11 flowid 1:[N2] [/OPEN] [CLOSE] /sbin/iptables -D FORWARD -t filter -s 192.168.184.10 -j ACCEPT /sbin/iptables -D FORWARD -t filter -s 192.168.184.11 -j ACCEPT /sbin/tc filter del dev eth0 parent 1:0 protocol ip prio [N1] /sbin/tc filter del dev eth0 parent 1:0 protocol ip prio [N2] /sbin/tc class del dev eth0 parent 1:0 classid 1:[N1] htb rate 256kbit burst 4k prio 1 /sbin/tc class del dev eth0 parent 1:0 classid 1:[N2] htb rate 128kbit burst 4k prio 1 [/CLOSE]
Это то, что получит сам manad. Как видим, сервер вырезал теги <LOOP>и {A} Аналогично, подстановки вида {NET} и {NET_MASK} заменяются на выбранные сети для тегов <LOOP_NET> и <LOOP_NET_MASK>. О том, как это происходит, читайте обработку правил Manad.
Manad работает следующим образом . Он получает правила, заменяет в них [NX] на число (в данном случае свободный номер класса по ограничению трафика ), далее делит правила на 2 части: открывающие и закрывающие. Открывающие применяются , а закрывающие запоминаются и применяются при получении команды на закрытие для данного договора.
Для инициализации правил iproute2 в системе используется скрипт init_shaping.sh :
INDEV="eth0" /sbin/tc qdisc del dev $INDEV root 2> /dev/null ##### speed server->client(downstream) /sbin/tc qdisc add dev $INDEV root handle 1: htb default ffff r2q 1 #default /sbin/tc class add dev $INDEV parent 1:0 classid 1:ffff htb rate 100mbit burst 4k prio 3 /sbin/tc qdisc add dev $INDEV parent 1:ffff handle ffff: sfq perturb 10 quantum 1500
Инициализацию правил iptables вы может проводить в зависимости от вашей настройки сети. В данным примере надо, как минимум, установить запрет на цепочку FORWARD таблицы filter, т.к. туда добавляются разрешающие правила. Это можно установкой политики по умолчанию:
/sbin/iptables -P FORWARD REJECT