Вопрос или проблема
Я хотел сделать IP-камеру доступной в Интернете через туннель WireGuard, схема выглядит так:
Клиент --—> СерверA -—-(wireguard)---> СерверB ---(LAN)--—> Камера
Я настроил правильные правила DNAT и SNAT; но работает только TCP, UDP — нет. 🤔
Правила для СерверA:
table inet filter {
chain prerouting {
type nat hook prerouting priority 0; policy accept;
##IPcam
iifname eth0 tcp dport 5541 dnat ip to 192.168.2.2:5541
iifname eth0 udp dport 5541 dnat ip to 192.168.2.2:5541
}
chain postrouting {
type nat hook postrouting priority 0; policy accept;
oifname eth0 masquerade
##IPcam
oifname wg2 ip daddr 192.168.2.2 tcp dport 5541 snat to 192.168.2.1
oifname wg2 ip daddr 192.168.2.2 udp dport 5541 snat to 192.168.2.1
}
}
Правила для СерверB:
table inet filter {
chain prerouting {
type nat hook prerouting priority 0; policy accept;
##IPcam
iifname wg0 tcp dport 5541 dnat ip to 192.168.5.63:554
iifname wg0 udp dport 5541 dnat ip to 192.168.5.63:554
}
chain postrouting {
type nat hook postrouting priority 0; policy accept;
oifname eth0 masquerade
}
}
При потоковой передаче через TCP все работает идеально, но через UDP не работает.
// tcp работает
mpv --rtsp-transport=tcp rtsp://serverA:5541/Streaming/Channels/1
// udp не работает
mpv --rtsp-transport=udp rtsp://serverA:5541/Streaming/Channels/1
Хотя правила для UDP и TCP одинаковы, почему TCP работает, а UDP нет?
ChatGPT выдает мусор, любая помощь будет очень признательна. 🙏
Ответ или решение
Для успешной настройки маршрутизации трафика и устранения проблемы, когда пересылка трафика работает на TCP, но не на UDP, необходимо учитывать специфику передачи данных по двум протоколам. В данной ситуации вы хотите предоставить доступ к IP-камере через туннель WireGuard, что требует корректной настройки правил DNAT и SNAT на серверах A и B.
Фундаментальная разница в работе TCP и UDP:
-
TCP (Transmission Control Protocol) — это протокол с установленным соединением, который гарантирует доставку пакетов и их последовательность. Возможные потери данных компенсируются повторной отправкой.
-
UDP (User Datagram Protocol) — это протокол без установления соединения, который не гарантирует доставку и последовательность пакетов, что делает его более легковесным, но менее надежным с точки зрения потерь и порядка доставки данных.
Проблемы и возможные решения:
-
NAT и изменение заголовков: При использовании NAT особенно для UDP, заголовки пакетов могут изменяться. UDP не ведет учет состояний подключения, поэтому если SNAT/DNAT не полностью правильно работают, пакеты могут теряться.
-
Проблемы с маршрутизацией через WireGuard: Конфигурация WireGuard должна учитывать особенности работы UDP, например поддержка обратного трафика. Убедитесь, что маршруты обратного трафика корректно настроены для UDP через WireGuard, т.е., убедитесь в правильной настройке
AllowedIPs
и других параметров. -
Пропускная способность и потери UDP-пакетов: Убедитесь, что MTU обоих интерфейсов настроены оптимально (обычно для WireGuard – 1420).
-
Файрвол и закрытие портов: Проверьте, не блокируются ли UDP-пакеты на каком-либо из этапов, например, на уровне системного или межсетевого файрвола.
-
Разрешения и таблицы маршрутизации: Проверьте, чтобы не было отбрасывания UDP-пакетов по причине конфигурационных ошибок в iptables/nftables (например, неправильные номера интерфейсов).
Часто проблема заключается в неправильной конфигурации WireGuard или файрвола, что влияет только на пакеты UDP, поскольку они более чувствительны к изменению сети из-за отсутствия механизма связи, как у TCP. Рекомендуется пройтись по каждому серверу и тщательно проверить каждый из описанных нюансов, чтобы удостовериться в отсутствии ошибок настройки.
Оптимальным подходом к решению будет поэтапная проверка каждого звена сети на корректное выполнение своих функций, начиная с самого базового уровня: WireGuard конфигурация, NAT правила, файрвол политики и затем уже переход к отладке приложений и зависимости от конкретного канала передачи.