Использование tc для задержки пакетов только на один IP-адрес

20

Я новичок в использовании 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. Но я ничего не могу заставить работать. Как бы мне заставить это работать?

Мэтт Уайт
источник

Ответы:

14

Хорошо, я решил свою проблему. Оказывается, что если вы выполните первые 3 строки выше (те, что "tc qdisc"), это задержит все пакеты, потому что еще нет фильтров. 4-я строка изменяет его так, чтобы задерживать пакеты только с одного IP-адреса. Можно добавить дополнительные строки фильтра, чтобы добавить дополнительные IP-адреса в список «отложенных». Итак: не создавайте строку «netem delay» без фильтра, указывающего на нее.

Мэтт Уайт
источник
Спасибо, что вернулись и опубликовали ответ. Как ни странно, я обнаружил, что в обоих случаях все работает нормально, но в любом случае. Я написал скрипт-обертку для этих трех команд, чтобы помочь с тестированием, просто подумал, что немного
верну
13

Выбранный ответ неверный / неполный. Я столкнулся с подобной проблемой, выбранный ответ дал некоторую помощь, но не достаточно.

Во-первых, следующая команда на самом деле не нужна.

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.

телеграфист
источник
что такое "ip dst 10.0.0.1/32"? Это IP-адрес назначения? Означает ли это, что существует «ip src xxx.yyy.zz.www / aa»?
Зак Фольвик,
Да, это IP-адрес назначения в моем примере. И да, есть опция «ip src».
Телеграфист
Причина первой команды (tc qdisc del) состоит в том, чтобы очистить любое предыдущее состояние - как вы могли бы иметь, если вы экспериментируете, пытаясь заставить это работать. FWIW принятый ответ работал для меня.
Дэн
Спасибо, этот ответ был ДЕЙСТВИТЕЛЬНО полезен.
PepeHands
1

Простой пример с 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
NeilenMarais
источник
Я должен добавить предостережение, позже мне показалось, что задержка была более широкой, чем я ожидал, и я не смог до конца разобраться. Не все движение казалось задержанным все же.
NeilenMarais
0

Мне не удалось задержать трафик на один 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
Николя Хено
источник