LINUX.ORG.RU

[на рецензию] Traffic Control (TC)


0

2

Чуть не вывихнул мозг, разбираясь с «Linux Advanced Routing & Traffic Control», и наконец-то дописал правила TC для домашнего роутера, а теперь представляю Вам на рецензию.

Имеется входящий 4-мегабитный канал от Avangard DSL с 8-мегабитной внутренней локальной сетью и «Яндекс.Локальная сеть». Максимальная скорость исходящего канала так же варьируется, в моем случае от полумегабита до мегабита.

Весь трафик разделен на 5 частей:

  1. SSH — для беспрепятственного доступа на шлюз извне;
  2. ICMP (для красивого пинга) + DNS — опытным путем выявлено, что быстрый ответ DNS-сервера влияет на работу;
  3. IM (ICQ, Jabber);
  4. Почта и HTTP(S);
  5. Остальной трафик, к которому в частности относится торрент-трафик.

Приоритезация делалась в основном для того, чтобы не останавливать и не ограничивать торрент-клиент, когда пользователи домашней сети сёрфят Интернеты.

#!/bin/bash

ip link set dev ifb0 down >/dev/null 2>&1
modprobe ifb
ip link set dev ifb0 up

# reset all qdisc
tc qdisc del dev ppp0 root > /dev/null 2>&1
tc qdisc del dev ifb0 root > /dev/null 2>&1
tc qdisc del dev ppp0 ingress > /dev/null 2>&1
tc qdisc del dev ifb0 ingress > /dev/null 2>&1
#
tc qdisc add dev ppp0 root handle 1:0 htb default 15 r2q 1
tc qdisc add dev ifb0 root handle 1:0 htb default 15 r2q 1
tc qdisc add dev ppp0 handle ffff: ingress
tc class add dev ppp0 parent 1: classid 1:1 htb rate 512kbit ceil 1mbit
tc class add dev ifb0 parent 1: classid 1:1 htb rate 8mbit ceil 8mbit
#
tc class add dev ppp0 parent 1:1 classid 1:11 htb rate 512kbit ceil 1mbit prio 1
tc class add dev ppp0 parent 1:1 classid 1:12 htb rate 512kbit ceil 1mbit prio 2
tc class add dev ppp0 parent 1:1 classid 1:13 htb rate 512kbit ceil 1mbit prio 3
tc class add dev ppp0 parent 1:1 classid 1:14 htb rate 256kbit ceil 1mbit prio 4
tc class add dev ppp0 parent 1:1 classid 1:15 htb rate 8kbit ceil 1mbit prio 5
tc class add dev ifb0 parent 1:1 classid 1:11 htb rate 8mbit ceil 8mbit prio 1
tc class add dev ifb0 parent 1:1 classid 1:12 htb rate 8mbit ceil 8mbit prio 2
tc class add dev ifb0 parent 1:1 classid 1:13 htb rate 8mbit ceil 8mbit prio 3
tc class add dev ifb0 parent 1:1 classid 1:14 htb rate 4mbit ceil 8mbit prio 4
tc class add dev ifb0 parent 1:1 classid 1:15 htb rate 8kbit ceil 8mbit prio 5
#
tc qdisc add dev ppp0 parent 1:11 handle 11: sfq perturb 10 quantum 1500
tc qdisc add dev ppp0 parent 1:12 handle 12: sfq perturb 10 quantum 1500
tc qdisc add dev ppp0 parent 1:13 handle 13: sfq perturb 10 quantum 1500
tc qdisc add dev ppp0 parent 1:14 handle 14: sfq perturb 10 quantum 1500
tc qdisc add dev ppp0 parent 1:15 handle 15: sfq perturb 10 quantum 1500
tc qdisc add dev ifb0 parent 1:11 handle 11: sfq perturb 10 quantum 1500
tc qdisc add dev ifb0 parent 1:12 handle 12: sfq perturb 10 quantum 1500
tc qdisc add dev ifb0 parent 1:13 handle 13: sfq perturb 10 quantum 1500
tc qdisc add dev ifb0 parent 1:14 handle 14: sfq perturb 10 quantum 1500
tc qdisc add dev ifb0 parent 1:15 handle 15: sfq perturb 10 quantum 1500
#
# ssh
tc filter add dev ppp0 parent 1:0 prio 1 protocol ip u32 match ip protocol 6 0xff match ip dport 22 0xfffe classid 1:11
tc filter add dev ppp0 parent 1:0 prio 1 protocol ip u32 match ip protocol 6 0xff match ip sport 22 0xfffe classid 1:11
tc filter add dev ifb0 parent 1:0 prio 1 protocol ip u32 match ip protocol 6 0xff match ip dport 22 0xfffe classid 1:11
tc filter add dev ifb0 parent 1:0 prio 1 protocol ip u32 match ip protocol 6 0xff match ip sport 22 0xfffe classid 1:11
# icmp
tc filter add dev ppp0 parent 1:0 prio 2 protocol ip u32 match ip protocol 1 0xff classid 1:12
tc filter add dev ifb0 parent 1:0 prio 2 protocol ip u32 match ip protocol 1 0xff classid 1:12
# dns
tc filter add dev ppp0 parent 1:0 prio 2 protocol ip u32 match ip dport 53 0xffff classid 1:12
tc filter add dev ifb0 parent 1:0 prio 2 protocol ip u32 match ip sport 53 0xffff classid 1:12
# icq
tc filter add dev ppp0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip dport 5190 0xffff classid 1:13
tc filter add dev ifb0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 5190 0xffff classid 1:13
# jabber
tc filter add dev ppp0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip dport 5222 0xffff classid 1:13
tc filter add dev ppp0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip dport 5223 0xffff classid 1:13
tc filter add dev ifb0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 5222 0xffff classid 1:13
tc filter add dev ifb0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 5223 0xffff classid 1:13
# smtp
tc filter add dev ppp0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip dport 25 0xffff classid 1:14
tc filter add dev ifb0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 25 0xffff classid 1:14
# pop3
tc filter add dev ppp0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip dport 110 0xffff classid 1:14
tc filter add dev ifb0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 110 0xffff classid 1:14
# imap
tc filter add dev ppp0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip dport 143 0xffff classid 1:14
tc filter add dev ifb0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 143 0xffff classid 1:14
# ftp
tc filter add dev ppp0 parent 1:0 prio 4 protocol ip u32 match ip protocol 6 0xff match ip dport 20 0xffff classid 1:14
tc filter add dev ppp0 parent 1:0 prio 4 protocol ip u32 match ip protocol 6 0xff match ip dport 21 0xffff classid 1:14
tc filter add dev ifb0 parent 1:0 prio 4 protocol ip u32 match ip protocol 6 0xff match ip sport 20 0xffff classid 1:14
tc filter add dev ifb0 parent 1:0 prio 4 protocol ip u32 match ip protocol 6 0xff match ip sport 21 0xffff classid 1:14
# http
tc filter add dev ppp0 parent 1:0 prio 4 protocol ip u32 match ip protocol 6 0xff match ip dport 80 0xffff classid 1:14
tc filter add dev ppp0 parent 1:0 prio 4 protocol ip u32 match ip protocol 6 0xff match ip sport 80 0xffff classid 1:14
tc filter add dev ifb0 parent 1:0 prio 4 protocol ip u32 match ip protocol 6 0xff match ip dport 80 0xffff classid 1:14
tc filter add dev ifb0 parent 1:0 prio 4 protocol ip u32 match ip protocol 6 0xff match ip sport 80 0xffff classid 1:14
# https
tc filter add dev ppp0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip dport 443 0xffff classid 1:14
tc filter add dev ppp0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 443 0xffff classid 1:14
tc filter add dev ifb0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip dport 443 0xffff classid 1:14
tc filter add dev ifb0 parent 1:0 prio 3 protocol ip u32 match ip protocol 6 0xff match ip sport 443 0xffff classid 1:14
#
tc filter add dev ppp0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

