История изменений
Исправление nickleiten, (текущая версия) :
В общем случае моно написать скрипт, который будет устанавливать параметры шейпера при старте системы. Я его обычно называю /etc/rc.tc.
Чтоб скрипт можно было перезапускать с новыми параметрами, первой строкой удаляем старые классы, дисциплины и фильтры командой:
tc qdisc del dev eth0 root
Далее определяем базовую/корневую дисциплину на интерфейсе с указанием класса по-умолчанию:
tc qdisc add dev eth0 root handle 1: htb default 10
После чего создаём этот класс с дисциплиной. Они будут резать скорость для пакетов по-умолчанию (если не нужно ограничивать, то подставляем скорость интерфейса, например, 100мбит):
tc class add dev eth0 parent 1: classid 1:10 htb rate 100mbit prio 3
tc qdisc add dev eth0 parent 1:10 handle 10 sfq perturb 10
С этого момента мы уже и начинаем резать скорость по критериям. То есть, правила выше не меняются при каждом запуске, а ниже мы уже фомрируем/режем как надо под каждого клиента. Создаём класс и дисциплину с ограничением в 10мбит:
tc class add dev eth0 parent 1: classid 1:101 htb rate 10mbit prio 3
tc qdisc add dev eth0 parent 1:101 handle 101 sfq perturb 10
И указываем фильтром какой именно трафик будет идти в этот класс:
tc filter add dev eth0 parent 1: prio 5 protocol 802_3 u32 match ether dst 00:11:22:33:44:55 match u16 0x0800 0xffff at -2 flowid 1:101
tc filter add dev eth1 parent 1: protocol ip prio 5 u32 match u16 0x0800 0xffff at -2 match u32 0x22334455 0xffffffff at -12 match u16 0x0011 0xffff at -14 flowid 1:101
Целиком скрипт:
#!/bin/sh
DEV="eth0";
DEFRATE="100mbit";
#delete old rules
tc qdisc del dev $DEV root;
#root discipline
tc qdisc add dev $DEV root handle 1: htb default 10
#default class and discipline
tc class add dev $DEV parent 1: classid 1:10 htb rate $DEFRATE prio 3
tc qdisc add dev $DEV parent 1:10 handle 10 sfq perturb 10
#client 1
tc class add dev $DEV parent 1: classid 1:101 htb rate 10mbit prio 3
tc qdisc add dev $DEV parent 1:101 handle 101 sfq perturb 10
tc filter add dev $DEV parent 1: prio 5 protocol 802_3 u32 match ether dst 00:11:22:33:44:55 match u16 0x0800 0xffff at -2 flowid 1:101
#client 2
tc class add dev $DEV parent 1: classid 1:102 htb rate 10mbit prio 3
tc qdisc add dev $DEV parent 1:102 handle 102 sfq perturb 10
tc filter add dev $DEV parent 1: prio 5 protocol 802_3 u32 match ether dst 00:22:33:44:55:66 match u16 0x0800 0xffff at -2 flowid 1:102
PS. Скрипт надо бы проверить, могут быть опечатки.
Исходная версия nickleiten, :
В общем случае моно написать скрипт, который будет устанавливать параметры шейпера при старте системы. Я его обычно называю /etc/rc.tc.
Чтоб скрипт можно было перезапускать с новыми параметрами, первой строкой удаляем старые классы, дисциплины и фильтры командой:
tc qdisc del dev eth0 root
Далее определяем базовую/корневую дисциплину на интерфейсе с указанием класса по-умолчанию:
tc qdisc add dev eth0 root handle 1: htb default 10
После чего создаём этот класс с дисциплиной. Они будут резать скорость для пакетов по-умолчанию (если не нужно ограничивать, то подставляем скорость интерфейса, например, 100мбит):
tc class add dev eth0 parent 1: classid 1:10 htb rate 100mbit prio 3
tc qdisc add dev eth0 parent 1:10 handle 10 sfq perturb 10
С этого момента мы уже и начинаем резать скорость по критериям. То есть, правила выше не меняются при каждом запуске, а ниже мы уже фомрируем/режем как надо под каждого клиента. Создаём класс и дисциплину с ограничением в 10мбит:
tc class add dev eth0 parent 1: classid 1:101 htb rate 10mbit prio 3
tc qdisc add dev eth0 parent 1:101 handle 101 sfq perturb 10
И указываем фильтром какой именно трафик будет идти в этот класс:
tc filter add dev eth0 parent 1: prio 5 protocol 802_3 u32 match ether dst 00:11:22:33:44:55 match u16 0x0800 0xffff at -2 flowid 1:101
tc filter add dev eth1 parent 1: protocol ip prio 5 u32 match u16 0x0800 0xffff at -2 match u32 0x22334455 0xffffffff at -12 match u16 0x0011 0xffff at -14 flowid 1:101
Целиком скрипт:
#!/bin/sh
DEV="eth0";
DEFRATE="100mbit";
#delete old rules
tc qdisc del dev $DEV root;
#root discipline
tc qdisc add dev $DEV root handle 1: htb default 10
#default class and discipline
tc class add dev $DEV parent 1: classid 1:10 htb rate $DEFRATE prio 3
tc qdisc add dev $DEV parent 1:10 handle 10 sfq perturb 10
#client 1
tc class add dev $DEV parent 1: classid 1:101 htb rate 10mbit prio 3
tc qdisc add dev $DEV parent 1:101 handle 101 sfq perturb 10
tc filter add dev $DEV parent 1: prio 5 protocol 802_3 u32 match ether dst 00:11:22:33:44:55 flowid 1:101
#client 2
tc class add dev $DEV parent 1: classid 1:102 htb rate 10mbit prio 3
tc qdisc add dev $DEV parent 1:102 handle 102 sfq perturb 10
tc filter add dev $DEV parent 1: prio 5 protocol 802_3 u32 match ether dst 00:22:33:44:55:66 flowid 1:102