From 89830266257cf8b5db0bb9f5c0a830a8ad816190 Mon Sep 17 00:00:00 2001 From: evgeny Date: Sat, 17 Oct 2026 18:47:41 +0200 Subject: [PATCH] docs: describe same-interface STUN estimates and working endpoint addresses --- doc/nat_detection.txt | 10 ++++++++-- doc/node_snapshot.md | 6 ++++-- doc/stun_nat.md | 17 +++++++++++------ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/doc/nat_detection.txt b/doc/nat_detection.txt index d2df43fd..0ba84b80 100644 --- a/doc/nat_detection.txt +++ b/doc/nat_detection.txt @@ -56,6 +56,12 @@ eim filtered — внешний IP:порт одинаковый, серия п EIM? — два направления видят одинаковый внешний IP:порт, но незнакомый вход проверить не удалось, например все доступные помощники уже были знакомы. Это EIM с неизвестной доступностью входящих, без обещания открытого входа. +Такой же предварительный EIM? дают два STUN-сервера, видящие одинаковый внешний +IP:порт тестового сокета на том же локальном IP и интерфейсе. Поддержка запроса +с незнакомого IP для этого не нужна. Источник оценки — STUN, вход остаётся UNKNOWN. +Измерение рабочего сокета имеет приоритет; STUN-оценка действует до пяти минут +и обновляется автоматически. Публичный порт для подключения берётся только +из наблюдения рабочего сокета: внешний порт STUN в него не подставляется. Если внешний IP:порт совпадает с локальным, отдельно отмечается отсутствие трансляции адреса. Доступность входящих всё равно проверяется. @@ -74,5 +80,5 @@ EIM? — два направления видят одинаковый внеш Соединения по LAN работают независимо и не сбрасывают интернет-профиль. Если доступны только локальные узлы, определить интернет-NAT нельзя. -Результат относится к проверенному UDP-сокету: проверка STUN с другого порта -и работа TCP не заменяют это измерение. +STUN на другом порту даёт предварительную оценку типа NAT для того же IP/интерфейса. +Работа TCP не заменяет проверку UDP. diff --git a/doc/node_snapshot.md b/doc/node_snapshot.md index 9198f4db..17dde208 100644 --- a/doc/node_snapshot.md +++ b/doc/node_snapshot.md @@ -23,8 +23,10 @@ ID и время измерения не передаются: последни адрес `TOPO_ADDR_NAT` при `mapping=UNKNOWN`, `inbound=UNKNOWN`: это NAT-кандидат для пробного подключения, а не адрес интерфейса или подтверждённый открытый вход. Общий внешний адрес подтверждает EIM; strict не публикует универсальный NAT-адрес. -Source входит в подпись; SOCKMETA занимает 5 байт. STUN другого порта остаётся -отдельной диагностикой и не назначает профиль или внешний адрес рабочего сокета. +Source входит в подпись; SOCKMETA занимает 5 байт. `source=STUN` означает предварительный +EIM? для того же локального IP/netif с неизвестным входом; измерение ETCP приоритетно. +Владелец снимает STUN-оценку после TTL. Внешний адрес тестового порта не публикуется: +NAT-кандидат по-прежнему требует наблюдения рабочего сокета. Таблица `node_snapshots` хранит полную сериализованную запись без группового окружения. `node_addresses` остаётся проекцией для поиска и отображения, а не diff --git a/doc/stun_nat.md b/doc/stun_nat.md index 3efbe4db..43617680 100644 --- a/doc/stun_nat.md +++ b/doc/stun_nat.md @@ -5,11 +5,15 @@ Для каждой группы создаётся один собственный неблокирующий UDP-сокет с тем же локальным IP, привязкой к устройству и Linux SO_MARK / FreeBSD FIB. Тестовый порт выбирается случайно из 49152–65535. Модуль сам регистрирует чтение в uasync, принимает STUN и закрывает свой сокет после измерения. -STUN не меняет исходный ETCP fd, его порт и обработчики. Результат остаётся независимой -диагностикой IP/netif через `stun_nat` API. Он не назначает mapping/inbound рабочему сокету -даже при NO_OBSERVER/NO_HELPER: поведение NAT на другом порту может отличаться. -Ни профиль, ни mapped endpoint тестового порта не переносятся в `nat_addr` или NODEINFO -рабочего сокета. Детектор рабочего endpoint описан в `doc/nat_detection.txt`. +STUN не меняет исходный ETCP fd, его порт и обработчики. Через `stun_nat` API модуль +`nat_detection` получает предварительную оценку для рабочих сокетов того же IP/netif +с совпадающими mark/FIB/device. Если два разных IP видят одинаковый стабильный внешний +IP:порт и есть трансляция адреса, рабочий профиль получает EIM? с source=STUN и inbound=UNKNOWN. +Это действует и для обычных серверов без запроса с незнакомого IP. Filtering тестового порта +не переносится; измерение mapping рабочего сокета всегда имеет приоритет. +Оценка снимается после TTL, отключения STUN, смены пути или противоречащего внешнего IP. +Тестовый mapped endpoint не копируется в `nat_addr` и NODEINFO: адрес для подключения +должен быть получен наблюдением самого рабочего сокета. Детектор описан в `doc/nat_detection.txt`. ## Конфигурация @@ -94,6 +98,7 @@ DEBUG содержит этапы, transaction ID, повторы, RTT, DNS и Linux-тест `test_stun_nat` использует реальные локальные UDP-сокеты и ускоренные часы: обычный STUN, все классы RFC 5780, недоступные альтернативы, потеря запроса, неверные/поздние ответы, резервные серверы, DNS, нестабильный mapping, отмена и повторная проверка, изменение состава сокетов. -Каждый сценарий проверяет неизменность исходного ETCP-сокета и освобождение таймеров. +Сценарии проверяют сохранность рабочего fd/порта, предварительный EIM?, приоритет ETCP, +снятие оценки после TTL, совпадение IP/netif и освобождение таймеров. Ссылки: [RFC 5780](https://www.rfc-editor.org/rfc/rfc5780), [STUN RFC 8489](https://www.rfc-editor.org/rfc/rfc8489).