UDP-трафик между облаком и ПК

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

Я пытаюсь отправлять 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) и правила брандмауэра.

Анализ причин

  1. NAT и его влияние:
    Когда ваш ПК находится за NAT (например, в домашней сети или на мобильной LTE-сети), это может привести к блокировке входящих UDP-пакетов. Некоторые маршрутизаторы имеют строгие настройки NAT, которые могут мешать прохождению UDP-трафика. Это особенно актуально для UDP, поскольку, в отличие от TCP, ему не требуется установка соединения.

  2. Тестирование на разных сетевых окружениях:
    Вы упомянули, что тестировали как с домашней сети, так и через мобильный LTE, и в обоих случаях встречи с проблемами наблюдались. Попробуйте установить прямое соединение без NAT, например, подключив ваш ПК напрямую к интернет-провайдеру, если это возможно. Это поможет исключить проблемы, связанные с маршрутизатором.

  3. Правила брандмауэра:
    Поскольку вы используете Fedora и указали, что брандмауэр не блокирует пакеты, убедитесь, что настройки SELinux не вызывают дополнительных преград, которые могли бы блокировать UDP-трафик.

Решения и рекомендации

  1. Использование STUN/TURN:
    Если у вас возникают проблемы с NAT, рассмотрите возможность использования STUN (Session Traversal Utilities for NAT) или TURN (Traversal Using Relays around NAT) для установки соединений. Эти протоколы помогают в обходе NAT и устанавливают прямые соединения.

  2. Порт Хоум-Пунчинг:
    Хотя вы уже пробовали NAT hole punching, стоит убедиться, что вы правильно реализовали это в своем коде. Порт Хоум-Пунчинг требует, чтобы оба клиента (ваш сервер и ПК) отправляли пакеты друг другу, чтобы открыть NAT для UDP-соединения.

  3. Проверка настроек роутера:
    Если у вас есть доступ к настройкам вашего маршрутизатора, проверьте, разрешен ли трафик для UDP на портах, необходимых для вашего приложения. Лучше всего использовать порты, которые не являются стандартными, чтобы минимизировать риск блокировки.

  4. Логирование и отладка:
    Добавьте логирование на обеих сторонах (как на сервере, так и на клиенте), чтобы отслеживать отправляемые и получаемые пакеты. Это поможет лучше понять, на каком этапе теряется трафик.

  5. Поставка дополнительного программного обеспечения:
    Если все вышеперечисленные шаги не сработают, возможно, стоит рассмотреть использование таких инструментов, как ngrok или Localtunnel, которые помогут вам создать туннель для UDP-трафика и обойти NAT.

Заключение

Передача UDP-пакетов между вашим ПК и облачным сервером требует тщательной настройки и понимания сетевых принципов, таких как NAT и брандмауэр. Попробуйте внедрить предложенные решения и проследите за трафиком с помощью Wireshark для выявления возможных узких мест. С правильной настройкой ваше приложение должно работать без проблем, как и более крупные проекты, такие как League of Legends.

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

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