Назад | Перейти на главную страницу

объяснение фильтра tc / netem

Я новичок в tc, и я нахожу это очень запутанным, я смог найти и немного понять небольшой поток команд, чтобы выдать задержку на конкретном IP-адресе, но я не думаю, что это работает должным образом - задержка всего трафика, возможного для этого IP-адреса. Думаю, я неправильно понял / не понял некоторые параметры.

Иногда это определенно работает, но у меня есть сомнения, так как это не согласованно, как будто трафик иногда имеет другой приоритет, который не задерживается, мэбай? Точно сказать не могу

(насколько я знаю - иногда я могу сломать приложение, которое отправляет запрос на сервер, на который я задерживаю трафик, иногда он просто работает так, как будто ничего не задерживается, даже при использовании вроде 50000 мс)

Вот что я использую:

tc qdisc add dev eth1 root handle 1: prio
tc filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip src 1.1.1.1 flowid 1:3
tc qdisc add dev eth1 parent 1:1 handle 2: netem delay 20000ms 

Вы можете направить фильтр только на класс или корневой диск. Поэтому, если вы хотите применить разные qdisc к каждому источнику IP, вам понадобится более одного класса. Тогда у вас будет:

root qdisc <--> несколько классов <--> на qdisc в каждом классе

Затем ваш фильтр будет направлять трафик в класс, листовой qdisc этого класса будет использовать netem. Например (это часть одного из моих сценариев, это не совсем то же самое, этот код здесь, чтобы объяснить корень и листья):

# root qdisc
# Interface eth1, qdisc: htb, default leaf: 1000
tc qdisc add dev $LAN_IFACE root handle 1:0 htb default 1000 r2q 200

# root class
# Interface eth1, parent: 2:0, id: 2:11
tc class add dev $LAN_IFACE parent 1:0 classid 1:10 htb rate ${LOCAL_DL_USED}kbit ceil ${LOCAL_DL_USED}kbit quantum 100

# CLASS 1
tc class add dev $LAN_IFACE parent 1:10 classid 1:100 htb rate ${LOCAL_DL_INTERACTIVE}kbit ceil ${LOCAL_DL_INTERACTIVE}kbit burst 5k prio 0 linklayer ethernet quantum 1000
# QDISC of class 1
tc qdisc add dev $LAN_IFACE parent 1:100 handle 110: pfifo limit 1000
# FILTER to class 1
tc filter add dev $LAN_IFACE parent 1:0 protocol ip prio 0 handle 100 fw flowid 1:100

# CLASS 2
tc class add dev $LAN_IFACE parent 1:10 classid 1:200 htb rate ${LOCAL_DL_SSH}kbit ceil ${LOCAL_DL_SSH}kbit prio 1 linklayer ethernet quantum 1000
# QDISC of class 2
tc qdisc add dev $LAN_IFACE parent 1:200 handle 210: sfq perturb 10
# FILTER to class 2
tc filter add dev $LAN_IFACE parent 1:0 protocol ip prio 1 handle 200 fw flowid 1:200

Вы можете взглянуть на Путешествие в центр ядра Linux для подробных объяснений.