Files
utun2/src/nat_transport_doc.md
T
evgeny 38c9f229bc stcp: ed25519 pubkey exchange in handshake, fix instance destroy segfault, fix chat_tcp_test
- u_async.c: process immediate_queue BEFORE epoll_wait in uasync_poll
- stcp_link.c: defensive NULL etcp_conn/etcp_link in stcp_link_close
- utun_instance.c: move stcp_server_list_destroy_all to Phase J (before ETCP),
  add deferred drain in both Phase J and L
- stcp.h/c: STCP_HS_ENC_CLIENT 6→38, STCP_HS_ENC_SERVER 7→39,
  exchange ed25519_pubkey in both handshake directions
- etcp_connections.c: copy peer_ed25519 from STCP to ETCP_CONN in
  etcp_link_enter_ready_tcp; guard link->etcp in tcp_link_close_cb
- chat_sync.c: fix lk->conn NULL dereference for TCP links
- test_stcp.c: update stcp_server_create/stcp_client_connect callsites
- tools/chat_tcp_test: change transport udp→tcp
2026-08-07 00:48:27 +03:00

3.9 KiB

NAT Transport Layer (nat_transport)

1. Назначение

Транспортный слой NAT поверх ETCP. Обеспечивает проброс IP-трафика между клиентом и провайдером NAT через ETCP-роутер (канал ETCP_RT_ID_NAT). Клиент захватывает пакеты из TUN-интерфейса и отправляет провайдеру; провайдер выпускает их в интернет через свой NAT-движок, а обратные пакеты возвращает клиенту.

2. Как пользоваться

Конфигурация

  • Провайдер (nat_via_node_id = 0): включает eim_nat. В конфиге задаётся nat_tun_ifname, nat_tun_ip и параметры NAT (пул портов, шлюз).
  • Клиент (nat_via_node_id = X): eim_nat не инициализируется, all трафик с NAT TUN уходит указанному узлу-провайдеру.

Поток данных

  1. Клиент → Провайдер: пакет из nat_tun->output_queue → callback nat_transport_client_tun_out_cb → упаковка в NAT_SVC_HDR (1 байт ETCP_RT_ID_NAT + 8 байт src_node_id + IP-пакет) → etcp_route_send().
  2. Провайдер получает: nat_transport_etcp_recv_cb (зарегистрирован через etcp_router_bind) → eim_nat_egress() (source NAT) → tun_write() в NAT TUN.
  3. Провайдер → Клиент (ответ): ответ из интернета попадает в nat_tun->output_queue → nat_transport_provider_tun_out_cb → eim_nat_ingress() (поиск исходного клиента) → упаковка в NAT_SVC_HDR → etcp_route_send() обратно клиенту.
  4. Клиент получает ответ: nat_transport_etcp_recv_cb → tun_write() в NAT TUN клиента.

Ключевые нюансы

  • Используется отдельный TUN-интерфейс (nat_tun), не основной tun. Для него нужен маршрут по умолчанию в системе.
  • Callback'и работают через очередь output_queue TUN-интерфейса. По одному пакету за вызов.
  • Все пакеты на ETCP-канале предваряются 9-байтным заголовком NAT_SVC_HDR.

3. API

Структуры

Структура Назначение
nat_transport_ctx Контекст: self_node_id, nat_via_node_id (0=провайдер, иначе id провайдера), nat_tun, флаг initialized

Функции

Функция Назначение
nat_transport_init(inst) Инициализация: создаёт NAT TUN, настраивает eim_nat (если провайдер), биндит ETCP_RT_ID_NAT через etcp_router, вешает callback'и на TUN output_queue
nat_transport_destroy(inst) Деинициализация: анбиндит ETCP-канал, закрывает TUN, разрушает eim_nat

Внутренние коллбэки

Коллбэк Срабатывание
nat_transport_client_tun_out_cb Пакет из TUN output_queue на клиенте — упаковывает и шлёт провайдеру
nat_transport_provider_tun_out_cb Пакет из TUN output_queue на провайдере — делает ingress NAT lookup, шлёт обратно клиенту
nat_transport_etcp_recv_cb Получен пакет из канала ETCP_RT_ID_NAT — клиент пишет в TUN, провайдер делает egress NAT

Зависимости

eim_nat.h, etcp_router.h, etcp_api.h, tun_if.h, utun_instance.h, ll_queue.h