Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UDP Hole Punching Client

Небольшой клиент на Rust, показывающий UDP hole punching за NAT через рандеву-сервер: клиент регистрируется по UDP, узнаёт внешний адрес пира по HTTP, шлёт короткий punch-burst и дальше общается по UDP напрямую.

Необходимые условия

  • Rust (stable)
  • Доступ к серверу:
    • HTTP API: http://45.151.30.139:8080/api
    • Swagger: http://45.151.30.139:8080/help
    • UDP: 45.151.30.139:4200

Как это работает

  1. Клиент шлёт на UDP-порт сервера пакет: 0x00 | <name utf-8> | 0xFF. Сервер запоминает внешний IP:port.
  2. Клиент делает GET /api/wait/{peer}?timeout=... и получает внешний IP:port пира.
  3. Оба шлют несколько UDP-пакетов (burst) друг другу — так проще “поймать” окно NAT.
  4. После этого линии идут прямо клиент ↔ клиент.
  5. Периодические маленькие пакеты (keepalive) не дают NATу выкинуть мэппинг.

Запуск

Минимально (с дефолтными адресами сервера):

cargo run -- --name one --peer two

Более явно:

cargo run --release -- \
  --name one \
  --peer two \
  --rendezvous 45.151.30.139 \
  --http-port 8080 \
  --udp-port 4200

Связать исходящий порт:

cargo run -- --name one --peer two --bind 0.0.0.0:55555

Пример два клиента в одном процессе (для отладки):

cargo run --example two_local

Флаги

  • --name, -n <STRING>- имя, под которым клиент регистрируется на рандеву-сервере. Должно состоять из ASCII-букв/цифр/-/_.

  • --peer, -p <STRING> - имя пира, которого ждём и у которого запрашиваем внешний UDP-адрес.

  • --rendezvous, -r <IPv4>- IPv4-адрес рандеву-сервера. По умолчанию: 45.151.30.139

  • --http-port, -H <PORT> - HTTP-порт рандеву-сервера (для /api/wait/...). По умолчанию: 8080

  • --udp-port, -u <PORT> UDP-порт рандеву-сервера (для регистрации). По умолчанию: 4200

  • --bind <ADDR:PORT> Опционально. Локальный адрес/порт для исходящего UDP, напр. 0.0.0.0:55555

  • -v, -vv Увеличить детализацию логов.

  • -q, -qq Уменьшить детализацию логов.

Заметки

  • По умолчанию уровень логирования — INFO (используем Verbosity<InfoLevel>).
  • Нажмите Ctrl+D, чтобы отправить EOF — клиент завершится корректно.
  • В примерах Ctrl+C останавливает сразу оба клиента.
  • Успех UDP hole punching зависит от типа NAT с обеих сторон; на симметричных NAT-ах может не работать стабильно.
  • Периодические keepalive-пакеты отправляются, чтобы NAT не удалил созданное соответствие (mapping).

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages