Вопрос или проблема
Я использую Ubuntu 24.04. Мне нужно создать мост для имитации джиттера с помощью TC-Netem между двумя устройствами, но это не работает с тем, что я сейчас делаю.
У меня есть настройка, состоящая из 3 единиц. Одно из них генерирует сетевые UDP-пакеты (Устройство A), которые он отправляет на входной интерфейс Ubuntu (enx7cc2c6474599), это должно имитировать джиттер и беспорядок в пересылке через мост, который состоит из интерфейса (enx7cc2c6474599) и интерфейса (enx7cc2c6331825), называемого br0.
Через этот мост должен отправляться трафик, подверженный джиттеру, на Устройство B через интерфейс (enx7cc2c6331825).
Мост создается с помощью этого набора команд, чтобы работать:
sudo ip link add name br0 type bridge
sudo ip link set enx7cc2c6474599 master br0
sudo ip link set enx7cc2c6331825 master br0
sudo ip link set enx7cc2c6474599 up
sudo ip link set enx7cc2c6331825 up
sudo ip link set br0 up
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl net.ipv4.conf.all.forwarding
sudo sysctl net.ipv4.conf.default.forwarding
sudo sysctl -p
Затем для тестирования я отправляю трафик, и я могу видеть его идеально на Устройстве B. Но когда я делаю:
sudo tc qdisc add dev enx7cc2c6474599 root netem delay 10ms 8ms distribution normal
sudo tc qdisc add dev enx7cc2c6331825 root netem delay 10ms 8ms distribution normal
Я не могу видеть пакеты в правильном порядке и без джиттера. Я также пробовал использовать команду “tc qdisc” на br0 (мосте) с теми же или худшими результатами.
Я также пробовал это:
sudo tc qdisc add dev enx7cc2c6474599 root netem delay 10ms 40ms reorder 25%
sudo tc qdisc add dev enx7cc2c6331825 root netem delay 10ms 40ms reorder 25%
Вот описание интерфейсов:
br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 5e:96:25:d5:26:df brd ff:ff:ff:ff:ff:ff
inet6 fe80::5c96:25ff:fed5:26df/64 scope link
valid_lft forever preferred_lft forever
enx7cc2c6474599: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 7c:c2:c6:47:45:99 brd ff:ff:ff:ff:ff:ff
enx7cc2c6331825: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 7c:c2:c6:33:18:25 brd ff:ff:ff:ff:ff:ff
Мне нужно точно воспроизвести то же самое. На самом деле я даже оформил заказ на Beelink EQ12, чтобы использовать его в качестве специального устройства-эмулятора задержки/джиттера для моего проекта. Планировал установить на него 24.04, пока не увидел ваш пост.
У вас был какой-либо успех? Знаете ли вы, является ли это проблемой, специфичной для 24.04, или связанной с конфигурацией?
Спасибо
Ответ или решение
Проблемы с сетью: использование TC-Netem для симуляции джиттера через мост в Ubuntu 24.04
Ваша задача по симуляции джиттера с использованием TC-Netem на Ubuntu 24.04 очень интересна, но, к сожалению, вы столкнулись с распространенной проблемой, связанной с работой сетевых интерфейсов в мостах и применением сетевых очередей. Давайте подробнее рассмотрим ваш сценарий, выявим возможные проблемы и предложим пути их решения.
Настройка сети
Как видно из вашего описания, вы настроили мост br0
, объединив два физические интерфейса: enx7cc2c6474599
и enx7cc2c6331825
. После этого вы правильно активировали мост и включили маршрутизацию с помощью команды sysctl
. Однако использование [tc qdisc]
на мастер-интерфейсах (то есть на enx7cc2c6474599
и enx7cc2c6331825
) может приводить к непредсказуемым результатам, поскольку трафик, проходящий через них, уже обрабатывается мостом.
Проблемы с конфигурацией TC-Netem
-
Распространение сетевых очередей: При добавлении сетевых очередей
tc
на физические интерфейсы, можно не достичь ожидаемого результата, поскольку мост обрабатывает пакеты несколько иначе. Сначала стоит применитьtc qdisc
непосредственно к мостуbr0
, чтобы контролировать весь проходящий через него трафик.sudo tc qdisc add dev br0 root netem delay 10ms 8ms distribution normal
-
Проверка настроек: Убедитесь, что вы правильно применили команды
tc
. Рекомендуется сначала удалить существующие настройки для интерфейсов:sudo tc qdisc del dev enx7cc2c6474599 root sudo tc qdisc del dev enx7cc2c6331825 root sudo tc qdisc del dev br0 root
Затем добавьте задержку к
br0
, как указано выше.
Выполнение проверок
Чтобы диагностировать, как именно сетевые пакеты передаются, используйте инструменты мониторинга, такие как tcpdump
, для проверки трафика на разных интерфейсах. Это поможет вам убедиться, что джиттер и порядок пакетов действительно изменяются.
sudo tcpdump -i br0
Альтернативы и дополнительные рекомендации
Если вышеуказанные действия не помогли, вы можете рассмотреть следующие альтернативы:
-
Использование других виртуализаций: Попробуйте использовать
veth
парные интерфейсы вместо моста, если это возможно в вашей архитектуре. Они могут предоставить более предсказуемое поведение для тестирования джиттера. -
Настройка pfifo_fast: Убедитесь, что ваша политикаFIFO не мешает тому, что вы пытаетесь реализовать. Вы можете применить
tc
к общему qdisc, чтобы настроить его соответствующим образом.
Заключение
Сетевые приложения на Linux, такие как TC и Netem, могут быть мощными инструментами для симуляции различных условий сети, но их настройка может вызывать трудности. Проблемы, которые вы описали, могут быть связаны как с конфигурацией, так и с особенностями работы в Ubuntu 24.04. Надеюсь, предложенные решения помогут вам настроить симуляцию джиттера для вашего проекта. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за поддержкой.