Формирование трафика на входящем трафике (tc qdiscs)

Вопрос или проблема

У меня есть TCP-данные, которые передаются от виртуальной машины Vagrant к хосту. Интерфейс на хосте отображается как vboxnet0. На хосте я пытаюсь достичь эффекта, похожего на подключение к медленному каналу. Для этого я создал qdisc HTB на хосте (vboxnet0) и прикрепил к нему netem, чтобы смоделировать задержки. Я быстро понял, что эти qdiscs действуют на исходящий трафик, а не на входящий. Это не дает ожидаемого эффекта на очереди (я измеряю накопление и освобождение пакетов в очереди из-за определенных условий канала).

Чтобы обойти эту проблему, я попытался использовать IFB и настроить qdiscs так, чтобы входящий трафик на определенном интерфейсе рассматривался как исходящий трафик на интерфейсе ifb. Однако я не могу понять, как происходит поток пакетов. Пока что вот что я попытался сделать:

tc qdisc add dev vboxnet0 ingress // Добавление входящей очереди на интерфейсе ВМ на хосте.
tc filter add dev vboxnet0 parent ffff: protocol ip prio 1 u32 match u32 0 0 action mirred egress redirect dev ifb0 // Зеркалирование входящего трафика
tc qdisc add dev ifb0 root handle 1: htb default 10 // Добавление HTB к интерфейсу IFB
tc class add dev ifb0 parent 1: classid 1:1 htb rate 1mbit ceil 1mbit // Создание класса для ограничения ширины канала
tc qdisc add dev ifb0 parent 1:1 handle 2: netem delay 100ms limit 64 // Присоединение qdisc netem к классу для введения задержек и ограничений очерёдности

Проблема в том, что я не вижу никакого трафика, проходящего через qdisc netem. Я уверен, что моё понимание того, как протекает трафик, неверно. Как мне подойти к решению своей проблемы?

Ответ или решение

Для решения вашей проблемы с формированием трафика на входе с помощью qdiscs в Linux, давайте детально рассмотрим, как именно можно настроить трафик на интерфейсе vboxnet0 и использовать IFB (Intermediate Functional Block) для манипуляции входящим трафиком.

Понимание потока пакетов

Вы абсолютно правы в своем понимании, что tc управляет egress-трафиком, а не ingress. Для работы с входящим трафиком необходимо использовать IFB. Давайте уточним, как настроить это правильно.

  1. Создание IFB интерфейса:
    Убедитесь, что интерфейс IFB существует. Если его еще нет, его можно создать с помощью следующей команды:

    ip link add ifb0 type ifb
    ip link set dev ifb0 up
  2. Настройка tc на vboxnet0:
    Теперь, чтобы настроить фильтрацию трафика и перенаправление в IFB, выполните следующие команды:

    tc qdisc add dev vboxnet0 ingress
    tc filter add dev vboxnet0 parent ffff: protocol ip prio 1 u32 match u32 0 0 action mirred egress redirect dev ifb0

    Эти команды создают очередь для входящего трафика (ingress) на интерфейсе vboxnet0 и перенаправляют весь трафик на IFB-интерфейс ifb0.

  3. Настройка tc на IFB:
    Теперь вы можете настроить tc для управления трафиком на ifb0:

    tc qdisc add dev ifb0 root handle 1: htb default 10
    tc class add dev ifb0 parent 1: classid 1:1 htb rate 1mbit ceil 1mbit
    tc qdisc add dev ifb0 parent 1:1 handle 2: netem delay 100ms limit 64

    Здесь вы задаете политику HTB (Hierarchical Token Bucket) для ограничения полосы пропускания и добавляете задержку с помощью netem.

Мониторинг трафика

Чтобы убедиться, что ваша настройка работает, вы можете использовать утилиты для мониторинга, такие как tc -s qdisc show dev ifb0 и tc -s class show dev ifb0. Это позволит вам увидеть статистику по очередям и классам.

Проблемы с отсутствием трафика

Если вы не видите трафика, проходящего через netem, возможные причины могут быть следующими:

  1. Проблемы с сетевым подключением: Убедитесь, что трафик действительно проходит через vboxnet0. Проверьте, чтобы в вашем VM не были задействованы другие интерфейсы или NAT.

  2. Фильтрация трафика: Убедитесь, что фильтр настроен правильно и соответствует типам пакетов, которые вы хотите обрабатывать.

  3. Отладка: Используйте команды tcpdump для захвата пакетов на vboxnet0 и ifb0, чтобы увидеть, проходят ли пакеты через указанные интерфейсы.

Заключение

Таким образом, ключевым моментом является правильное использование IFB для управления входящим трафиком, что позволяет имитировать задержки и пропускную способность. Следуя приведенным инструкциям, вы сможете достичь желаемого поведения трафика на вашем хосте.

Оцените материал
Добавить комментарий

Капча загружается...