чего-то мне кажется, что вот эта строка не будет работать
tc filter add dev ppp0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

Z0termaNN ()
Ответ на: комментарий от Z0termaNN

Нет, тут все работает и трафик успешно заворачивается на ifb0.

j0ker1 ()

Если всё устраивает, так что тогда спрашивать... А так, может имеет смысл в исходящем трафике (ppp0) сделать отдельную полосу для TCP syn и ack пакетов.

И если все разрешать до 8 Мбит, а провайдер даёт 4 Мбит, то это не создаёт проблемы?

mky ★★★★★ ()
Ответ на: комментарий от mky

> Если всё устраивает, так что тогда спрашивать

Чтоб услышать конструктивную критику и сделать еще лучше. Я же первый раз приоритезацию делаю, может накосячил где-то, хотя и брал за основу один из Ваших примеров :)

> если все разрешать до 8 Мбит, а провайдер даёт 4 Мбит, то это не создаёт проблемы

Согласен, странно, но я не смог придумать другого способа не потерять плюсов внутренней сети провайдера. Есть предложения?

j0ker1 ()
Ответ на: комментарий от j0ker1

>если все разрешать до 8 Мбит, а провайдер даёт 4 Мбит, то это не создаёт проблемы

Шейпер станет хуже работать - только и всего...

>Есть предложения?


поделить трафик по ip-сетям?

Pinkbyte ★★★★★ ()
Ответ на: комментарий от Pinkbyte

> поделить трафик по ip-сетям?

Вариант конечно, но не слишком ли много правил получится если еще и Яндексовские айпишники выдрать?

Вопрос: оправдано ли использование ifb-интерфейса, если трафик вначале приходит на физический eth0, а потом уже на ppp0?

j0ker1 ()
Ответ на: комментарий от j0ker1

>но не слишком ли много правил получится

ну так правило для ifb можно сделать одно - на основе маркировок iptables.

Pinkbyte ★★★★★ ()
Ответ на: комментарий от Pinkbyte

> ну так правило для ifb можно сделать одно - на основе маркировок iptables.

Где-то читал, что входящие пакеты попадают вначале в tc, а потом уже в iptables, соответственно метки бессмысленны.

j0ker1 ()
Ответ на: комментарий от Pinkbyte

>ну так правило для ifb можно сделать одно - на основе маркировок iptables.

Вот этого делать как раз не нужно. Если много сетей - используйте хештаблицы.

ventilator ★★★ ()
Ответ на: комментарий от j0ker1

тьфу, да, ступил. естественно метки - бессмысленны

Pinkbyte ★★★★★ ()
Ответ на: комментарий от ventilator

хештаблицы имеет смысл нужно использовать с 50 и более сетей/непересекающихся адресов, ЕМНИП

Pinkbyte ★★★★★ ()
Ответ на: комментарий от j0ker1

>но не слишком ли много

ИМХО, не так уж и много. Но, наверное, можно вобще грубо отсечь всё сетями класса B, что то типа «89.110.0.0/16; 91.122.0.0/16; 78.36.0.0/16 и т.д.» и дать для них отдельные 4 Мбит. Должно быть точнее.

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.