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