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

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

Я новичок в использовании 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 (пока не будет установлен фильтр).

Но есть два предостережения:

  • Ваш трафик может иметь другое значение 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 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