diff --git a/docs/ux-ui-external-acceptance.md b/docs/ux-ui-external-acceptance.md index ffcf5e69..9fb4087c 100644 --- a/docs/ux-ui-external-acceptance.md +++ b/docs/ux-ui-external-acceptance.md @@ -1,6 +1,6 @@ # UX/UI: протокол внешней приёмки 12.5 -Актуальное продолжение 2026-10-10: завершён12.5.118 — legacy client export больше не угадывает certificate по managed имени; PSK/отсутствующая binding дают409 до export, explicit certificate binding работает после rename. Backend8 scripts/state114/build/ESLint passed; native before200 с чужим для identity своим cert, after409 без архива/positive bound200, cleanup13×2. Архивы/passphrase не сохранялись. Backend ux-export118/version1.0.0-test.export118, frontend ux-bound116/version1.0.0-test.bound116. Следующий119 — реальные одновременные IKE sessions с одним ID через isolated Linux clients; image подготовка начата.12.5 открыт. +Актуальное продолжение 2026-10-10: завершён12.5.119 в принятой конфигурации — два real strongSwan6.0.1 clients/один certificate-derived DN, две established sessions/разные VIP, Ping3/3 каждый. API online1 без случайного activeAddress/uptime, UI1280/320 passed. Docker clients/network/credentials очищены, baseline16×2 совпал. Backend ux-export118/frontend ux-bound116 прежние. FQDN/ADDR4/manual DN AUTH_FAILED сохранён; следующий120 — интероперабельность ID/encoding без ослабления certificate verification.12.5 открыт. IPsec78: реальный PSK responder established, mode-config198.18.78.10 и online=true подтверждены API; точные собственные объекты удалены. Сертификатный/DN online, late failure и history restore остаются открытыми. [Отчёт](ux-ui/acceptance/ipsec-mode-config-2026-10-09.json), [журнал](ux-ui-progress.md). @@ -1223,3 +1223,19 @@ Backend ux-export118/version1.0.0-test.export118 собран из build-bound11 | Референс | Схема | | --- | --- | | [ReUI Sheet8](https://reui.io/preview/base/sheet-8?ref=mcp) | Выбранный клиент → явная certificate binding → PKI export либо409 без архива | + +## 12.5.119 — две реальные IKE-сессии одного certificate principal (2026-10-10) + +Контролируемая граница113 дополнена реальными сессиями: два Docker Linux клиента, official Debian trixie/strongSwan6.0.1-6+deb13u7, собственные namespace/bridge, NET_ADMIN только внутри clients. Один свой RSA2048 клиентский сертификат/ключ, свой CA и явно закреплённый server certificate. IKE/ESP AES256/SHA256/MODP2048, unique=never; чужие сетевые объекты/host networking приложения не перенастраивались. Docker создал и затем удалил собственную временную bridge/NAT сеть. + +В принятой конфигурации local ID получен непосредственно из сертификата. RouterOS подтвердил две established с одинаковым ID CN=<имя>-client и разными198.18.119.249/248. Каждый клиент выполнил Ping3/3 до собственного encrypted endpoint198.18.119.1. Это short data-plane proof, не throughput/rekey/SLA. API: clientsTotal1/clientsOnline1, activeAddress/activeSince/sessionAmbiguous отсутствуют. Два live UI1280/320 без mocks: один зелёный «онлайн», VIP не присвоен произвольно, unknown alert отсутствует; writes0/pageerrors0. Mobile screenshot просмотрен. Application source не менялся, backend118/frontend116 сохранены. + +Первый cleanup остановился: helper ошибочно ожидал comment у cert, который SDK/RouterOS не сохранил. До повторения scoped recovery проверил имя/CN/CA references/native IDs, удалил только свои объекты/credential files; Docker cleanup уже был завершён. Последующие retries сохранили baseline16×2. Первые FQDN/ADDR4, ручной DN и pinned server+ручной DN получили AUTH_FAILED; RouterOS сообщил identity not found/peer ID does not match certificate. Certificate-derived ID с тем же ключом/CA/server pin прошёл. Точная причина различий encoding не доказана; эти варианты не переименованы в success и остаются следующей120 приёмкой. + +Final cleanup: labelled clients/network удалены после owner проверки, свои native logging/peer/identity/policy/group/profile/proposal/mode-config/pool/bridge/address/certificates удалены по ID;16 исходных коллекций×2 совпали, default/public/metadata/195.195.195.195/32 сохранены. Private P12/pass/PEM/config files удалены, пустые свои directories закрыты без recursive delete. Архивы/ключи не попали в Git. Оба CHR доступны, пароли прежние. Инструментальный image сохранён для повторения; приложение не пересобиралось. Протоколы: [native/отказы/cleanup](ux-ui/acceptance/ipsec-real-multiple-sessions-2026-10-10.json), [live UI](ux-ui/acceptance/browser-ipsec-multiple-2026-10-10.json). + +References: [strongSwan configuration](https://docs.strongswan.org/docs/latest/swanctl/swanctlConf.html), [credentials](https://docs.strongswan.org/docs/latest/swanctl/swanctlDir.html), [RouterOS](https://manual.mikrotik.com/docs/virtual-private-networks/ipsec/). Два контейнера используют один public WAN/NAT, не являются независимыми площадками и не закрывают Windows/macOS/iOS/Android. Следующий120 — ID interop/encoding; остальные внешние зависимости сохранены в матрице.12.5 открыт. + +| Референс | Схема | +| --- | --- | +| [ReUI Filtering2](https://reui.io/preview/base/data-grid-filtering-2?ref=mcp) | Две подтверждённые сессии → один клиент онлайн → без произвольно выбранного VIP | diff --git a/docs/ux-ui-plan.md b/docs/ux-ui-plan.md index 1ff99135..506a24ef 100644 --- a/docs/ux-ui-plan.md +++ b/docs/ux-ui-plan.md @@ -1,12 +1,12 @@ # План реализации UX/UI по пятичасовым окнам -Актуальное продолжение 2026-10-10: завершён12.5.118 — legacy client export больше не угадывает certificate по managed имени; PSK/отсутствующая binding дают409 до export, explicit certificate binding работает после rename. Backend8 scripts/state114/build/ESLint passed; native before200 с чужим для identity своим cert, after409 без архива/positive bound200, cleanup13×2. Архивы/passphrase не сохранялись. Backend ux-export118/version1.0.0-test.export118, frontend ux-bound116/version1.0.0-test.bound116. Следующий119 — реальные одновременные IKE sessions с одним ID через isolated Linux clients; image подготовка начата.12.5 открыт. +Актуальное продолжение 2026-10-10: завершён12.5.119 в принятой конфигурации — два real strongSwan6.0.1 clients/один certificate-derived DN, две established sessions/разные VIP, Ping3/3 каждый. API online1 без случайного activeAddress/uptime, UI1280/320 passed. Docker clients/network/credentials очищены, baseline16×2 совпал. Backend ux-export118/frontend ux-bound116 прежние. FQDN/ADDR4/manual DN AUTH_FAILED сохранён; следующий120 — интероперабельность ID/encoding без ослабления certificate verification.12.5 открыт. Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-10. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат. ## Актуальная точка продолжения — 2026-10-10 -Актуальное продолжение 2026-10-10: завершён12.5.118 — legacy client export больше не угадывает certificate по managed имени; PSK/отсутствующая binding дают409 до export, explicit certificate binding работает после rename. Backend8 scripts/state114/build/ESLint passed; native before200 с чужим для identity своим cert, after409 без архива/positive bound200, cleanup13×2. Архивы/passphrase не сохранялись. Backend ux-export118/version1.0.0-test.export118, frontend ux-bound116/version1.0.0-test.bound116. Следующий119 — реальные одновременные IKE sessions с одним ID через isolated Linux clients; image подготовка начата.12.5 открыт. +Актуальное продолжение 2026-10-10: завершён12.5.119 в принятой конфигурации — два real strongSwan6.0.1 clients/один certificate-derived DN, две established sessions/разные VIP, Ping3/3 каждый. API online1 без случайного activeAddress/uptime, UI1280/320 passed. Docker clients/network/credentials очищены, baseline16×2 совпал. Backend ux-export118/frontend ux-bound116 прежние. FQDN/ADDR4/manual DN AUTH_FAILED сохранён; следующий120 — интероперабельность ID/encoding без ослабления certificate verification.12.5 открыт. Этапы0–11 завершены в локальных границах журнала. История выполненных внешних блоков и доказательства сохранены в [журнале](ux-ui-stage-12.md) и [протоколе](ux-ui-external-acceptance.md). Реальная Telegram доставка, Portal SSO, multi-instance и оставшиеся профильные сетевые ограничения открыты. diff --git a/docs/ux-ui-progress.md b/docs/ux-ui-progress.md index 138cbcf3..f30a6fb5 100644 --- a/docs/ux-ui-progress.md +++ b/docs/ux-ui-progress.md @@ -1,6 +1,6 @@ # UX/UI: журнал реализации -Актуальное продолжение 2026-10-10: завершён12.5.118 — legacy client export больше не угадывает certificate по managed имени; PSK/отсутствующая binding дают409 до export, explicit certificate binding работает после rename. Backend8 scripts/state114/build/ESLint passed; native before200 с чужим для identity своим cert, after409 без архива/positive bound200, cleanup13×2. Архивы/passphrase не сохранялись. Backend ux-export118/version1.0.0-test.export118, frontend ux-bound116/version1.0.0-test.bound116. Следующий119 — реальные одновременные IKE sessions с одним ID через isolated Linux clients; image подготовка начата.12.5 открыт. +Актуальное продолжение 2026-10-10: завершён12.5.119 в принятой конфигурации — два real strongSwan6.0.1 clients/один certificate-derived DN, две established sessions/разные VIP, Ping3/3 каждый. API online1 без случайного activeAddress/uptime, UI1280/320 passed. Docker clients/network/credentials очищены, baseline16×2 совпал. Backend ux-export118/frontend ux-bound116 прежние. FQDN/ADDR4/manual DN AUTH_FAILED сохранён; следующий120 — интероперабельность ID/encoding без ослабления certificate verification.12.5 открыт. Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md). @@ -36,7 +36,23 @@ | 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 | | 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 | | 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 | -| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–118 и ограничения ниже. Runtime backend ux-export118/frontend ux-bound116. | +| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в границах12.3.83; внешняя12.5 в работе, выполненные блоки1–119 и ограничения ниже. Runtime backend ux-export118/frontend ux-bound116. | + +## 12.5.119 — две реальные IKE-сессии одного certificate principal (2026-10-10) + +Контролируемая граница113 дополнена реальными сессиями: два Docker Linux клиента, official Debian trixie/strongSwan6.0.1-6+deb13u7, собственные namespace/bridge, NET_ADMIN только внутри clients. Один свой RSA2048 клиентский сертификат/ключ, свой CA и явно закреплённый server certificate. IKE/ESP AES256/SHA256/MODP2048, unique=never; чужие сетевые объекты/host networking приложения не перенастраивались. Docker создал и затем удалил собственную временную bridge/NAT сеть. + +В принятой конфигурации local ID получен непосредственно из сертификата. RouterOS подтвердил две established с одинаковым ID CN=<имя>-client и разными198.18.119.249/248. Каждый клиент выполнил Ping3/3 до собственного encrypted endpoint198.18.119.1. Это short data-plane proof, не throughput/rekey/SLA. API: clientsTotal1/clientsOnline1, activeAddress/activeSince/sessionAmbiguous отсутствуют. Два live UI1280/320 без mocks: один зелёный «онлайн», VIP не присвоен произвольно, unknown alert отсутствует; writes0/pageerrors0. Mobile screenshot просмотрен. Application source не менялся, backend118/frontend116 сохранены. + +Первый cleanup остановился: helper ошибочно ожидал comment у cert, который SDK/RouterOS не сохранил. До повторения scoped recovery проверил имя/CN/CA references/native IDs, удалил только свои объекты/credential files; Docker cleanup уже был завершён. Последующие retries сохранили baseline16×2. Первые FQDN/ADDR4, ручной DN и pinned server+ручной DN получили AUTH_FAILED; RouterOS сообщил identity not found/peer ID does not match certificate. Certificate-derived ID с тем же ключом/CA/server pin прошёл. Точная причина различий encoding не доказана; эти варианты не переименованы в success и остаются следующей120 приёмкой. + +Final cleanup: labelled clients/network удалены после owner проверки, свои native logging/peer/identity/policy/group/profile/proposal/mode-config/pool/bridge/address/certificates удалены по ID;16 исходных коллекций×2 совпали, default/public/metadata/195.195.195.195/32 сохранены. Private P12/pass/PEM/config files удалены, пустые свои directories закрыты без recursive delete. Архивы/ключи не попали в Git. Оба CHR доступны, пароли прежние. Инструментальный image сохранён для повторения; приложение не пересобиралось. Протоколы: [native/отказы/cleanup](ux-ui/acceptance/ipsec-real-multiple-sessions-2026-10-10.json), [live UI](ux-ui/acceptance/browser-ipsec-multiple-2026-10-10.json). + +References: [strongSwan configuration](https://docs.strongswan.org/docs/latest/swanctl/swanctlConf.html), [credentials](https://docs.strongswan.org/docs/latest/swanctl/swanctlDir.html), [RouterOS](https://manual.mikrotik.com/docs/virtual-private-networks/ipsec/). Два контейнера используют один public WAN/NAT, не являются независимыми площадками и не закрывают Windows/macOS/iOS/Android. Следующий120 — ID interop/encoding; остальные внешние зависимости сохранены в матрице.12.5 открыт. + +| Референс | Схема | +| --- | --- | +| [ReUI Filtering2](https://reui.io/preview/base/data-grid-filtering-2?ref=mcp) | Две подтверждённые сессии → один клиент онлайн → без произвольно выбранного VIP | ## 12.5.118 — IPsec: legacy экспорт только по явной certificate привязке (2026-10-10) diff --git a/docs/ux-ui-remaining-acceptance.md b/docs/ux-ui-remaining-acceptance.md index a3f120df..21e741a0 100644 --- a/docs/ux-ui-remaining-acceptance.md +++ b/docs/ux-ui-remaining-acceptance.md @@ -1,6 +1,6 @@ # Оставшаяся внешняя приёмка — 2026-10-10 -Это актуальная матрица после 12.5.118. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. +Это актуальная матрица после 12.5.119. Исторические записи сохраняют версии и ограничения на момент выполнения; поздние проверки ниже уточняют их. Этап 12.5 открыт. Успех в двух CHR и одном backend не означает приёмку всех конфигураций, интеграций или полной регрессии. Стенд: Debian13/Compose, PostgreSQL18.6, два CHR RouterOS7.24.5. Backend `ux-export118`, frontend `ux-bound116`; production lab использует AUTH_REQUIRED=false. Подписанные JWT/RBAC проверялись в изолированных процессах. Все собственные объекты112 удалены, исходные13 коллекций×2 (включая logging/certificates/files/routes) проверены; пароли не менялись. @@ -12,7 +12,7 @@ | GRE | Native lifecycle, metadata, live формы/меню/URL/Ping53–57; GRE используется в OSPF/BGP/IPsec последующих блоков; native IPv6 ULA inner109 | IPv6 outer и application IPv6 interface address lifecycle, независимые WAN, масштаб и длительное восстановление; принятие GRE не означает приёмку всех сценариев автоматического расписания | | WireGuard | Native handshake/data plane58, deletion60, live create/peer/disable/enable/delete62, mobile64, export/import67–74; native IPv6 ULA inner/allowedIps/handshake109 | Клиентские ОС и произвольные конфигурации, IPv6 outer/scale и application IPv6 interface address lifecycle, физический lost ACK и устойчивое восстановление; `.conf` с placeholders — шаблон, не принятый клиентский tunnel | | VXLAN | Собственная пара/private Ping/catalog/URL/export75–76; bridge/FDB/port loss/recovery107; IPv6 ULA inner по IPv4 outer108 | API приложения read-only: create/delete проверены native. IPv6 outer, масштаб/производительность, профильные mutation RBAC/concurrency отдельно не приняты | -| IPsec | PSK и сертификатное шифрование77–82, active peer/online/mode-config, scoped NAT/group, partial/unknown/applied receipts, restore conflicts, JWT; full DN/специальные символы/online110; literal CN namespace guards и explicit FQDN111; certificate/PSK shared ID unknown/recovery112; multiple sessions controlled snapshots113; shared certificate rows/target guards114; preserve-certificate UI/native DELETE115; explicit deletion binding/PSK collision116; legacy export binding118 | Реальные одновременные sessions с одним ID, Одновременные реальные sessions одного ID; native edit identical matching rules rejected; клиентские Windows/macOS/iOS/Android, прочие DN форматы/custom OIDs/IKE ID namespaces, полная PKI и policy/profile/proposal restore, физический disconnect, durable retry/multi-instance, IPv6/maximum throughput | +| IPsec | PSK и сертификатное шифрование77–82, active peer/online/mode-config, scoped NAT/group, partial/unknown/applied receipts, restore conflicts, JWT; full DN/специальные символы/online110; literal CN namespace guards и explicit FQDN111; certificate/PSK shared ID unknown/recovery112; multiple sessions controlled snapshots113; shared certificate rows/target guards114; preserve-certificate UI/native DELETE115; explicit deletion binding/PSK collision116; legacy export binding118; real duplicate DN sessions/Linux Ping/UI119 | Реальные duplicate certificate-derived DN sessions приняты119; остальные ID типы, FQDN/ADDR4/manual DN interop/encoding и прочие ID типы; native edit identical matching rules rejected; клиентские Windows/macOS/iOS/Android, прочие DN форматы/custom OIDs/IKE ID namespaces, полная PKI и policy/profile/proposal restore, физический disconnect, durable retry/multi-instance, IPv6/maximum throughput | | OSPF/BFD | Real Full/own routes84–85, раздельные наблюдения BFD86, effective disabled/optimizer cost/partial/RBAC87, alternate path90 и CIDR91 | Sustained BFD-only gate не принят: в86 сосед мог вновь статьFull при доступныхHello. В90 переходный Ping18/40 с55% loss: бесшовность не принята. REST timing — наблюдаемая граница, не SLA; IPv6/scale/independent WAN открыты | | BGP | Established83, exact /32 exchange/API/UI/administrative withdrawal92, BFD primary GRE loss/alternate/recovery93 | Hold timer/TCP loss безBFD принят104; packet loss в переходе, разные внешние peers/WAN policy, IPv6/scale. Два логических пути используют тот же public WAN; physical redundancy не принята | | Recursive routes | Production PUT/change/own history restore88, disabled guards, partial/unknown/applied outcomes, live формы/контекст | Автоматический rollback/retry, durable receipts и несколько экземпляров отсутствуют; PUT не является idempotent noop. Полная произвольная legacy catalog миграция не принята | @@ -25,7 +25,7 @@ ## Следующая последовательность 1. **12.5.95 завершён:** [source/context/compiled audit](ux-ui/acceptance/deployment-source-audit-2026-10-10.json), production source drift не выявлен; нормализация и исключения явно указаны. -2. **12.5.96 timezone завершён:** [6 live UI cases](ux-ui/acceptance/browser-speed-timezone-2026-10-10.json). 97 HTTP receipt disconnect принят: [протокол](ux-ui/acceptance/speed-disconnect-2026-10-10.json). 98 сообщение неизвестного native результата исправлено/развёрнуто. 99 main/context завершён с точной записью одного failure/delta;100 transport и101 accessibility исправлены/развёрнуты.102 malformed PATCH исправлен/принят.103 packet rows/public/GRE приняты в границах коротких samples; initial loss/root cause остаётся открытым.104 hold/TCP loss/recovery принят.105 source/runtime/evidence сверка passed.106 read-only readiness: auth disabled/Portal localhost/bot and chat unconfigured.107 — native bridge/FDB/loss/recovery принят.108 — IPv6 inner VXLAN принят, initial0/3 и1/3 остаются в протоколе;109 — native GRE/WireGuard IPv6 inner принят; readers /ip/address не показывают native IPv6 interface addresses.110 — полный native DN/online исправлен и принят;111 — literal CN guards/real explicit FQDN accepted;112 — certificate/PSK alias ambiguity marked unknown/recovery accepted;113 — repeated native ID groups исправлены на controlled snapshots; 114 — multiple refs/target guards/native conflict приняты в описанных границах. 115 — UI сохранения сертификата/native DELETE принят; 116 — name-based guessing удалён/live PSK collision принят;117 — main1243/1failed+delta1/context221/source runtime приняты в точных границах; 118 — legacy export binding/native409/explicit200 принят;119 — isolated Linux multiple IKE sessions. Реальные интеграции требуют тестовых доступов и отдельного разрешения на сообщение. +2. **12.5.96 timezone завершён:** [6 live UI cases](ux-ui/acceptance/browser-speed-timezone-2026-10-10.json). 97 HTTP receipt disconnect принят: [протокол](ux-ui/acceptance/speed-disconnect-2026-10-10.json). 98 сообщение неизвестного native результата исправлено/развёрнуто. 99 main/context завершён с точной записью одного failure/delta;100 transport и101 accessibility исправлены/развёрнуты.102 malformed PATCH исправлен/принят.103 packet rows/public/GRE приняты в границах коротких samples; initial loss/root cause остаётся открытым.104 hold/TCP loss/recovery принят.105 source/runtime/evidence сверка passed.106 read-only readiness: auth disabled/Portal localhost/bot and chat unconfigured.107 — native bridge/FDB/loss/recovery принят.108 — IPv6 inner VXLAN принят, initial0/3 и1/3 остаются в протоколе;109 — native GRE/WireGuard IPv6 inner принят; readers /ip/address не показывают native IPv6 interface addresses.110 — полный native DN/online исправлен и принят;111 — literal CN guards/real explicit FQDN accepted;112 — certificate/PSK alias ambiguity marked unknown/recovery accepted;113 — repeated native ID groups исправлены на controlled snapshots; 114 — multiple refs/target guards/native conflict приняты в описанных границах. 115 — UI сохранения сертификата/native DELETE принят; 116 — name-based guessing удалён/live PSK collision принят;117 — main1243/1failed+delta1/context221/source runtime приняты в точных границах; 118 — legacy export binding/native409/explicit200 принят;119 — real certificate-derived DN/Linux sessions приняты; следующий120 — manual ID interop/encoding. Реальные интеграции требуют тестовых доступов и отдельного разрешения на сообщение. 3. **Заключительный профильный контроль:** после последнего исправления собрать только затронутую часть, проверить её live и обновить матрицу. Общую регрессию выполнить один раз на согласованном runtime. 4. **Внешние зависимости:** Telegram/Portal/client OS/multi-WAN/scale проходят отдельную приёмку при наличии нужных аккаунтов, устройств и разрешений. Лабораторный результат двух CHR не закрывает их автоматически. @@ -138,3 +138,19 @@ Backend ux-export118/version1.0.0-test.export118 собран из build-bound11 | Референс | Схема | | --- | --- | | [ReUI Sheet8](https://reui.io/preview/base/sheet-8?ref=mcp) | Выбранный клиент → явная certificate binding → PKI export либо409 без архива | + +## 12.5.119 — две реальные IKE-сессии одного certificate principal (2026-10-10) + +Контролируемая граница113 дополнена реальными сессиями: два Docker Linux клиента, official Debian trixie/strongSwan6.0.1-6+deb13u7, собственные namespace/bridge, NET_ADMIN только внутри clients. Один свой RSA2048 клиентский сертификат/ключ, свой CA и явно закреплённый server certificate. IKE/ESP AES256/SHA256/MODP2048, unique=never; чужие сетевые объекты/host networking приложения не перенастраивались. Docker создал и затем удалил собственную временную bridge/NAT сеть. + +В принятой конфигурации local ID получен непосредственно из сертификата. RouterOS подтвердил две established с одинаковым ID CN=<имя>-client и разными198.18.119.249/248. Каждый клиент выполнил Ping3/3 до собственного encrypted endpoint198.18.119.1. Это short data-plane proof, не throughput/rekey/SLA. API: clientsTotal1/clientsOnline1, activeAddress/activeSince/sessionAmbiguous отсутствуют. Два live UI1280/320 без mocks: один зелёный «онлайн», VIP не присвоен произвольно, unknown alert отсутствует; writes0/pageerrors0. Mobile screenshot просмотрен. Application source не менялся, backend118/frontend116 сохранены. + +Первый cleanup остановился: helper ошибочно ожидал comment у cert, который SDK/RouterOS не сохранил. До повторения scoped recovery проверил имя/CN/CA references/native IDs, удалил только свои объекты/credential files; Docker cleanup уже был завершён. Последующие retries сохранили baseline16×2. Первые FQDN/ADDR4, ручной DN и pinned server+ручной DN получили AUTH_FAILED; RouterOS сообщил identity not found/peer ID does not match certificate. Certificate-derived ID с тем же ключом/CA/server pin прошёл. Точная причина различий encoding не доказана; эти варианты не переименованы в success и остаются следующей120 приёмкой. + +Final cleanup: labelled clients/network удалены после owner проверки, свои native logging/peer/identity/policy/group/profile/proposal/mode-config/pool/bridge/address/certificates удалены по ID;16 исходных коллекций×2 совпали, default/public/metadata/195.195.195.195/32 сохранены. Private P12/pass/PEM/config files удалены, пустые свои directories закрыты без recursive delete. Архивы/ключи не попали в Git. Оба CHR доступны, пароли прежние. Инструментальный image сохранён для повторения; приложение не пересобиралось. Протоколы: [native/отказы/cleanup](ux-ui/acceptance/ipsec-real-multiple-sessions-2026-10-10.json), [live UI](ux-ui/acceptance/browser-ipsec-multiple-2026-10-10.json). + +References: [strongSwan configuration](https://docs.strongswan.org/docs/latest/swanctl/swanctlConf.html), [credentials](https://docs.strongswan.org/docs/latest/swanctl/swanctlDir.html), [RouterOS](https://manual.mikrotik.com/docs/virtual-private-networks/ipsec/). Два контейнера используют один public WAN/NAT, не являются независимыми площадками и не закрывают Windows/macOS/iOS/Android. Следующий120 — ID interop/encoding; остальные внешние зависимости сохранены в матрице.12.5 открыт. + +| Референс | Схема | +| --- | --- | +| [ReUI Filtering2](https://reui.io/preview/base/data-grid-filtering-2?ref=mcp) | Две подтверждённые сессии → один клиент онлайн → без произвольно выбранного VIP | diff --git a/docs/ux-ui-stage-12.md b/docs/ux-ui-stage-12.md index c7f3148e..a400953e 100644 --- a/docs/ux-ui-stage-12.md +++ b/docs/ux-ui-stage-12.md @@ -1,6 +1,6 @@ # Этап 12: итоговая приёмка UX/UI -Актуальное продолжение 2026-10-10: завершён12.5.118 — legacy client export больше не угадывает certificate по managed имени; PSK/отсутствующая binding дают409 до export, explicit certificate binding работает после rename. Backend8 scripts/state114/build/ESLint passed; native before200 с чужим для identity своим cert, after409 без архива/positive bound200, cleanup13×2. Архивы/passphrase не сохранялись. Backend ux-export118/version1.0.0-test.export118, frontend ux-bound116/version1.0.0-test.bound116. Следующий119 — реальные одновременные IKE sessions с одним ID через isolated Linux clients; image подготовка начата.12.5 открыт. +Актуальное продолжение 2026-10-10: завершён12.5.119 в принятой конфигурации — два real strongSwan6.0.1 clients/один certificate-derived DN, две established sessions/разные VIP, Ping3/3 каждый. API online1 без случайного activeAddress/uptime, UI1280/320 passed. Docker clients/network/credentials очищены, baseline16×2 совпал. Backend ux-export118/frontend ux-bound116 прежние. FQDN/ADDR4/manual DN AUTH_FAILED сохранён; следующий120 — интероперабельность ID/encoding без ослабления certificate verification.12.5 открыт. План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push. @@ -2528,3 +2528,19 @@ Backend ux-export118/version1.0.0-test.export118 собран из build-bound11 | Референс | Схема | | --- | --- | | [ReUI Sheet8](https://reui.io/preview/base/sheet-8?ref=mcp) | Выбранный клиент → явная certificate binding → PKI export либо409 без архива | + +## 12.5.119 — две реальные IKE-сессии одного certificate principal (2026-10-10) + +Контролируемая граница113 дополнена реальными сессиями: два Docker Linux клиента, official Debian trixie/strongSwan6.0.1-6+deb13u7, собственные namespace/bridge, NET_ADMIN только внутри clients. Один свой RSA2048 клиентский сертификат/ключ, свой CA и явно закреплённый server certificate. IKE/ESP AES256/SHA256/MODP2048, unique=never; чужие сетевые объекты/host networking приложения не перенастраивались. Docker создал и затем удалил собственную временную bridge/NAT сеть. + +В принятой конфигурации local ID получен непосредственно из сертификата. RouterOS подтвердил две established с одинаковым ID CN=<имя>-client и разными198.18.119.249/248. Каждый клиент выполнил Ping3/3 до собственного encrypted endpoint198.18.119.1. Это short data-plane proof, не throughput/rekey/SLA. API: clientsTotal1/clientsOnline1, activeAddress/activeSince/sessionAmbiguous отсутствуют. Два live UI1280/320 без mocks: один зелёный «онлайн», VIP не присвоен произвольно, unknown alert отсутствует; writes0/pageerrors0. Mobile screenshot просмотрен. Application source не менялся, backend118/frontend116 сохранены. + +Первый cleanup остановился: helper ошибочно ожидал comment у cert, который SDK/RouterOS не сохранил. До повторения scoped recovery проверил имя/CN/CA references/native IDs, удалил только свои объекты/credential files; Docker cleanup уже был завершён. Последующие retries сохранили baseline16×2. Первые FQDN/ADDR4, ручной DN и pinned server+ручной DN получили AUTH_FAILED; RouterOS сообщил identity not found/peer ID does not match certificate. Certificate-derived ID с тем же ключом/CA/server pin прошёл. Точная причина различий encoding не доказана; эти варианты не переименованы в success и остаются следующей120 приёмкой. + +Final cleanup: labelled clients/network удалены после owner проверки, свои native logging/peer/identity/policy/group/profile/proposal/mode-config/pool/bridge/address/certificates удалены по ID;16 исходных коллекций×2 совпали, default/public/metadata/195.195.195.195/32 сохранены. Private P12/pass/PEM/config files удалены, пустые свои directories закрыты без recursive delete. Архивы/ключи не попали в Git. Оба CHR доступны, пароли прежние. Инструментальный image сохранён для повторения; приложение не пересобиралось. Протоколы: [native/отказы/cleanup](ux-ui/acceptance/ipsec-real-multiple-sessions-2026-10-10.json), [live UI](ux-ui/acceptance/browser-ipsec-multiple-2026-10-10.json). + +References: [strongSwan configuration](https://docs.strongswan.org/docs/latest/swanctl/swanctlConf.html), [credentials](https://docs.strongswan.org/docs/latest/swanctl/swanctlDir.html), [RouterOS](https://manual.mikrotik.com/docs/virtual-private-networks/ipsec/). Два контейнера используют один public WAN/NAT, не являются независимыми площадками и не закрывают Windows/macOS/iOS/Android. Следующий120 — ID interop/encoding; остальные внешние зависимости сохранены в матрице.12.5 открыт. + +| Референс | Схема | +| --- | --- | +| [ReUI Filtering2](https://reui.io/preview/base/data-grid-filtering-2?ref=mcp) | Две подтверждённые сессии → один клиент онлайн → без произвольно выбранного VIP | diff --git a/docs/ux-ui-test-server.md b/docs/ux-ui-test-server.md index 5b69cfb8..58bd3cab 100644 --- a/docs/ux-ui-test-server.md +++ b/docs/ux-ui-test-server.md @@ -1,6 +1,6 @@ # Тестовый сервер UX/UI — 2026-10-10 -Сервер161.104.46.222: backend ux-export118/version1.0.0-test.export118, frontend ux-bound116/version1.0.0-test.bound116. Native legacy PSK export409 без архива, explicit binding/rename positive200, cleanup13×2 passed. Source/compiled route bytehash совпал; оба CHR доступны/пароли прежние. Следующий119 — isolated Linux IKE clients с общим ID. +Сервер161.104.46.222: backend ux-export118/version1.0.0-test.export118, frontend ux-bound116/version1.0.0-test.bound116. Две real Linux certificate-derived ID sessions, Ping3/3×2/API online1/UI1280/320 passed. Cleanup16×2/clients/network/private files passed; оба CHR доступны/пароли прежние. Instrumental strongSwan image accept119 сохранён. Следующий120 — ручные ID/encoding interop. | Параметр | Проверенное состояние | | --- | --- | @@ -954,3 +954,19 @@ Backend ux-export118/version1.0.0-test.export118 собран из build-bound11 | Референс | Схема | | --- | --- | | [ReUI Sheet8](https://reui.io/preview/base/sheet-8?ref=mcp) | Выбранный клиент → явная certificate binding → PKI export либо409 без архива | + +## 12.5.119 — две реальные IKE-сессии одного certificate principal (2026-10-10) + +Контролируемая граница113 дополнена реальными сессиями: два Docker Linux клиента, official Debian trixie/strongSwan6.0.1-6+deb13u7, собственные namespace/bridge, NET_ADMIN только внутри clients. Один свой RSA2048 клиентский сертификат/ключ, свой CA и явно закреплённый server certificate. IKE/ESP AES256/SHA256/MODP2048, unique=never; чужие сетевые объекты/host networking приложения не перенастраивались. Docker создал и затем удалил собственную временную bridge/NAT сеть. + +В принятой конфигурации local ID получен непосредственно из сертификата. RouterOS подтвердил две established с одинаковым ID CN=<имя>-client и разными198.18.119.249/248. Каждый клиент выполнил Ping3/3 до собственного encrypted endpoint198.18.119.1. Это short data-plane proof, не throughput/rekey/SLA. API: clientsTotal1/clientsOnline1, activeAddress/activeSince/sessionAmbiguous отсутствуют. Два live UI1280/320 без mocks: один зелёный «онлайн», VIP не присвоен произвольно, unknown alert отсутствует; writes0/pageerrors0. Mobile screenshot просмотрен. Application source не менялся, backend118/frontend116 сохранены. + +Первый cleanup остановился: helper ошибочно ожидал comment у cert, который SDK/RouterOS не сохранил. До повторения scoped recovery проверил имя/CN/CA references/native IDs, удалил только свои объекты/credential files; Docker cleanup уже был завершён. Последующие retries сохранили baseline16×2. Первые FQDN/ADDR4, ручной DN и pinned server+ручной DN получили AUTH_FAILED; RouterOS сообщил identity not found/peer ID does not match certificate. Certificate-derived ID с тем же ключом/CA/server pin прошёл. Точная причина различий encoding не доказана; эти варианты не переименованы в success и остаются следующей120 приёмкой. + +Final cleanup: labelled clients/network удалены после owner проверки, свои native logging/peer/identity/policy/group/profile/proposal/mode-config/pool/bridge/address/certificates удалены по ID;16 исходных коллекций×2 совпали, default/public/metadata/195.195.195.195/32 сохранены. Private P12/pass/PEM/config files удалены, пустые свои directories закрыты без recursive delete. Архивы/ключи не попали в Git. Оба CHR доступны, пароли прежние. Инструментальный image сохранён для повторения; приложение не пересобиралось. Протоколы: [native/отказы/cleanup](ux-ui/acceptance/ipsec-real-multiple-sessions-2026-10-10.json), [live UI](ux-ui/acceptance/browser-ipsec-multiple-2026-10-10.json). + +References: [strongSwan configuration](https://docs.strongswan.org/docs/latest/swanctl/swanctlConf.html), [credentials](https://docs.strongswan.org/docs/latest/swanctl/swanctlDir.html), [RouterOS](https://manual.mikrotik.com/docs/virtual-private-networks/ipsec/). Два контейнера используют один public WAN/NAT, не являются независимыми площадками и не закрывают Windows/macOS/iOS/Android. Следующий120 — ID interop/encoding; остальные внешние зависимости сохранены в матрице.12.5 открыт. + +| Референс | Схема | +| --- | --- | +| [ReUI Filtering2](https://reui.io/preview/base/data-grid-filtering-2?ref=mcp) | Две подтверждённые сессии → один клиент онлайн → без произвольно выбранного VIP | diff --git a/docs/ux-ui/acceptance/browser-ipsec-multiple-2026-10-10.json b/docs/ux-ui/acceptance/browser-ipsec-multiple-2026-10-10.json new file mode 100644 index 00000000..6116e458 --- /dev/null +++ b/docs/ux-ui/acceptance/browser-ipsec-multiple-2026-10-10.json @@ -0,0 +1,27 @@ +{ + "date": "2026-10-10", + "runtime": { + "backend": "ux-export118", + "frontend": "ux-bound116" + }, + "nativeSessions": 2, + "linuxEncryptedPings3of3": true, + "cases": [ + { + "width": 1280, + "oneClientOnline": true, + "noArbitraryVip": true, + "noAmbiguity": true, + "noOverflow": true + }, + { + "width": 320, + "oneClientOnline": true, + "noArbitraryVip": true, + "noAmbiguity": true, + "noOverflow": true + } + ], + "pageErrors": [], + "applicationWrites": [] +} \ No newline at end of file diff --git a/docs/ux-ui/acceptance/ipsec-real-multiple-sessions-2026-10-10.json b/docs/ux-ui/acceptance/ipsec-real-multiple-sessions-2026-10-10.json new file mode 100644 index 00000000..eb7d45ac --- /dev/null +++ b/docs/ux-ui/acceptance/ipsec-real-multiple-sessions-2026-10-10.json @@ -0,0 +1,420 @@ +{ + "date": "2026-10-10", + "block": "12.5.119", + "runtime": { + "backend": "ux-export118", + "frontend": "ux-bound116" + }, + "native": { + "date": "2026-10-10", + "block": "12.5.119", + "name": "mm-ipsec119-1791648542512", + "linux": [ + { + "index": 0, + "vip": "198.18.119.249", + "initiated": true, + "ping3of3": true + }, + { + "index": 1, + "vip": "198.18.119.248", + "initiated": true, + "ping3of3": true + } + ], + "cleanup": [ + { + "serverId": 1, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + }, + { + "serverId": 2, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + } + ], + "clientImage": "sha256:c9d01c801de88b2349f685c1cb631e67a8b1c697439a00148d4045c23a584054", + "native": [ + { + ".id": "*1", + "id": "CN=mm-ipsec119-1791648542512-client", + "state": "established", + "dynamic-address": "198.18.119.249", + "remote-address": "161.104.46.222", + "uptime": "5s" + }, + { + ".id": "*2", + "id": "CN=mm-ipsec119-1791648542512-client", + "state": "established", + "dynamic-address": "198.18.119.248", + "remote-address": "161.104.46.222", + "uptime": "2s" + } + ], + "catalog": { + "name": "mm-ipsec119-1791648542512", + "online": true + }, + "summary": { + "clientsTotal": 1, + "clientsOnline": 1 + }, + "dockerCleanup": true, + "credentialFilesRemoved": true + }, + "browserEvidence": "browser-ipsec-multiple-2026-10-10.json", + "preliminary": { + "ownershipRecovery": { + "date": "2026-10-10", + "name": "mm-ipsec119-1791646686109", + "certificates": [ + { + ".id": "*AA", + "name": "mm-ipsec119-1791646686109-ca", + "common-name": "mm-ipsec119-1791646686109-ca", + "key-usage": "key-cert-sign,crl-sign" + }, + { + ".id": "*AB", + "name": "mm-ipsec119-1791646686109-server", + "common-name": "194.226.121.150", + "ca": "mm-ipsec119-1791646686109-ca", + "key-usage": "digital-signature,key-encipherment,tls-server" + }, + { + ".id": "*AC", + "name": "mm-ipsec119-1791646686109-client", + "common-name": "mm-ipsec119-1791646686109-client", + "ca": "mm-ipsec119-1791646686109-ca", + "key-usage": "digital-signature,key-encipherment,tls-client" + } + ], + "deleted": [ + { + "path": "/ip/ipsec/identity", + "id": "*A" + }, + { + "path": "/ip/ipsec/peer", + "id": "*1" + }, + { + "path": "/ip/ipsec/policy", + "id": "*1000000" + }, + { + "path": "/ip/address", + "id": "*74" + }, + { + "path": "/interface/bridge", + "id": "*77" + }, + { + "path": "/ip/ipsec/mode-config", + "id": "*2" + }, + { + "path": "/ip/pool", + "id": "*D" + }, + { + "path": "/ip/ipsec/policy/group", + "id": "*3" + }, + { + "path": "/ip/ipsec/proposal", + "id": "*1" + }, + { + "path": "/ip/ipsec/profile", + "id": "*B" + }, + { + "path": "/certificate", + "id": "*AB" + }, + { + "path": "/certificate", + "id": "*AC" + }, + { + "path": "/certificate", + "id": "*AA" + } + ], + "credentialFilesRemoved": true, + "nativeOwnedRemoved": true + }, + "initialAuth": { + "date": "2026-10-10", + "block": "12.5.119", + "name": "mm-ipsec119-1791647119700", + "linux": [], + "cleanup": [ + { + "serverId": 1, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + }, + { + "serverId": 2, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + } + ], + "clientImage": "sha256:c9d01c801de88b2349f685c1cb631e67a8b1c697439a00148d4045c23a584054", + "error": "IKE initiation failed: ad - curl_plugin_create not found and no plugin file available\ninitiate failed: establishing CHILD_SA 'private' failed\n[IKE] initiating IKE_SA lab[1] to 194.226.121.150\n[ENC] generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]\n[NET] sending packet: from 172.19.0.2[500] to 194.226.121.150[500] (464 bytes)\n[NET] received packet: from 194.226.121.150[500] to 172.19.0.2[500] (437 bytes)\n[ENC] parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) CERTREQ ]\n[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048\n[IKE] local host is behind NAT, sending keep alives\n[IKE] sending cert request for \"CN=mm-ipsec119-1791647119700-ca\"\n[IKE] authentication of 'mm-ipsec119-1791647119700.example' (myself) with RSA signature successful\n[IKE] sending end entity cert \"CN=mm-ipsec119-1791647119700-client\"\n[IKE] establishing CHILD_SA private{1}\n[ENC] generating IKE_AUTH request 1 [ IDi CERT CERTREQ IDr AUTH CPRQ(ADDR DNS) SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]\n[ENC] splitting IKE message (1440 bytes) into 2 fragments\n[ENC] generating IKE_AUTH request 1 [ EF(1/2) ]\n[ENC] generating IKE_AUTH request 1 [ EF(2/2) ]\n[NET] sending packet: from 172.19.0.2[4500] to 194.226.121.150[4500] (1236 bytes)\n[NET] sending packet: from 172.19.0.2[4500] to 194.226.121.150[4500] (276 bytes)\n[NET] received packet: from 194.226.121.150[4500] to 172.19.0.2[4500] (272 bytes)\n[ENC] parsed IKE_AUTH response 1 [ N(AUTH_FAILED) ]\n[IKE] received AUTHENTICATION_FAILED notify error\n\n\n1 !== 0\n", + "dockerCleanup": true, + "credentialFilesRemoved": true + }, + "fqdn": { + "date": "2026-10-10", + "block": "12.5.119", + "name": "mm-ipsec119-1791647456912", + "linux": [], + "cleanup": [ + { + "serverId": 1, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + }, + { + "serverId": 2, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + } + ], + "clientImage": "sha256:c9d01c801de88b2349f685c1cb631e67a8b1c697439a00148d4045c23a584054", + "error": "IKE initiation failed: ad - curl_plugin_create not found and no plugin file available\ninitiate failed: establishing CHILD_SA 'private' failed\n[IKE] initiating IKE_SA lab[1] to 194.226.121.150\n[ENC] generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]\n[NET] sending packet: from 172.19.0.2[500] to 194.226.121.150[500] (464 bytes)\n[NET] received packet: from 194.226.121.150[500] to 172.19.0.2[500] (437 bytes)\n[ENC] parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) CERTREQ ]\n[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048\n[IKE] local host is behind NAT, sending keep alives\n[IKE] sending cert request for \"CN=mm-ipsec119-1791647456912-ca\"\n[IKE] authentication of 'mm-ipsec119-1791647456912.example' (myself) with RSA signature successful\n[IKE] sending end entity cert \"CN=mm-ipsec119-1791647456912-client\"\n[IKE] establishing CHILD_SA private{1}\n[ENC] generating IKE_AUTH request 1 [ IDi CERT CERTREQ IDr AUTH CPRQ(ADDR DNS) SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]\n[ENC] splitting IKE message (1440 bytes) into 2 fragments\n[ENC] generating IKE_AUTH request 1 [ EF(1/2) ]\n[ENC] generating IKE_AUTH request 1 [ EF(2/2) ]\n[NET] sending packet: from 172.19.0.2[4500] to 194.226.121.150[4500] (1236 bytes)\n[NET] sending packet: from 172.19.0.2[4500] to 194.226.121.150[4500] (276 bytes)\n[NET] received packet: from 194.226.121.150[4500] to 172.19.0.2[4500] (256 bytes)\n[ENC] parsed IKE_AUTH response 1 [ N(AUTH_FAILED) ]\n[IKE] received AUTHENTICATION_FAILED notify error\n\n\n1 !== 0\n", + "routerAuthLogs": [ + "generated CA certificate: mm-ipsec119-1791647456912-ca", + "generated certificate 73CAEE2AB860519E:194.226.121.150::::::IP:194.226.121.150 rsa-size:2048 usage:80000005 valid:2 skid:[hash] for CA mm-ipsec119-1791647456912-ca", + "generated certificate 6EC70FF67A4A34A1:mm-ipsec119-1791647456912-client::::::DNS:mm-ipsec119-1791647456912.example rsa-size:2048 usage:40000005 valid:2 skid:[hash] for CA mm-ipsec119-1791647456912-ca", + "ipsec identity added by api:admin@:: (*A = /ip ipsec identity add auth-method=digital-signature certificate=mm-ipsec119-1791647456912-server comment=mm-ipsec119-1791647456912 generate-policy=port-strict match-by=certificate mode-config=mm-ipsec119-1791647456912 my-id=address:194.226.121.150 peer=mm-ipsec119-1791647456912 policy-template-group=mm-ipsec119-1791647456912 remote-certificate=mm-ipsec119-1791647456912-client remote-id=fqdn:mm-ipsec119-1791647456912.example)", + "mm-ipsec119-1791647456912: => certificate (size 0x36f)", + "identity not found for responder: ADDR4:194.226.121.150 peer: FQDN:mm-ipsec119-1791647456912.example" + ], + "dockerCleanup": true, + "credentialFilesRemoved": true + }, + "manualDn": { + "date": "2026-10-10", + "block": "12.5.119", + "name": "mm-ipsec119-1791647684917", + "linux": [], + "cleanup": [ + { + "serverId": 1, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + }, + { + "serverId": 2, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + } + ], + "clientImage": "sha256:c9d01c801de88b2349f685c1cb631e67a8b1c697439a00148d4045c23a584054", + "error": "IKE initiation failed: - curl_plugin_create not found and no plugin file available\ninitiate failed: establishing CHILD_SA 'private' failed\n[IKE] initiating IKE_SA lab[1] to 194.226.121.150\n[ENC] generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]\n[NET] sending packet: from 172.19.0.2[500] to 194.226.121.150[500] (464 bytes)\n[NET] received packet: from 194.226.121.150[500] to 172.19.0.2[500] (437 bytes)\n[ENC] parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) CERTREQ ]\n[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048\n[IKE] local host is behind NAT, sending keep alives\n[IKE] sending cert request for \"CN=mm-ipsec119-1791647684917-ca\"\n[IKE] authentication of 'CN=mm-ipsec119-1791647684917-client' (myself) with RSA signature successful\n[IKE] sending end entity cert \"CN=mm-ipsec119-1791647684917-client\"\n[IKE] establishing CHILD_SA private{1}\n[ENC] generating IKE_AUTH request 1 [ IDi CERT CERTREQ IDr AUTH CPRQ(ADDR DNS) SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]\n[ENC] splitting IKE message (1472 bytes) into 2 fragments\n[ENC] generating IKE_AUTH request 1 [ EF(1/2) ]\n[ENC] generating IKE_AUTH request 1 [ EF(2/2) ]\n[NET] sending packet: from 172.19.0.2[4500] to 194.226.121.150[4500] (1236 bytes)\n[NET] sending packet: from 172.19.0.2[4500] to 194.226.121.150[4500] (308 bytes)\n[NET] received packet: from 194.226.121.150[4500] to 172.19.0.2[4500] (224 bytes)\n[ENC] parsed IKE_AUTH response 1 [ N(AUTH_FAILED) ]\n[IKE] received AUTHENTICATION_FAILED notify error\n\n\n1 !== 0\n", + "routerAuthLogs": [ + "generated CA certificate: mm-ipsec119-1791647684917-ca", + "generated certificate 1A59BFB767930A62:194.226.121.150::::::IP:194.226.121.150 rsa-size:2048 usage:80000005 valid:2 skid:[hash] for CA mm-ipsec119-1791647684917-ca", + "generated certificate 5221DA522AA8CD0D:mm-ipsec119-1791647684917-client::::::DNS:mm-ipsec119-1791647684917.example rsa-size:2048 usage:40000005 valid:2 skid:[hash] for CA mm-ipsec119-1791647684917-ca", + "ipsec identity added by api:admin@:: (*A = /ip ipsec identity add auth-method=digital-signature certificate=mm-ipsec119-1791647684917-server comment=mm-ipsec119-1791647684917 generate-policy=port-strict match-by=certificate mode-config=mm-ipsec119-1791647684917 peer=mm-ipsec119-1791647684917 policy-template-group=mm-ipsec119-1791647684917 remote-certificate=mm-ipsec119-1791647684917-client)", + "mm-ipsec119-1791647684917: => certificate (size 0x36f)" + ], + "dockerCleanup": true, + "credentialFilesRemoved": true + }, + "pinnedServer": { + "date": "2026-10-10", + "block": "12.5.119", + "name": "mm-ipsec119-1791648365867", + "linux": [], + "cleanup": [ + { + "serverId": 1, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + }, + { + "serverId": 2, + "/system/logging": true, + "/ip/ipsec/identity": true, + "/ip/ipsec/peer": true, + "/ip/ipsec/policy": true, + "/ip/ipsec/policy/group": true, + "/ip/ipsec/mode-config": true, + "/ip/ipsec/proposal": true, + "/ip/ipsec/profile": true, + "/certificate": true, + "/file": true, + "/ip/address": true, + "/ip/route": true, + "/ip/firewall/nat": true, + "/ip/pool": true, + "/interface/bridge": true, + "/ipv6/address": true + } + ], + "clientImage": "sha256:c9d01c801de88b2349f685c1cb631e67a8b1c697439a00148d4045c23a584054", + "error": "IKE initiation failed: load - curl_plugin_create not found and no plugin file available\ninitiate failed: establishing CHILD_SA 'private' failed\n[IKE] initiating IKE_SA lab[1] to 194.226.121.150\n[ENC] generating IKE_SA_INIT request 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(HASH_ALG) N(REDIR_SUP) ]\n[NET] sending packet: from 172.19.0.2[500] to 194.226.121.150[500] (464 bytes)\n[NET] received packet: from 194.226.121.150[500] to 172.19.0.2[500] (437 bytes)\n[ENC] parsed IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) CERTREQ ]\n[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048\n[IKE] local host is behind NAT, sending keep alives\n[IKE] sending cert request for \"CN=mm-ipsec119-1791648365867-ca\"\n[IKE] authentication of 'CN=mm-ipsec119-1791648365867-client' (myself) with RSA signature successful\n[IKE] sending end entity cert \"CN=mm-ipsec119-1791648365867-client\"\n[IKE] establishing CHILD_SA private{1}\n[ENC] generating IKE_AUTH request 1 [ IDi CERT CERTREQ AUTH CPRQ(ADDR DNS) SA TSi TSr N(MOBIKE_SUP) N(NO_ADD_ADDR) N(EAP_ONLY) N(MSG_ID_SYN_SUP) ]\n[ENC] splitting IKE message (1440 bytes) into 2 fragments\n[ENC] generating IKE_AUTH request 1 [ EF(1/2) ]\n[ENC] generating IKE_AUTH request 1 [ EF(2/2) ]\n[NET] sending packet: from 172.19.0.2[4500] to 194.226.121.150[4500] (1236 bytes)\n[NET] sending packet: from 172.19.0.2[4500] to 194.226.121.150[4500] (276 bytes)\n[NET] received packet: from 194.226.121.150[4500] to 172.19.0.2[4500] (240 bytes)\n[ENC] parsed IKE_AUTH response 1 [ N(AUTH_FAILED) ]\n[IKE] received AUTHENTICATION_FAILED notify error\n\n\n1 !== 0\n", + "routerAuthLogs": [ + "ipsec identity added by api:admin@:: (*A = /ip ipsec identity add auth-method=digital-signature certificate=mm-ipsec119-1791648365867-server comment=mm-ipsec119-1791648365867 generate-policy=port-strict match-by=certificate mode-config=mm-ipsec119-1791648365867 peer=mm-ipsec119-1791648365867 policy-template-group=mm-ipsec119-1791648365867 remote-certificate=mm-ipsec119-1791648365867-client)", + "mm-ipsec119-1791648365867: => certificate (size 0x36f)", + "peer's ID does not match certificate", + "peer's ID does not match certificate", + "peer failed to authorize: mm-ipsec119-1791648365867 161.104.46.222-194.226.121.150 899db11c475c6cdd:693c9339b9312cce" + ], + "dockerCleanup": true, + "credentialFilesRemoved": true + } + }, + "client": { + "image": "mmapp-test/strongswan:accept119", + "debianPackages": "6.0.1-6+deb13u7", + "networkNamespaces": 2, + "capability": "NET_ADMIN", + "sharedClientCertificate": true, + "serverCertificatePinned": true, + "localId": "Derived directly from certificate; manual FQDN/DN failed", + "crypto": "AES256/SHA256/MODP2048; certificate pubkey authentication" + }, + "bounds": [ + "Two sessions with one certificate-derived DN; not all IKE ID types", + "FQDN/ADDR4/manual DN interop remains unaccepted; exact encoding cause not proven", + "Two Linux Docker namespaces use one public WAN/NAT; not physical redundancy or desktop/mobile client OS acceptance", + "Ping3/3 each is short data-plane check, not performance/SLA/rekey test", + "First cleanup comment assumption failed; scoped recovery removed verified own IDs/files before retries" + ] +} diff --git a/docs/ux-ui/screens/ipsec-multiple-1280-2026-10-10.png b/docs/ux-ui/screens/ipsec-multiple-1280-2026-10-10.png new file mode 100644 index 00000000..2aa1297d Binary files /dev/null and b/docs/ux-ui/screens/ipsec-multiple-1280-2026-10-10.png differ diff --git a/docs/ux-ui/screens/ipsec-multiple-320-2026-10-10.png b/docs/ux-ui/screens/ipsec-multiple-320-2026-10-10.png new file mode 100644 index 00000000..f99a1d4d Binary files /dev/null and b/docs/ux-ui/screens/ipsec-multiple-320-2026-10-10.png differ