From 4757799f0487922f4db12a89e3559051f8a84252 Mon Sep 17 00:00:00 2001 From: Crimson Date: Tue, 12 May 2026 20:36:17 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=D1=86=D0=B8=D1=8F:=20=D0=BE=D0=B1=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20production-?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB=D1=8C=20AmneziaDNS=20?= =?UTF-8?q?=D0=B8=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0=20DNS/53?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 ++++++++++++++++ config.example.toml | 2 ++ docs/ACCEPTANCE_CHECKLIST.md | 10 +++++++++ docs/CONFIGURATION.md | 8 +++++++ docs/INSTALLATION.md | 42 ++++++++++++++++++++++++++++++++++++ docs/PRODUCTION_EXAMPLE.md | 9 ++++++++ 6 files changed, 90 insertions(+) diff --git a/README.md b/README.md index 79bc7e1..5b38b15 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,25 @@ docker exec "$C" wg show Ожидаемые имена контейнера по умолчанию: `amnezia-awg2` или `amnezia-awg`. Ожидаемый интерфейс внутри container netns: обычно `awg0`, fallback-кандидаты описаны в `config.example.toml`. +### 3.1 Установить AmneziaDNS (обязательный production-шаг) + +Для production-профиля AWG2 установите AmneziaDNS из приложения AmneziaVPN после установки AmneziaWG/AWG: + +```text +AmneziaVPN: +Servers → → Services → AmneziaDNS → Install +``` + +Затем включите использование DNS для подключения: + +```text +Settings → Connection → DNS servers → Use AmneziaDNS +``` + +Security note: + +В ожидаемой production-схеме AmneziaDNS слушает `53/tcp` и `53/udp` внутри Docker и не публикуется на host interface. Не открывайте публично `53/tcp` или `53/udp` в host firewall; DNS должен быть доступен только через VPN-path. + ### 4. Собрать пакет на build-machine На production-хосте не нужны Rust, cargo и source tree. Сборка делается отдельно. diff --git a/config.example.toml b/config.example.toml index eca0426..86a604d 100644 --- a/config.example.toml +++ b/config.example.toml @@ -24,6 +24,8 @@ enabled = true ssh_port = 2323 # Must match the published Docker/Amnezia UDP port. # Verify with: docker port amnezia-awg2 2>/dev/null || docker port amnezia-awg +# AmneziaWG/AWG transport port exposed by Docker, usually 443/udp. +# This is not AmneziaDNS. Do not set this to 53. amnezia_port = 443 amnezia_protocols = ["udp"] allow_icmp = true diff --git a/docs/ACCEPTANCE_CHECKLIST.md b/docs/ACCEPTANCE_CHECKLIST.md index 4c72ab5..5c92366 100644 --- a/docs/ACCEPTANCE_CHECKLIST.md +++ b/docs/ACCEPTANCE_CHECKLIST.md @@ -144,6 +144,16 @@ - [ ] Описан runtime config bootstrap из `/usr/share/doc/awg2-harness/repo/config.example.toml`. - [ ] Clean install подтверждает, что `/etc/awg2-harness/config.toml` не создаётся автоматически. +## K3. AmneziaDNS + +- [ ] AmneziaDNS установлен из приложения AmneziaVPN. +- [ ] Контейнер `amnezia-dns` в состоянии healthy. +- [ ] `docker inspect amnezia-dns` показывает `"53/tcp":null` и `"53/udp":null`. +- [ ] `amnezia-dns` и `amnezia-awg2` подключены к одной Amnezia DNS Docker-сети. +- [ ] Публичный DNS-запрос к `:53` не получает ответа. +- [ ] DNS-резолвинг у VPN-клиента работает при активном подключении. +- [ ] AWG2 host firewall не открывает `53/tcp` и `53/udp`. + ## L. Host firewall (ports/SSH safety) - [ ] `awg2-harness validate-config` падает, если отсутствует секция `[host_firewall]`. diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index 7ff7d80..c1a2d42 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -108,6 +108,14 @@ swappiness = 1 `host_firewall.amnezia_port` — внешний UDP/TCP порт Amnezia, который AWG2 открывает в host `INPUT` (в зависимости от `host_firewall.amnezia_protocols`). В текущей целевой конфигурации default — `443`; значение должно совпадать с реально опубликованным Amnezia UDP/TCP port. +Важно: `host_firewall.amnezia_port` — это transport-порт AmneziaWG/AWG (например, `443/udp`). Это не порт AmneziaDNS. + +- Не задавайте `amnezia_port = 53`. +- Не добавляйте DNS/53 в `amnezia_protocols`. +- Не открывайте `53/tcp` или `53/udp` в AWG2 host firewall для ожидаемого production-профиля. + +В expected production layout AmneziaDNS работает как внутренний Docker/VPN сервис и не публикуется на public host interface. + Для диагностического блока `Docker/Amnezia port path` в `status` приоритет сопоставления такой: сначала ищется published UDP binding с `HostPort == host_firewall.amnezia_port`, затем fallback на ключ `"/udp"` как container port, затем (если UDP binding ровно один) берётся он. Если UDP bindings несколько и однозначного совпадения нет, статус показывает `published_udp_port: unknown`. Диагностика `FORWARD` в этом блоке является best-effort: сначала используется `iptables -S FORWARD`, затем fallback через `nft list ruleset`; результаты только отображаются в `status` и не изменяют host `FORWARD`/Docker NAT. diff --git a/docs/INSTALLATION.md b/docs/INSTALLATION.md index 97a1409..d4a9d7b 100644 --- a/docs/INSTALLATION.md +++ b/docs/INSTALLATION.md @@ -134,6 +134,48 @@ docker exec "$C" wg show Если контейнер называется иначе или интерфейс не `awg0`, отразите это в `/etc/awg2-harness/config.toml`. +### B3. Установить AmneziaDNS + +Установите AmneziaDNS из desktop-приложения AmneziaVPN: + +```text +Servers → → Services → AmneziaDNS → Install +``` + +Затем включите его для подключения: + +```text +Settings → Connection → DNS servers → Use AmneziaDNS +``` + +Ожидаемое состояние Docker: + +```bash +docker ps -a --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}' +``` + +Ожидаемая строка для DNS-контейнера: + +```text +amnezia-dns amnezia-dns Up ... (healthy) 53/tcp, 53/udp +``` + +Проверка публикации портов: + +```bash +docker inspect -f 'ports={{json .NetworkSettings.Ports}}' amnezia-dns +docker inspect -f 'networks={{range $n,$v := .NetworkSettings.Networks}}{{printf "%s=%s " $n $v.IPAddress}}{{end}}' amnezia-dns +docker inspect -f 'networks={{range $n,$v := .NetworkSettings.Networks}}{{printf "%s=%s " $n $v.IPAddress}}{{end}}' amnezia-awg2 +``` + +Ожидаемый результат по портам: + +```text +ports={"53/tcp":null,"53/udp":null} +``` + +Это означает, что DNS не опубликован на публичном host-интерфейсе и остаётся доступным только через VPN/Docker path. + ## C. Transfer artifacts Ниже два production-сценария установки. diff --git a/docs/PRODUCTION_EXAMPLE.md b/docs/PRODUCTION_EXAMPLE.md index 9e4a1c8..15d9ae0 100644 --- a/docs/PRODUCTION_EXAMPLE.md +++ b/docs/PRODUCTION_EXAMPLE.md @@ -14,6 +14,14 @@ Amnezia: published UDP: 443 peer CIDR: 10.8.1.0/24 +AmneziaDNS: + container: amnezia-dns + status: healthy + internal_ip: 172.29.172.254 + exposed_ports: 53/tcp, 53/udp inside Docker only + published_ports: none + public_53: closed + Expected status: service: active traffic drift: no @@ -37,6 +45,7 @@ docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' C="$(docker ps --format '{{.Names}}' | grep -E '^(amnezia-awg2|amnezia-awg)$' | head -n1)" docker port "$C" docker exec "$C" wg show +docker inspect -f 'ports={{json .NetworkSettings.Ports}}' amnezia-dns ``` Проверка, что runtime config создан вручную (ожидаемое поведение):