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
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 уходит указанному узлу-провайдеру.
Поток данных
- Клиент → Провайдер: пакет из
nat_tun->output_queue→ callbacknat_transport_client_tun_out_cb→ упаковка вNAT_SVC_HDR(1 байтETCP_RT_ID_NAT+ 8 байт src_node_id + IP-пакет) →etcp_route_send(). - Провайдер получает:
nat_transport_etcp_recv_cb(зарегистрирован черезetcp_router_bind) →eim_nat_egress()(source NAT) →tun_write()в NAT TUN. - Провайдер → Клиент (ответ): ответ из интернета попадает в
nat_tun->output_queue→nat_transport_provider_tun_out_cb→eim_nat_ingress()(поиск исходного клиента) → упаковка в NAT_SVC_HDR →etcp_route_send()обратно клиенту. - Клиент получает ответ:
nat_transport_etcp_recv_cb→tun_write()в NAT TUN клиента.
Ключевые нюансы
- Используется отдельный TUN-интерфейс (
nat_tun), не основнойtun. Для него нужен маршрут по умолчанию в системе. - Callback'и работают через очередь
output_queueTUN-интерфейса. По одному пакету за вызов. - Все пакеты на 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