Документация: обязательный production-профиль AmneziaDNS и правила DNS/53

This commit is contained in:
2026-05-12 20:36:17 +05:00
parent b3d274f89d
commit 4757799f04
6 changed files with 90 additions and 0 deletions
+19
View File
@@ -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 → <server> → 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. Сборка делается отдельно.
+2
View File
@@ -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
+10
View File
@@ -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-запрос к `<server-public-ip>:53` не получает ответа.
- [ ] DNS-резолвинг у VPN-клиента работает при активном подключении.
- [ ] AWG2 host firewall не открывает `53/tcp` и `53/udp`.
## L. Host firewall (ports/SSH safety)
- [ ] `awg2-harness validate-config` падает, если отсутствует секция `[host_firewall]`.
+8
View File
@@ -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 на ключ `"<amnezia_port>/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.
+42
View File
@@ -134,6 +134,48 @@ docker exec "$C" wg show
Если контейнер называется иначе или интерфейс не `awg0`, отразите это в `/etc/awg2-harness/config.toml`.
### B3. Установить AmneziaDNS
Установите AmneziaDNS из desktop-приложения AmneziaVPN:
```text
Servers → <server> → 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-сценария установки.
+9
View File
@@ -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 создан вручную (ожидаемое поведение):