Настройка DNS сервера bind для локальной сети
Отредактирована 20.05.2026
Как правильно выбрать домен для локального использования?
Почему нельзя использовать реальные домены локально?
- Конфликт с глобальным DNS: Если nocip.ru существует в интернете, ваши локальные запросы могут уйти в интернет или вызвать путаницу;
- SSL-сертификаты: Браузеры будут пытаться проверить реальные сертификаты;
- Утечка запросов: Конфиденциальная информация о вашей сети может утечь наружу;
- Непредсказуемое поведение: Некоторые приложения могут работать некорректно.
Правильные варианты для локальных доменов
- для домашней сети: home.arpa , local.lan , myhome.internal;
- для малого офиса: office.internal , corp.local , company.private
- для предприятия с реальным доменом, например для домена nocip.ru: internal.nocip.ru , corp.nocip.ru , lan.nocip.ru
- для лаборатории/тестов: lab.internal , test.local , dev.private
Итоговая структура
# Текст DNS-серверы: 10.20.20.0/24 ├── ns1 (10.20.20.4) // Основной DNS (master) └── ns2 (10.20.20.5) // Резервный DNS (slave) Сервера: 192.168.20.0/24 └── srv1 (192.168.20.4) // Физический сервер 1 Сервера: 10.40.0.0/24 └── srv2 (10.40.0.4) // Физический сервер 2
Настройка Master-сервера (ns1) — 10.20.20.4
Шаг 1: Установка BIND9
sudo apt update sudo apt install bind9 bind9utils dnsutils -y
- bind9 — это сам DNS-сервер.
- bind9utils — содержит полезные утилиты для проверки конфигурации, такие как named-checkconf.
- dnsutils — предоставляет инструменты для диагностики, например, dig и nslookup, которые необходимы для тестирования.
Файлы конфигурации, которые нужно отредактировать
- named.conf.options (основные опции)
- named.conf.local (определение зон)
- db.corp.local (прямая зона для corp.local)
- db.10.20.20 (обратная зона для подсети 10.20.20.0/24)
- db.10.40 (обратная зона для подсети 10.40.0.0/24)
- db.192.168.20 (обратная зона для подсети 192.168.20.0/24)
Шаг 2: Основные опции
cd /etc/bind/ && ls -l
sudo nano /etc/bind/named.conf.options
options { directory "/var/cache/bind"; listen-on { any; }; allow-query { 127.0.0.1; 10.20.20.0/24; 10.40.0.0/24; 192.168.20.0/24; // any; такой директивой можно дать доступ всем хостам к локальным DNS-серверам }; allow-recursion { 127.0.0.1; 10.20.20.0/24; 10.40.0.0/24; 192.168.20.0/24; }; forwarders { 8.8.8.8; 8.8.4.4; }; dnssec-validation auto; };
Шаг 3: Определение зон
sudo nano /etc/bind/named.conf.local
// На ns1.corp.local (10.20.20.4) zone "corp.local" { type master; file "/etc/bind/zones/db.corp.local"; // Файл с записями A, MX, CNAME и т.д. allow-transfer { 10.20.20.5; }; // Разрешаем трансфер на ns2 also-notify { 10.20.20.5; }; // Уведомляем ns2 об изменениях }; zone "20.20.10.in-addr.arpa" { type master; file "/etc/bind/zones/db.10.20.20"; // Файл с PTR-записями для reverse DNS, подсеть 10.20.20/24 allow-transfer { 10.20.20.5; }; also-notify { 10.20.20.5; }; }; zone "40.10.in-addr.arpa" { type master; file "/etc/bind/zones/db.10.40"; // Файл с PTR-записями для reverse DNS, подсеть 10.40.0.0/24 allow-transfer { 10.20.20.5; }; also-notify { 10.20.20.5; }; }; zone "20.168.192.in-addr.arpa" { type master; file "/etc/bind/zones/db.192.168.20"; // Файл с PTR-записями для reverse DNS, подсеть 192.168.20.0/24 allow-transfer { 10.20.20.5; }; also-notify { 10.20.20.5; }; };
Шаг 4: Прямая зона для corp.local
sudo mkdir -p /etc/bind/zones
sudo cp db.local /etc/bind/zones/db.corp.local cd zones/
$TTL 3h @ IN SOA ns1.corp.local. admin.corp.local. ( 2 ; Serial 3h ; Refresh 1h ; Retry 1w ; Expire 1h ) ; Negative Cache TTL ; NS record @ IN NS ns1.corp.local. @ IN NS ns2.corp.local. ; DNS servers ns1 IN A 10.20.20.4 ns2 IN A 10.20.20.5 ; Servers srv1 IN A 192.168.20.4 srv2 IN A 10.40.0.4
Шаг 5: Обратные зоны
admin@ns1:/etc/bind/zones$ sudo cp db.corp.local db.10.20.20
admin@ns1:/etc/bind/zones$ sudo nano db.10.20.20
; Обратная зона для DNS (10.20.20.0/24) $TTL 3h @ IN SOA ns1.corp.local. admin.corp.local. ( 2 ; Serial 3h ; Refresh 1h ; Retry 1w ; Expire 1h ) ; Negative Cache TTL IN NS ns1.corp.local. IN NS ns2.corp.local. 4 IN PTR ns1.corp.local. 5 IN PTR ns2.corp.local.
admin@ns1:/etc/bind/zones$ sudo cp db.corp.local db.10.40
admin@ns1:/etc/bind/zones$ sudo nano db.10.40
; Обратная зона для серверов (10.40.0.0/24) $TTL 3h @ IN SOA ns1.corp.local. admin.corp.local. ( 2 ; Serial 3h ; Refresh 1h ; Retry 1w ; Expire 1h ) ; Negative Cache TTL IN NS ns1.corp.local. IN NS ns2.corp.local. 4.0 IN PTR srv2.corp.local.
admin@ns1:/etc/bind/zones$ sudo cp db.corp.local db.192.168.20
admin@ns1:/etc/bind/zones$ sudo nano db.192.168.20
; Обратная зона для серверов (192.168.20.0/24) $TTL 3h @ IN SOA ns1.corp.local. admin.corp.local. ( 2 ; Serial 3h ; Refresh 1h ; Retry 1w ; Expire 1h ) ; Negative Cache TTL IN NS ns1.corp.local. IN NS ns2.corp.local. 4 IN PTR srv1.corp.local.
Шаг 5: Проверка и запуск
# Проверка конфигурации sudo named-checkconf sudo named-checkzone corp.local /etc/bind/zones/db.corp.local sudo named-checkzone 20.20.10.in-addr.arpa /etc/bind/zones/db.10.20.20 sudo named-checkzone 40.10.in-addr.arpa /etc/bind/zones/db.10.40 sudo named-checkzone 20.168.192.in-addr.arpa /etc/bind/zones/db.192.168.20
# Перезапустите службу для применения изменений, после изменения конфигурационных файлов sudo systemctl restart named.service # Включите автоматический запуск службы, если сервер/система будет перезагружен(а), # systemd будет знаеть, что эту службу нужно стартовать. sudo systemctl enable named.service # Проверьте, что служба работает sudo systemctl status named.service --no-pager
Рассмотрим более подробно SOA-запись:
$TTL 3h @ IN SOA ns1.corp.local. admin.corp.local. ( 2 ; Serial 3h ; Refresh 1h ; Retry 1w ; Expire 1h ) ; Negative Cache TTL
$TTL 3h
- Устанавливает время жизни записей по умолчанию — 3 часа.
- Это значит: если у конкретной записи нет своего TTL, другие DNS-серверы и клиенты будут хранить её в кэше 3 часа.
@ IN SOA ...
Тип записи: SOA (Start of Authority — начало полномочий). Это самая главная запись в зоне. Она указывает, какой DNS-сервер является основным для этой зоны и содержит параметры репликации (синхронизации).
ns1.corp.local. admin.corp.local.
- ns1.corp.local. — Primary Master сервер. Здесь хранится эталонная версия зоны.
- admin.corp.local. — Электронная почта администратора. admin.corp.local на самом деле значит admin@corp.local (точка заменяет символ @, чтобы не путать с символом зоны).
Числа в скобках (Серийный номер и таймеры)
- Серийный номер зоны. При каждом изменении зоны (добавлении новых компьютеров, смене IP) его нужно увеличивать (например, на 1). Вторичные DNS-серверы (slave) смотрят на этот номер, чтобы понять, изменилась ли зона и надо ли её перекачивать.
- Slave-серверы должны проверять мастер каждые 3 часа, не изменился ли серийный номер.
- Если Slave не смог связаться с мастером (например, сеть упала), он будет повторять попытку каждый час.
- Если Slave не может связаться с мастером в течение 1 недели, он перестаёт отвечать на запросы по этой зоне (зона истекает).
- Если клиент запросил имя, которое не существует (NXDOMAIN), разрешается кэшировать отрицательный ответ на 1 час.
Настройка Slave-сервера (ns2) — 10.20.20.5
Шаг 1: Установка BIND9
sudo apt update sudo apt install bind9 bind9utils dnsutils -y
Файлы конфигурации, которые нужно отредактировать
- named.conf.options (основные опции)
- named.conf.local (определение зон)
Шаг 2: Основные опции
sudo nano /etc/bind/named.conf.options
options { directory "/var/cache/bind"; listen-on { any; }; allow-query { 127.0.0.1; 10.20.20.0/24; 10.40.0.0/24; 192.168.20.0/24; // any; такой директивой можно дать доступ всем хостам к локальным DNS-серверам }; allow-recursion { 127.0.0.1; 10.20.20.0/24; 10.40.0.0/24; 192.168.20.0/24; }; forwarders { 8.8.8.8; 8.8.4.4; }; dnssec-validation auto; };
Шаг 3: Определение зон (Slave)
sudo nano /etc/bind/named.conf.local
// На ns2.corp.local (10.20.20.5) zone "corp.local" { type slave; file "/var/lib/bind/db.corp.local"; // Куда сохранять копии masters { 10.20.20.4; }; // Master-сервер }; zone "20.20.10.in-addr.arpa" { type slave; file "/var/lib/bind/db.10.20.20"; masters { 10.20.20.4; }; }; zone "40.10.in-addr.arpa" { type slave; file "/var/lib/bind/db.10.40"; masters { 10.20.20.4; }; }; zone "20.168.192.in-addr.arpa" { type slave; file "/var/lib/bind/db.192.168.20"; masters { 10.20.20.4; }; };
Шаг 4: Настройка прав
/var/lib/bind/, а не в /etc/bind/zones/ # Создаем директорию для кэша (если её нет) sudo mkdir -p /var/lib/bind sudo chown bind:bind /var/lib/bind
Шаг 5: Проверка и запуск
# Проверка конфигурации sudo named-checkconf
# Перезапустите службу для применения изменений, после изменения конфигурационных файлов sudo systemctl restart named.service # Включите автоматический запуск службы, если сервер/система будет перезагружен(а), # systemd будет знаеть, что эту службу нужно стартовать. sudo systemctl enable named.service # Проверьте, что служба работает sudo systemctl status named.service --no-pager
ls /var/lib/bind
Итоговая структура
# Итоговая структура Master (ns1) 10.20.20.4 Slave (ns2) 10.20.20.5 ├── named.conf.local ├── named.conf.local │ ├── type master │ ├── type slave │ ├── allow-transfer { ns2 } │ └── masters { ns1 } │ └── also-notify { ns2 } │ └── /etc/bind/zones/ └── /var/lib/bind/ ├── db.corp.local (ручное) ├── db.corp.local (авто) ├── db.10.20.20 (ручное) ├── db.10.20.20 (авто) ├── db.10.40 (ручное) ├── db.10.40 (авто) └── db.192.168.20 (ручное) └── db.192.168.20 (авто)
Настройка DNS, используя systemd-resolved (рекомендую для Ubuntu 18.04+)
# 1. Открываем конфиг sudo nano /etc/systemd/resolved.conf # 2. Приводим секцию [Resolve] к такому виду (уберите # перед строками) [Resolve] DNS=10.20.20.4 10.20.20.5 Domains=corp.local DNSSEC=no # 3. Сохраняем и перезапускаем сервис sudo systemctl restart systemd-resolved.service # 4. Проверяем, что DNS применились resolvectl status
Утилиты dig, host для проверки прямой и обратной зоны
Проверка прямой зоны (имя → IP)
# === DIG (рекомендую) === # Краткий вывод dig @10.20.20.4 srv1.corp.local +short # Вывод: 10.40.0.4 # Полный вывод dig @10.20.20.4 srv1.corp.local # Вывод: статус, флаги, секция ответа и т.д. # === HOST (для быстрой проверки) === host srv1.corp.local 10.20.20.4 # Вывод: srv1.corp.local has address 10.40.0.4
Проверка обратной зоны (IP → имя)
# === DIG === dig @10.20.20.4 -x 10.40.0.4 +short # Вывод: srv1.corp.local. # === HOST === host 10.30.0.4 10.20.20.4 # Вывод: 4.0.40.10.in-addr.arpa domain name pointer srv1.corp.local.
Проверка NS записей
# DIG (полный контроль) dig @10.20.20.4 corp.local NS +short # HOST (быстро) host -t NS corp.local 10.20.20.4
Проверка SOA (Start of Authority — начало полномочий) записи
# DIG dig @10.20.20.4 corp.local SOA # HOST host -t SOA corp.local 10.20.20.4
Какая утилита лучше для проверки DNS: host, nslookup или dig?
| Характеристика | dig | host | nslookup |
|---|---|---|---|
| Мощность | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| Простота | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ |
| Для скриптов | ✅ Лучший | ✅ Хорош | ❌ Неудобен |
| Контроль над запросом | Полный | Ограниченный | Ограниченный |
| Формат вывода | Парсится легко | Для человека | Запутанный |
| Статус | Актуальный | Актуальный | Устаревший |