Document grouped control, isolated helper ports and ingress correlation

This commit is contained in:
evgeny committed 2026-10-12 20:07:49 +02:00
1 parent 179aa0ef35
commit 2ba011d3fd
2 files changed
+34 -22

No files matched your search

+28 -19
View File
@@ -23,23 +23,29 @@ DEPENDENT означает различие mapping на испытанных н
UDP-раунд
---------
1. Владелец A выбирает живого наблюдателя B с доступным native UDP endpoint.
1. Владелец A рассматривает узлы всех активных UTUN/CHAT-групп и выбирает одну группу
с маршрутами к наблюдателю B и отдельному помощнику C. Следующие хопы управления
должны быть READY. Прямые ETCP/UDP-линки к B/C не обязательны; B нужен доступный UDP endpoint.
Через проверяемый сокет S выполняет OBSERVE. Ответ содержит фактический
source IP:port, наблюдаемый B, и исходный тег S/generation/round.
2. Через уже установленный ETCP к B запрашивает поиск помощника C.
B выбирает C из своих работающих UDP-пиров и возвращает его ключ и endpoint.
Собственный подтверждённый NAT-профиль B/C не требуется: иначе bootstrap
зависел бы от уже завершённой детекции. Пригодность подтверждают реальные пробы.
3. Если внешний IP C совпадает с IP B, A исключает C и командует B искать
следующего помощника. Совпадающие Node ID и разные порты одного IP не дают
source IP:port, наблюдаемый B, и исходный тег S/generation/round/group.
2. A выбирает C по подписанному NODEINFO выбранной группы. Его рабочий UDP-сокет
задаёт интерфейс/семейство; C использует два отдельных probe_only порта,
чтобы помощь другому узлу не открывала фильтр его собственного рабочего endpoint.
C может находиться за NAT, независимо от политики PUBLIC/NAT и собственного профиля.
3. Управление RUN/RESULT идёт A -> B -> C через router в одной группе с подписью
и шифрованием. C сначала отправляет ADDRESS_CHECK с primary-порта к endpoint A,
реально наблюдавшемуся B. Аутентичный ingress на S до исходящего контакта подтверждает OPEN.
PONG возвращает наблюдаемый внешний endpoint C. При отсутствии PONG C узнаёт mapping
своего primary-порта через B, после чего выполняется контролируемый PRE из трёх проб.
4. Если внешний IP C совпадает с IP B или S ранее контактировал с C, A пробует
другие пары и группы. Совпадающие Node ID и разные порты одного IP не дают
независимого IP-наблюдения. При отсутствии второго IP результат неполный.
4. Для входящего испытания выбирается C, с IP которого S ранее не контактировал.
Все команды C идут A -> B -> C. До первого испытания A не шлёт UDP к C.
C отправляет три аутентифицированные ADDRESS_CHECK к endpoint из наблюдения B.
A регистрирует фактический ingress на S; один отчёт о PONG не заменяет ingress.
5. После завершения первого испытания S выполняет OBSERVE к основному порту C,
затем к другому UDP-порту того же помощника. Вспомогательный порт принадлежит
наблюдателю, скрыт из NODEINFO и исключён из NCD. Проверяемый S не меняется.
При выборе пары сначала сохраняется возможность свежего помощника; ранее контактировавшая
пара используется для mapping после исчерпания свежих. Отчёт о PONG не заменяет ingress на S.
5. После первого испытания S выполняет OBSERVE к primary C. При различии mapping
с B уже известен DEPENDENT. Иначе C отдельно измеряет внешний endpoint второго порта
через A; если фильтр A мешает — через B. S выполняет OBSERVE к этому endpoint.
Оба порта C скрыты из NODEINFO и исключены из NCD. Проверяемый S не меняется.
6. Если первый ingress отсутствовал, C здоров и mapping к C совпал с mapping к B,
после исходящего контакта выполняется второе входящее испытание от того же C.
Контролируемый переход до/после контакта даёт CONTACT_REQUIRED.
@@ -100,14 +106,17 @@ listener удалённого клиента. SOCKS5 UDP не классифиц
как контекст другого типа. Произвольный выбор первого IPv4/TCP-сокета запрещён.
Broker принимает RUN только для записанного им UDP-наблюдения данного владельца.
Размер wire, версия, enum, границы списка исключений и ненулевые поколения/раунды
проверяются до обработки. Числа новых сообщений — BE, IP — сетевые байты.
owner_key и helper_key имеют разные поля и никогда не меняют значение по роли.
Участники и ключи берутся из подписанного реестра выбранной группы. SOURCE читается
из проверенного router-заголовка, не из ETCP next hop. Управление занимает 136 байт,
не содержит списков исключений и копий ключей. Размер, версия, enum и ненулевые
group/generation/round/token проверяются до обработки. Числа BE, IP — сетевые байты.
На смене адреса, закрытии сокета, reset/DELETE транспорта и остановке ядра
отменяются собственные раунды и связанные helper jobs. Поздние ответы не
применяются к новому socket generation даже при повторном ID и IP:port.
Детектор останавливается до разборки групп, сокетов и соединений.
Удаление выбранной группы отменяет её раунды, jobs и наблюдения до закрытия router-каналов;
другие группы и последний успешный профиль сохраняются. Детектор останавливается
до разборки групп, сокетов и соединений.
Публикация и NCD
---------------