You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

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