Використання 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-адрес до списку "затримки" можуть бути додані додаткові лінії фільтра. Отже: не створюйте рядок "затримка нетему" без фільтра, що вказує на нього.


Дякую за повернення та опублікування відповіді. Як не дивно, я виявив, що це працює нормально обома способами, але все одно. Я написав сценарій обгортки навколо цих трьох команд, щоб допомогти з тестуванням, просто подумав, що я поверну трохи :)
Арран Кадбард-Белл

13

Обрана відповідь невірна / неповна. Я зіткнувся з подібним питанням, обрана відповідь дала деяку допомогу, але недостатньо.

По-перше, наступна команда насправді не потрібна.

tc qdisc del dev eth0 root

Він 'видалить' корінь qdisc, але негайно замінить його на pfifo_fast (так що ви не втратите підключення).

Друга команда:

tc qdisc Додати dev eth0 root ручка 1: prio

Буде замінювати pfifo_fast qdisc пріоритетним. За замовчуванням у черзі пріорі є 3 смуги (0, 1, 2), кожна з яких керується одним класом (1: 1, 1: 2 та 1: 3).

Пакети будуть відправлені в один з цих діапазонів, використовуючи поле TOS пакету IP. Ця конфігурація відображається при виконанні:

tc qdisc ls

дивлячись на значення 'пріомапи'.

Потім ви додаєте netem qdisc:

tc qdisc додати dev eth0 батьків 1: 1 ручка 2: затримка netem 500ms

За допомогою цієї команди ви затримуєте весь трафік, що йде до смуги 1: 1 (поки фільтр не буде встановлений).

Але є два застереження:

  • Ваш трафік може мати інше значення TOS, після чого він буде відправлений в інший діапазон.
  • Пріоритет qdisc може бути налаштований так, що трафік переходить в іншу смугу.

Наступне вирішило мою проблему, щоб нетем не вплинуло, поки фільтр не застосовано. Замість описаних вище кроків я зробив:

tc qdisc додати кореневу обробку dev eth0 1: prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Це передасть увесь трафік за замовчуванням до смуги 1: 3.

Потім я додав правило про затримку руху:

tc qdisc додати dev eth0 батьків 1: 1 ручка 10: затримка немета 100ms 10ms

Це створює qdisc в діапазоні 0, але оскільки весь трафік йде в діапазон 3, на мене це не вплинуло.

Потім я додав фільтр:

tc фільтр додавати протокол 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 прийнята відповідь працювала на мене.
Dan Pritts

Дякую, ця відповідь дійсно була корисною.
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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.