В этой статье я расскажу как установить и настроить DNS-сервер для небольшой локальной сети. Потребность в своем DNS-сервере возникла из-за необходимости одновременно отправлять запросы на два различных DNS-сервера. Первый будет обслуживает ресурсы внутри локальной сети, а второй доменные имена в интернете.
С помощью PDNSD мы сможем одновременно отправлять запросы на два различных DNSсервера. Запросы, которые не относятся к внутрисетевым ресурсам будут переадресовываться на Google DNS.
Для локального DNS-сервера, мы будем использовать быстрый и легкий в настройке PDNSD. Кроме простого кэширования, умеет разделять запросы по условию, одновременно отправлять их на несколько DNS-серверов и отдавать клиенту первый вернувшийся ответ.
Установка и настройка PDNSD
Установим PDNSD командой в терминале:
apt-get install pdnsd
В процессе необходимо будет выбрать один из шаблонов настроек, выбираем пункт «Manual».
Открываем файл:
nano /etc/default/pdnsd
Настраиваем параметры запуска PDNSD, для этого нужно изменить значение параметра START_DAEMON как указано в примере ниже:
START_DAEMON=yes
Открываем конфиг PDNSD:
nano /etc/pdnsd.conf
Добавим в него следующие параметры:
global {
perm_cache=10240; // Максимальный размер кэша в килобайтах
cache_dir="/var/cache/pdnsd"; // Директория кэша записей DNS
server_ip = 0.0.0.0; // Слушать запросы на всех сетевых интерфейсах
status_ctl = on; // Разрешить утилиты pdnsd-ctl для управления кэшем
min_ttl=15m; // Минимальное время жизни записи в кэше
max_ttl=1w; // Максимальное время жизни записи в кэше
timeout=10; // Тайм-аут DNS-запроса
par_queries=2; // Количество одновременно опрашиваемых DNS-серверов
}
// DNS-отвечающий за локальные ресурсы
server {
label = ".localdomain"; // Метка секции server
ip = 10.0.1.2, 10.0.1.3; // Адреса локальных DNS
timeout = 10; // Тайм-аут DNS-запроса
uptest = query; // Метод проверки доступности сервера
interval = 10m; // Интервал для теста доступности сервера
ping_timeout = 300; // Тайм-аут для теста ping
}
// Google DNS
server {
label = "recurse";
root_server=on;
randomize_servers = on;
ip = 8.8.8.8, 8.8.8.4, 77.88.8.8, 77.88.8.1; // Метка секции server
timeout = 10; // Тайм-аут DNS-запроса
uptest = query; // Метод проверки доступности сервера
interval = 10m; // Интервал для теста доступности сервера
ping_timeout = 300; // Тайм-аут для теста ping
exclude = .localdomain; // Исключить запросы по доменному имени
policy = included; // Включающие/исключающие списки для секции server
preset = off; // Состояние удаленного сервера после запуска
}
Чтобы PDNSD слушал запросы на всех интерфейсах, необходимо установить значение параметра server_ip равным 0.0.0.0. Как вариант можно указать имя или ip отдельного интерфейса.
Управление сервером PDNSD
Проверить статус DNS-сервера выполните команду:
pdnsd-ctl status
Чтобы очистить кэш PDNSD:
pdnsd-ctl empty-cache
Открыть доступ к DNS в iptables
Добавьте в iptables правила:
# Открываем DNS для всех пользователей
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
# Ограничиваем доступ по MAC
iptables -A INPUT -i eth0 -m mac --mac-source 00:00:00:00:00:00 -j ACCEPT