Здравствуйте!
Решил немного переделать на работе простой шейпер, подскажите верно ли все сделано?Для начала опишу условия. Есть два интернет-канала: gw1 (12Мбит/с) и gw2 (3Мбит/с). Один канал запасной. Есть интернет-адреса головной организации, трафик от которых не должен быть выдавлен прочим трафиком, идущим через канал. Назову эти адреса "важные адреса". В iptables на трафик ставятся метки:
- 51 - трафик по каналу gw1 от диапазона "важных адресов"
- 52 - весь остальной трафик по каналу gw1 (все кроме трафика с меткой 51)
- 61 - трафик по каналу gw2 от диапазона "важных адресов"
- 62 - весь остальной трафик по каналу gw2 (все кроме трафика с меткой 61)Кроме раздачи Интернета компьютер выполняет роль файлового хранилища, включенного в локалку гигабитным интерфейсом "lan". Трафик, идущий с интерфейса lan в локальную сеть я и ограничиваю. Сам скрипт шейпера получился такой:
#!/bin/bashlan_if="lan"
lan_ip="192.168.2.1"
lan_ips="192.168.2.0/24"gw1_rate="12000"
gw2_rate="3000"#Удаление имеющихся дисциплин
tc qdisc del dev $lan_if root > /dev/null 2>&1
tc qdisc del dev $lan_if ingress > /dev/null 2>&1#В дефолтный класс в 99% случаев пойдет трафик только через crp-интерфейс
tc qdisc add dev $lan_if root handle 1: htb default 90:
tc class add dev $lan_if parent 1: classid 1:1 htb rate 500mbittc class add dev $lan_if parent 1:1 classid 10: htb rate 480mbit ceil 500mbit
tc class add dev $lan_if parent 1:1 classid 20: htb rate ${gw1_rate}kbit
tc class add dev $lan_if parent 1:1 classid 30: htb rate ${gw2_rate}kbit
tc class add dev $lan_if parent 1:1 classid 90: htb rate 5mbittc class add dev $lan_if parent 20: classid 20:1 htb rate $[6*$gw1_rate/10]kbit ceil ${gw1_rate}kbit
tc class add dev $lan_if parent 20: classid 20:2 htb rate $[4*$gw1_rate/10]kbit ceil ${gw1_rate}kbit
tc class add dev $lan_if parent 30: classid 30:1 htb rate $[7*$gw2_rate/10]kbit ceil ${gw2_rate}kbit
tc class add dev $lan_if parent 30: classid 30:2 htb rate $[3*$gw2_rate/10]kbit ceil ${gw2_rate}kbit#На концы классов помещаем sfq-листы
tc qdisc add dev $lan_if parent 20:1 handle 201: sfq perturb 10
tc qdisc add dev $lan_if parent 20:2 handle 202: sfq perturb 10
tc qdisc add dev $lan_if parent 30:1 handle 301: sfq perturb 10
tc qdisc add dev $lan_if parent 30:2 handle 302: sfq perturb 10#Описание классификаторов
tc filter add dev $lan_if parent 1:1 protocol ip prio 1 u32 match ip src $lan_ip match ip dst $lan_ips flowid 1:10
tc filter add dev $lan_if parent 20: protocol ip prio 2 handle 51 fw flowid 20:1
tc filter add dev $lan_if parent 20: protocol ip prio 4 handle 52 fw flowid 20:2
tc filter add dev $lan_if parent 30: protocol ip prio 3 handle 61 fw flowid 30:1
tc filter add dev $lan_if parent 30: protocol ip prio 5 handle 62 fw flowid 30:2Верно ли все сделано? Я не очень уверен, что верно задал родителей для фильтров. Протестировать работу пока что не могу, но наваять - наваял.
Все таки неправильно я классификаторы написал, их же нужно подсоединять к дисциплине. Получилось так:
#Описание классификаторов
tc filter add dev $lan_if parent 1: protocol ip prio 1 u32 match ip src $lan_ip match ip dst $lan_ips flowid 1:10
tc filter add dev $lan_if parent 1: protocol ip prio 2 handle 51 fw flowid 20:1
tc filter add dev $lan_if parent 1: protocol ip prio 4 handle 52 fw flowid 20:2
tc filter add dev $lan_if parent 1: protocol ip prio 3 handle 61 fw flowid 30:1
tc filter add dev $lan_if parent 1: protocol ip prio 5 handle 62 fw flowid 30:2
Похоже сам на свой вопрос ответил )