Добавить docs/services/lxc201-gateway/Coredns.md

This commit is contained in:
zailon 2026-05-28 11:54:06 +05:00
parent bb1e20c0e9
commit d8e60b59e3

View File

@ -0,0 +1,348 @@
# Руководство по настройке локального DNS-сервера на CoreDNS
**Версия:** 1.0
**Дата:** 28.05.2026
**Цель:** Настройка сервера имен для локальных сервисов (домен .zailon.ru) с возможностью работы при отсутствии интернета.
## Введение
CoreDNS — это гибкий DNS-сервер, написанный на Go. В данной инструкции мы настраиваем его как Docker-контейнер. Он будет выполнять две функции:
1. Отдавать локальные IP-адреса для сервисов внутри домена `zailon.ru`.
2. Перенаправлять (форвардить) все остальные запросы (например, google.com) на публичные DNS.
## Требования
* Сервер Ubuntu 24.04 (или аналогичный Linux).
* Установленный Docker и Docker Compose.
* Статический IP-адрес сервера (в примере: 192.168.1.201).
* Права пользователя `root`.
---
## Шаг 1: Подготовка файловой структуры
Создаем рабочие директории на сервере, где будут храниться конфигурация и файлы зон.
```bash
mkdir -p /opt/coredns/zones
```
---
## Шаг 2: Освобождение порта 53 на хосте
По умолчанию в Ubuntu сервис `systemd-resolved` "слушает" порт 53 на локальном интерфейсе. Это не даст CoreDNS запуститься. Нужно отключить встроенный DNS-слушатель.
1. Открываем конфигурационный файл:
```bash
sudo nano /etc/systemd/resolved.conf
```
2. Находим строку `#DNSStubListener=yes`, раскомментируем её (убираем решетку) и меняем значение на `no`:
```text
DNSStubListener=no
```
3. Перезапускаем сервис сети для применения изменений:
```bash
sudo systemctl restart systemd-resolved
```
4. Проверяем, что порт 53 освободился (вывод должен быть пустым):
```bash
sudo ss -tulpn | grep :53
```
---
## Шаг 3: Создание конфигурации CoreDNS (Corefile)
Создаем файл `Corefile`, который говорит серверу, как обрабатывать запросы. Важно использовать плагин `file` для BIND-зоны.
```bash
nano /opt/coredns/Corefile
```
Содержимое файла:
```text
zailon.ru:53 {
file /etc/coredns/zones/zailon.ru.zone zailon.ru
forward . 1.1.1.1 8.8.8.8
cache 30
reload
log
errors
}
.:53 {
forward . 1.1.1.1 8.8.8.8
cache 30
reload
log
errors
}
```
**Разбор плагинов:**
* `file`: Читает текстовый файл зоны и отдает локальные IP.
* `forward`: Если домен не `zailon.ru`, шлет запрос в Cloudflare/Google.
* `cache`: Запоминает ответы на 30 секунд для скорости.
* `reload`: Автоматически перечитывает конфиг при изменениях.
---
## Шаг 4: Создание DNS-зоны
Создаем файл с записями ваших сервисов. Формат: `имя IN A ip-адрес`.
```bash
nano /opt/coredns/zones/zailon.ru.zone
```
Содержимое файла:
```text
$TTL 3600
@ IN SOA ns1.zailon.ru. admin.zailon.ru. (
2026052801 ; Serial
3600 ; Refresh
600 ; Retry
604800 ; Expire
86400 ; Minimum TTL
)
@ IN NS ns1.zailon.ru.
ab IN A 192.168.1.203
book IN A 192.168.1.203
bw IN A 192.168.1.202
cerberus IN A 192.168.1.208
chat IN A 192.168.1.206
cloud IN A 192.168.1.213
git IN A 192.168.1.209
jellyfin IN A 192.168.1.203
mail IN A 192.168.1.212
music IN A 192.168.1.203
nc IN A 192.168.1.205
olimp IN A 192.168.1.201
wiki IN A 192.168.1.202
```
*Примечание: Список можно дополнять. Обязательно оставьте пустую строку в конце файла.*
---
## Шаг 5: Docker Compose
Создаем файл запуска контейнера. Мы явно привязываем порты к интерфейсам `127.0.0.1` (для локальных проверок) и `192.168.1.201` (для сети).
```bash
nano /opt/coredns/docker-compose.yml
```
Содержимое:
```yaml
services:
coredns:
image: coredns/coredns:latest
container_name: coredns
restart: unless-stopped
ports:
- "127.0.0.1:53:53/tcp"
- "127.0.0.1:53:53/udp"
- "192.168.1.201:53:53/tcp"
- "192.168.1.201:53:53/udp"
volumes:
- /opt/coredns/Corefile:/Corefile:ro
- /opt/coredns/zones:/etc/coredns/zones:ro
dns:
- 1.1.1.1
- 8.8.8.8
cap_add:
- NET_BIND_SERVICE
```
---
## Шаг 6: Запуск и Проверка
1. Запускаем контейнер:
```bash
cd /opt/coredns
docker compose up -d
```
2. Проверяем логи (должно быть сообщение о загрузке конфигурации):
```bash
docker logs coredns
```
3. Проверяем локальные записи (должен вернуть внутренний IP):
```bash
dig @192.168.1.201 book.zailon.ru +short
```
4. Проверяем внешние записи (должен вернуть публичный IP):
```bash
dig @192.168.1.201 google.com +short
```
---
## Полезные команды
* **Перезагрузка конфига без рестарта контейнера** (сработает плагин reload):
```bash
docker restart coredns
```
* **Проверка синтаксиса Corefile перед запуском:**
```bash
docker run --rm -v /opt/coredns/Corefile:/Corefile coredns/coredns -conf /Corefile
```
* **Трассировка DNS-запроса для отладки:**
```bash
dig @192.168.1.201 book.zailon.ru +trace
```
---
## Решение проблем (Troubleshooting)
### 1. Ошибка: `bind: address already in use`
**Причина:** Порт 53 занят `systemd-resolved`.
**Решение:** Выполнить Шаг 2 (отключить `DNSStubListener`).
### 2. Dig возвращает внешний IP вместо локального
**Причина:** CoreDNS не нашел запись в локальной зоне.
**Проверка:**
* Убедитесь, что в `Corefile` используется плагин `file`, а не `hosts`.
* Проверьте права на файл зоны: `chmod 644`.
* Проверьте пути монтирования в `docker-compose.yml` (должны быть абсолютными).
### 3. Контейнер не видит файлы зоны
**Причина:** Ошибка монтирования томов (volumes).
**Решение:** В `docker-compose.yml` используйте абсолютные пути (`/opt/coredns/...`), избегайте относительных (`./`).
### 4. Ошибка парсинга зоны
**Причина:** Синтаксическая ошибка в файле `zailon.ru.zone`.
**Решение:** Проверьте логи `docker logs coredns`. Убедитесь, что файл заканчивается пустой строкой.
---
## Безопасность
1. **Ограничение доступа:** В данном конфиге порт 53 открыт только для локальной подсети через привязку к интерфейсу `192.168.1.201`. Внешний интерфейс (WAN) не слушает этот порт.
2. **Режим Read-Only:** Файлы конфигурации смонтированы с флагом `:ro` (Read Only), что предотвращает случайную модификацию конфигов изнутри контейнера.
3. **Обновления:** Регулярно выполняйте `docker compose pull` и `docker compose up -d` для обновления образа CoreDNS.
4. **Резервное копирование:** Сохраняйте копии `Corefile` и `zailon.ru.zone` в отдельное хранилище. Потеря этих файлов потребует ручного восстановления записей.
---
## 🤖 AI Контекст для аварийного восстановления
Скопируйте этот блок и сохраните в отдельный файл `ai_emergency_context.txt`. При аварии отправьте его нейросети целиком. Она мгновенно восстановит состояние системы.
```text
[AI EMERGENCY CONTEXT - COREDNS SETUP]
DATE: 28.05.2026
HOST_OS: Ubuntu 24.04
SERVER_IP: 192.168.1.201
CONTAINER_NAME: coredns
IMAGE: coredns/coredns:latest
PROJECT_PATH: /opt/coredns/
FILE: /opt/coredns/Corefile
---
zailon.ru:53 {
file /etc/coredns/zones/zailon.ru.zone zailon.ru
forward . 1.1.1.1 8.8.8.8
cache 30
reload
log
errors
}
.:53 {
forward . 1.1.1.1 8.8.8.8
cache 30
reload
log
errors
}
---
FILE: /opt/coredns/zones/zailon.ru.zone
---
$TTL 3600
@ IN SOA ns1.zailon.ru. admin.zailon.ru. (
2026052801 ; Serial
3600 ; Refresh
600 ; Retry
604800 ; Expire
86400 ; Minimum TTL
)
@ IN NS ns1.zailon.ru.
ab IN A 192.168.1.203
book IN A 192.168.1.203
bw IN A 192.168.1.202
cerberus IN A 192.168.1.208
chat IN A 192.168.1.206
cloud IN A 192.168.1.213
git IN A 192.168.1.209
jellyfin IN A 192.168.1.203
mail IN A 192.168.1.212
music IN A 192.168.1.203
nc IN A 192.168.1.205
olimp IN A 192.168.1.201
wiki IN A 192.168.1.202
---
FILE: /opt/coredns/docker-compose.yml
---
services:
coredns:
image: coredns/coredns:latest
container_name: coredns
restart: unless-stopped
ports:
- "127.0.0.1:53:53/tcp"
- "127.0.0.1:53:53/udp"
- "192.168.1.201:53:53/tcp"
- "192.168.1.201:53:53/udp"
volumes:
- /opt/coredns/Corefile:/Corefile:ro
- /opt/coredns/zones:/etc/coredns/zones:ro
dns:
- 1.1.1.1
- 8.8.8.8
cap_add:
- NET_BIND_SERVICE
---
SYSTEM_STATE:
- systemd-resolved DNSStubListener = no
- Port 53 bound to 127.0.0.1 and 192.168.1.201 only
- All paths are ABSOLUTE
- Plugin used: file (NOT hosts)
- Serial: 2026052801
- Fallback DNS: 1.1.1.1, 8.8.8.8
RECOVERY COMMANDS:
1. cd /opt/coredns && docker compose down && docker compose up -d
2. dig @192.168.1.201 book.zailon.ru +short
3. docker logs coredns --tail 20
4. ss -tulpn | grep :53
---
```