Настройка шлюза типа Manad под Linux

Здесь предлагается пример 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