Я новичок в использовании tc и netem. Я хочу отложить отправку пакетов на определенный IP-адрес. Однако приведенные ниже команды вызывают задержку всех пакетов в системе, а не только на IP-адрес 1.2.3.4:
tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1
Я предполагаю, что мне нужен какой-то универсальный фильтр в конце, чтобы указать, что весь оставшийся трафик не должен проходить через netem. Но я ничего не могу заставить работать. Как мне заставить это работать?
Хорошо, я решил свою проблему. Оказывается, если вы выполните первые 3 строки выше (те, что «tc qdisc»), он задержит все пакеты, потому что фильтров еще нет. Четвертая строка меняет его так, чтобы задерживать только пакеты с этого единственного IP-адреса. Можно добавить дополнительные строки фильтра, чтобы добавить дополнительные IP-адреса в «отложенный» список. Итак: не создавайте линию «netem delay», если на нее не указывает фильтр.
Выбранный ответ неверный / неполный. Я столкнулся с аналогичной проблемой, выбранный ответ помог, но недостаточно.
Во-первых, следующая команда на самом деле не нужна.
tc qdisc del dev eth0 root
Он «удалит» корневой qdisc, но сразу же будет заменен на pfifo_fast (чтобы вы не потеряли соединение).
Вторая команда:
tc qdisc add dev eth0 корневой дескриптор 1: prio
Заменим qdisc pfifo_fast на prio. По умолчанию приоритетная очередь имеет 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 delay 500 мс
С помощью этой команды вы задерживаете весь трафик, идущий в полосу 1: 1 (пока не будет установлен фильтр).
Но есть два предостережения:
Следующее решило мою проблему, чтобы на нее не влиял 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 parent 1: 1 handle 10: netem delay 100ms 10ms
Это создает qdisc в полосе 0, но поскольку весь трафик идет на полосу 3, это не повлияло на меня.
После этого я добавил фильтр:
tc filter add dev протокол eth0 ip parent 1: 0 prio 1 u32 match ip dst 10.0.0.1/32 match ip dport 80 0xffff flowid 1: 1
Теперь с фильтром будет затронут только выбранный IP / порт, поскольку мы перенаправляем выбранный трафик в полосу 0.
Весь остальной трафик остается неизменным, поскольку он продолжает поступать на полосу 3.
Простой пример из https://wiki.linuxfoundation.org/networking/netem который позволяет задерживать пакеты на данный IP-адрес, не влияя на другой трафик, даже во время настройки:
tc qdisc del dev eth0 root # Ensure you start from a clean slate
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 500ms
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
match ip dst 192.168.1.2 flowid 1:3
Мне не удалось задержать трафик на один IP-адрес, сохраняя нормальный трафик для других IP-адресов с помощью метода, описанного в этом потоке.
Однако мне удается это сделать с помощью следующих команд.
tc qdisc add dev eth0 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
tc qdisc add dev eth0 parent 1:2 handle 20: netem delay 0ms
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip src `hostname -I` flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 15001ms
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 1.2.3.4 flowid 1:1
Отложить 15001ms
трафик на IP 1.2.3.4
с хоста, на котором выполняется команда. Команда hostname -I
используется для получения основного IP-адреса хоста, но значение можно заменить непосредственно внутри команды.
Мне пришлось добавить еще один фильтр с 0ms
задержка для соответствия трафику, исходящему от хоста. Конечно, это не элегантно, но мне не удалось найти что-то более приятное.
Последнюю команду можно заменить, чтобы она соответствовала одному порту.
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 18583 0xffff flowid 1:1
Чтобы задержать трафик в порт 18583
вместо IP 1.2.3.4
.
Я также нашел второй метод на этом ответ задерживать движение к 1.2.3.4:18583
без влияния на другой трафик.
tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip parent 1: prio 1 u32 match ip dst 1.2.3.4 match ip dport 18583 0xffff flowid 1:1
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip protocol 1 0xff flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10ms
tc qdisc add dev eth0 parent 1:2 handle 20: sfq