Выбранный ответ неверный / неполный. Я столкнулся с подобной проблемой, выбранный ответ дал некоторую помощь, но не достаточно.
Во-первых, следующая команда на самом деле не нужна.
tc qdisc del dev eth0 root
Он «удалит» корневой qdisc, но сразу же будет заменен на pfifo_fast (так что вы не потеряете связь).
Вторая команда:
tc qdisc добавить dev eth0 корневой дескриптор 1: prio
Заменит pdifo_fast qdisc на первичный. По умолчанию первичная очередь имеет 3 полосы (0, 1, 2), каждая из которых управляется одним классом (1: 1, 1: 2 и 1: 3).
Пакеты будут отправлены на один из этих диапазонов с использованием поля TOS пакета IP. Эта конфигурация отображается при выполнении:
tc qdisc ls
глядя на значения «priomap».
Затем вы добавляете netem qdisc:
tc qdisc add dev eth0 parent 1: 1 handle 2: задержка netem 500 мс
С помощью этой команды вы задерживаете весь трафик, идущий в полосу 1: 1 (пока фильтр не будет установлен).
Но есть две оговорки:
- Ваш трафик может иметь другое значение TOS и затем отправляться на другую полосу.
- Prio qdisc можно настроить так, чтобы трафик перешел на другую полосу.
Следующее решило мою проблему, чтобы netem не был затронут, пока фильтр не применен. Вместо вышеуказанных шагов я сделал:
tc qdisc add dev eth0 корневой дескриптор 1: prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
По умолчанию весь трафик будет отправляться на полосу 1: 3.
Затем я добавил правило для задержки трафика:
tc qdisc add dev eth0 родительский дескриптор 1: 1 10: задержка netem 100 мс 10 мс
Это создает qdisc в полосе 0, но так как весь трафик идет в полосу 3, это не повлияло на меня.
После этого я добавил фильтр:
tc filter add dev eth0 протокол ip родительский 1: 0 prio 1 u32 соответствует ip dst 10.0.0.1/32 соответствует ip dport 80 0xffff flowid 1: 1
Теперь с фильтром будут затронуты только выбранный IP / порт, так как мы перенаправляем выбранный трафик в полосу 0.
Весь остальной трафик остается неизменным, поскольку он продолжает передаваться в полосу 3.