Вопрос или проблема
У меня есть камера, которая создает трафик RTSP. Я подключил ее к ПК с Linux через Ethernet, настроил сеть и доступ. Но когда я попытался применить правила QoS, статистика tc показала, что передано слишком мало байтов.
После некоторых исследований я обнаружил, что HTTP, SSH и RTSP (соединение) трафик с камеры отображался правильно в статистике. Однако, похоже, что tc работает иначе с RTP-трафиком.
Видео в VLC воспроизводилось, nft и tcpdump показывали трафик. Я пробовал использовать Debian 12, Ubuntu 24.04, Manjaro – это все равно не сработало. Имитация RTP с помощью FFMPEG также не принесла успеха. Это кажется действительно странным, и я не знал, что могло вызвать проблему или что еще попробовать.
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, как система управления трафиком на Linux (tc) обрабатывает RTP-трафик, и это довольно распространённая ситуация. Давайте рассмотрим возможные причины и пути решения.
1. Особенности RTP-трафика
Протокол RTP (Real-time Transport Protocol) за обычно работает на верхнем уровне UDP. Важно отметить, что всё, что стоит выше протокола IP, может быть трудно контролировать с помощью стандартных инструментов QoS, таких как tc. RTP обычно не устанавливает собственные соединения, а вместо этого используется для передачи потоковых данных на заранее заданные порты.
2. Проверка конфигурации tc
Перед началом диагностики стоит убедиться, что вы правильно настроили правила QoS. Проверьте следующие моменты:
- Правильный интерфейс: Убедитесь, что вы настраиваете QoS на правильном сетевом интерфейсе.
- Правила iptables: Убедитесь, что нет правил iptables, которые могли бы блокировать или пересылают RTP-трафик.
- Правильные классы и фильтры tc: Убедитесь, что вы используете корректные фильтры для идентификации RTP-трафика. Например, попробовать установить фильтр на основе портов UDP (обычно RTP использует порты 5004 и 5005, но может быть и другой) или на основе IP-адресов.
Пример команды для добавления фильтра:
tc filter add dev <interface> protocol ip parent 1:0 prio 1 u32 match ip protocol 17 0xff match ip dport 5004 0xffff flowid 1:1
3. Использование tcpdump
Проверка трафика с помощью tcpdump позволяет вам убедиться, что RTP-трафик действительно проходит через интерфейс. Используйте следующую команду:
tcpdump -i <interface> udp port 5004
Или, если ваш RTP-трафик использует другой порт, замените 5004 на актуальный порт.
4. Применение nftables
Возможно, вам понадобится настроить nftables
для обработки трафика или маркировки пакетов так, чтобы tc мог его видеть. Вот пример базовой настройки для маркировки RTP-трафика:
nft add table ip filter
nft add chain ip filter input { type filter hook input priority 0; }
nft add rule ip filter input udp dport 5004 mark set 1
5. Применение tcdump и мониторинг
Если трафик RTP виден в tcpdump, но tc не показывает его, вам стоит убедиться, что вы запустили мониторинг tcdump аналогично:
tc -s qdisc show dev <interface>
Это покажет статистику по трафику и позволит вам определить, как именно трафик обрабатывается.
6. Дополнительные инструменты
Если проблема всё ещё не решена, попробуйте другие инструменты для мониторинга и управления трафиком, такие как wondershaper
, tcng
или htb
.
Заключение
Если после всех вышеуказанных действий проблема сохранится, стоит учитывать, что подобные проблемы могут быть связаны с особенностями вашего конкретного сетевого оборудования, конфигурацией или драйверами. Попробуйте также воспользоваться форумами и сообществами по Linux для поиска аналогичных случаев. Помните, что работа с QoS и трафиком требует тщательной проверки каждой составляющей вашей настройки.