Я новичок в 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 для подробных объяснений.