From b3830e026413ad9058c4fced2e87e4aebc36e8e2 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 12 Oct 2026 01:28:49 +0200 Subject: [PATCH] Document signed profile source and reproducible isolated STUN bench --- Makefile.am | 1 + doc/node_snapshot.md | 7 +++++-- tests/stream_netns/README.md | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 202f20c6..6f81441e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,6 +9,7 @@ dist_license_DATA = LICENSE LICENSING THIRD_PARTY_NOTICES EXTRA_DIST = readme.md \ doc/nat_detection.txt \ + doc/stun_nat.md \ doc/node_snapshot.md \ tinycrypt/LICENSE \ tools/chatgui/zxing-cpp/LICENSE \ diff --git a/doc/node_snapshot.md b/doc/node_snapshot.md index 250bcf6f..91564b9f 100644 --- a/doc/node_snapshot.md +++ b/doc/node_snapshot.md @@ -13,12 +13,15 @@ 8-битный `ver` сохраняется как диагностический счётчик; свежесть определяется только timestamp. -Профиль endpoint в SOCKMETA содержит независимые `mapping` и `inbound`, +Профиль endpoint в SOCKMETA содержит независимые `mapping` и `inbound`, источник `source`, `evidence_id` и `checked_at`. Последние относятся к измерению владельца, а не к версии всего NODEINFO: повтор записи или изменение имени не продлевает измерение. Новые поля профиля на проводе кодируются явными BE-байтами; границы списков metadata/адресов/REALITY также входят в каноническую подпись. Алгоритм и условия неопределённости описаны в `doc/nat_detection.txt`. +`source=ETCP` обозначает измерение рабочего endpoint, `source=STUN` — резервную оценку +по IP/netif с другого порта. Source входит в подпись; SOCKMETA занимает 21 байт. +STUN mapped endpoint не публикуется как внешний адрес рабочего сокета. Таблица `node_snapshots` хранит полную сериализованную запись без группового окружения. `node_addresses` остаётся проекцией для поиска и отображения, а не @@ -27,7 +30,7 @@ snapshot загрузка использует его. Локальная пуб ошибка сохранения не разрешает публикацию новой версии. В проекции адресов сохраняются `nat_mapping`, `nat_inbound`, `nat_evidence`, -`nat_checked`, `address_kind`. Уникальность определяется endpoint и видом адреса, +`nat_checked`, `nat_source`, `address_kind`. Уникальность определяется endpoint и видом адреса, а не отображаемым классом NAT. Старый производный формат пересоздаётся; bootstrap-загрузка без подписанного snapshot не подтверждает NAT-профиль. diff --git a/tests/stream_netns/README.md b/tests/stream_netns/README.md index 6d9a3d34..87b7b0d8 100644 --- a/tests/stream_netns/README.md +++ b/tests/stream_netns/README.md @@ -22,6 +22,23 @@ python3 tests/stream_netns/run.py python3 tests/stream_netns/run.py --nat-only --tcp ``` +Резервное определение типа STUN на отдельных портах и переход к измерению ETCP: + +```sh +python3 tests/stream_netns/run.py --stun-only --output /tmp/stun-interface-netns +``` + +Два RFC5780-сервера работают на двух реальных публичных IP, каждый с двумя UDP-портами. +По очереди проверяются n03 (cone), n14 (restricted) и n05 (dependent mapping). +Два рабочих порта одного IP/netif используют одну STUN-пробу. Сначала у владельца +нет ETCP-пиров, затем появляется один наблюдатель, затем независимый помощник. +Проверяются source=STUN -> source=ETCP, приоритет рабочего измерения и отсутствие +тестового внешнего порта в рекламе рабочего сокета. JOIN/стриминг в этом режиме не запускаются. +Случайные тестовые порты получают тот же класс NAT; правила для рабочего 32000 сохраняются. +Для испытания случайных портов активен один клиент каждого выбранного NAT-шлюза. +Расширенная классификация restricted/dependent включает реальные таймауты CHANGE, +поэтому этот режим обычно занимает несколько минут. Результат: `stun-result.json`. + `--nat-check` выполняет ту же проверку перед обычными JOIN/Merkle/BGP/стримингом. Контроллер сначала запускает только ядро с ручными NAT-раундами, переносит подписанные снимки через RPC и создаёт нужные NCD-подключения. Наблюдения,