Вопрос или проблема
Я пытаюсь отправлять UDP-сообщения в обоих направлениях между моим ПК и сервером в облаке. TCP-сообщения проходят без проблем, но UDP…
С моего ноутбука я могу свободно отправлять пакеты на сервер, и они видны там. Когда сервер отправляет мгновенный ответ, он проходит, и я вижу его на своем ПК. Пока что всё хорошо. Когда я пытаюсь отправить UDP-пакеты на свой ПК, они не проходят. Я не вижу пакеты, приходящие с помощью Wireshark.
Немного о том, зачем я это делаю.
Я создал простую игру “Змейка” и хочу хостить её без необходимости использовать VPN-сервис, такой как Hamachi или ZeroTier. Использование TCP слишком медлительно и вызывает задержки в какой-то момент. Я верю, что другие используют UDP (большие игры, такие как League of Legends и т.д.), так что это должно быть возможным без настройки переадресации портов вручную на роутере. Я хочу, чтобы игрокам не нужно было проводить дополнительные подготовительные меры вне моей игры.
Что я уже попробовал.
Я провел все тесты, используя примеры соединений datagram в python asyncio и netcat. Я пробовал отправлять пакеты из своей домашней сети за роутером, а также через мобильную LTE-сеть (используя точку доступа Wi-Fi).
Я пробовал отверстия (насколько я знаю, также известные как NAT hairpinning) – это работает в моей локальной сети, но не через сотовую точку доступа.
Я слушал порты 5350 и 5351, чтобы обнаружить с использованием PCP (Протокол управления портами), но кажется, что это не используется, например, YouTube.
Просто для справки, TCP-соединение, инициированное с ПК, работает отлично.
Я пользователь Fedora Linux без межсетевого экрана (нет никаких блокирующих правил после использования iptables -S
).
Ответ или решение
UDP Трафик между Клаудом и ПК
Введение
Отправка и получение UDP-сообщений между вашим ПК и облачным сервером является важной задачей для разработки различных приложений, таких как игры, где требуется минимальная задержка. Давайте проанализируем вашу ситуацию и выясним, почему UDP-пакеты не проходят обратно к вашему ПК, и как это можно исправить.
Суть проблемы
Вы указали, что ваш ПК успешно отправляет UDP-пакеты на облачный сервер, и сервер может отправлять ответы обратно на ваш ПК. Однако, когда сервер пытается отправить UDP-пакеты на ваш ПК, они не достигают его, и вы не видите их в Wireshark. Это может быть связано с несколькими факторами, такими как сетевые настройки, NAT (Network Address Translation) и правила брандмауэра.
Анализ причин
-
NAT и его влияние:
Когда ваш ПК находится за NAT (например, в домашней сети или на мобильной LTE-сети), это может привести к блокировке входящих UDP-пакетов. Некоторые маршрутизаторы имеют строгие настройки NAT, которые могут мешать прохождению UDP-трафика. Это особенно актуально для UDP, поскольку, в отличие от TCP, ему не требуется установка соединения. -
Тестирование на разных сетевых окружениях:
Вы упомянули, что тестировали как с домашней сети, так и через мобильный LTE, и в обоих случаях встречи с проблемами наблюдались. Попробуйте установить прямое соединение без NAT, например, подключив ваш ПК напрямую к интернет-провайдеру, если это возможно. Это поможет исключить проблемы, связанные с маршрутизатором. -
Правила брандмауэра:
Поскольку вы используете Fedora и указали, что брандмауэр не блокирует пакеты, убедитесь, что настройки SELinux не вызывают дополнительных преград, которые могли бы блокировать UDP-трафик.
Решения и рекомендации
-
Использование STUN/TURN:
Если у вас возникают проблемы с NAT, рассмотрите возможность использования STUN (Session Traversal Utilities for NAT) или TURN (Traversal Using Relays around NAT) для установки соединений. Эти протоколы помогают в обходе NAT и устанавливают прямые соединения. -
Порт Хоум-Пунчинг:
Хотя вы уже пробовали NAT hole punching, стоит убедиться, что вы правильно реализовали это в своем коде. Порт Хоум-Пунчинг требует, чтобы оба клиента (ваш сервер и ПК) отправляли пакеты друг другу, чтобы открыть NAT для UDP-соединения. -
Проверка настроек роутера:
Если у вас есть доступ к настройкам вашего маршрутизатора, проверьте, разрешен ли трафик для UDP на портах, необходимых для вашего приложения. Лучше всего использовать порты, которые не являются стандартными, чтобы минимизировать риск блокировки. -
Логирование и отладка:
Добавьте логирование на обеих сторонах (как на сервере, так и на клиенте), чтобы отслеживать отправляемые и получаемые пакеты. Это поможет лучше понять, на каком этапе теряется трафик. -
Поставка дополнительного программного обеспечения:
Если все вышеперечисленные шаги не сработают, возможно, стоит рассмотреть использование таких инструментов, как ngrok или Localtunnel, которые помогут вам создать туннель для UDP-трафика и обойти NAT.
Заключение
Передача UDP-пакетов между вашим ПК и облачным сервером требует тщательной настройки и понимания сетевых принципов, таких как NAT и брандмауэр. Попробуйте внедрить предложенные решения и проследите за трафиком с помощью Wireshark для выявления возможных узких мест. С правильной настройкой ваше приложение должно работать без проблем, как и более крупные проекты, такие как League of Legends.