feat(nat): confirm direct open profile from accepted public connections

This commit is contained in:
evgeny committed 2026-10-18 00:41:53 +02:00
1 parent 37e092672a
commit df2f6ff300
3 files changed
+47 -7

No files matched your search

+7 -3
View File
@@ -2,13 +2,15 @@
* Результат — address_profile с двумя независимыми свойствами:
* mapping: UNCHANGED — адрес не меняется; EIM — внешний IP:порт одинаков для разных IP назначения;
* DEPENDENT (strict) — внешний IP:порт зависит от IP назначения.
* inbound: OPEN — пакеты от незнакомого IP проходят; CONTACT — проходят после исходящего контакта (оценка filtered).
* inbound: OPEN — подтверждён вход; CONTACT — пакеты проходят после исходящего контакта (оценка filtered).
* Принятое UDP/TCP-подключение с публичными локальным и удалённым IP сразу даёт UNCHANGED+OPEN (direct/open).
* Для этого правила прежний исходящий контакт с IP пира не препятствие; LAN и SOCKS его не подтверждают.
* UNKNOWN в любом свойстве означает, что данных для его определения пока недостаточно.
* Одно соединение может подтвердить NAT-адрес: он сохраняется в socket->nat_addr с типом UNKNOWN
* и публикуется как NAT-кандидат. Это не адрес интерфейса и не подтверждение открытого входа.
* Для UDP сочетания EIM+OPEN и EIM+CONTACT означают eim open и eim filtered.
* Для TCP непубличный локальный IP сразу означает NAT; публичный IP сравнивается с наблюдением одного пира.
* TCP не определяет тип NAT/входящие: сохраняет внешний IP с портом 0, непригодным для подключения.
* TCP не запускает активных проб входа: OPEN даёт только принятое подключение; внешний IP сохраняется с портом 0.
* EIM+UNKNOWN отображается как EIM?: внешний адрес совпал, незнакомый вход не удалось проверить.
* Если своего измерения mapping нет, совпадение у двух STUN-серверов на том же IP/интерфейсе даёт предварительный EIM?.
* Его source=STUN, inbound=UNKNOWN; внешний порт берётся только из наблюдения рабочего сокета, а не из STUN.
@@ -95,7 +97,9 @@ int nat_detection_ping_allowed(struct NAT_DETECTION *detector, struct ETCP_SOCKE
const uint8_t peer_key[32], const struct sockaddr_storage *source,
uint8_t flags, const uint8_t *tag, size_t length);
/* Сообщить о готовности link; при отсутствии результата запланировать измерение его локального сокета. */
/* Сообщить о готовности link после UDP INIT или STCP handshake. Принятый вход с двумя публичными IP
* подтверждает direct/open у принимающего сокета; иначе при отсутствии результата планируется измерение.
* Для TCP фактический локальный IP должен совпадать с IP интерфейса этого сокета. */
void nat_detection_link_ready(struct NAT_DETECTION *detector, struct ETCP_LINK *link);
/* Сообщить об утрате/перезапуске connection; запланировать пересмотр маршрутов и отмену зависимых проверок при их потере. */