Настройка шлюза типа 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