Добавить docs/services/lxc201-gateway/Coredns.md
This commit is contained in:
parent
bb1e20c0e9
commit
d8e60b59e3
348
docs/services/lxc201-gateway/Coredns.md
Normal file
348
docs/services/lxc201-gateway/Coredns.md
Normal 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
|
||||
---
|
||||
```
|
||||
Loading…
Reference in New Issue
Block a user