Home » Настройка BIND как кеширующего или форвардинг DNS-сервера на Ubuntu 24
Настройка BIND как кеширующего или форвардинг DNS-сервера на Ubuntu 24

Настройка BIND как кеширующего или форвардинг DNS-сервера на Ubuntu 24

Если ты хоть раз страдал от медленной работы DNS и понимаешь, что сеть — это не волшебство, а серьёзная инфраструктура, то эта статья для тебя. Сегодня разберём, как превратить свой Ubuntu 24 в мощный DNS-сервер с помощью BIND9, который будет кешировать запросы и форвардить их там, где нужно. Покажу, как это сделать быстро, без лишних плясок с бубном, и расскажу про подводные камни, которые могут испортить настроение.

DNS — это основа интернета, но большинство админов просто используют 8.8.8.8 и забывают про оптимизацию. А зря! Правильно настроенный локальный DNS-сервер может ускорить работу сети в разы, повысить безопасность и дать больше контроля над трафиком. Плюс, это отличный способ понять, как работает DNS изнутри.

Зачем вообще нужен локальный DNS-сервер?

Представь: у тебя есть офис или дата-центр с десятками серверов, которые постоянно делают DNS-запросы. Каждый раз они обращаются к внешним серверам, создавая лишний трафик и задержки. Локальный кеширующий DNS-сервер решает эту проблему элегантно:

  • Кеширование — частые запросы обрабатываются локально за микросекунды
  • Форвардинг — можно направлять запросы на разные серверы в зависимости от домена
  • Безопасность — фильтрация вредоносных доменов прямо на уровне DNS
  • Мониторинг — полная статистика по DNS-запросам
  • Отказоустойчивость — если внешний DNS недоступен, кеш всё ещё работает

Как это работает под капотом

BIND9 (Berkeley Internet Name Domain) — это де-факто стандарт для DNS-серверов. Он умеет работать в нескольких режимах:

  • Кеширующий режим — получает запросы от клиентов, ищет ответы в кеше или запрашивает у внешних серверов
  • Форвардинг режим — перенаправляет запросы на указанные серверы
  • Гибридный режим — комбинация кеширования и форвардинга с гранулярным контролем

Когда приходит DNS-запрос, BIND сначала проверяет кеш. Если записи там нет или она устарела, сервер либо делает рекурсивный запрос (проходит всю цепочку от корневых серверов), либо форвардит запрос на указанные серверы. Результат кешируется согласно TTL записи.

Установка и базовая настройка

Начинаем с чистого Ubuntu 24. Для тестирования подойдёт любая VPS, но для продакшена лучше взять выделенный сервер.

# Обновляем систему
sudo apt update && sudo apt upgrade -y

# Устанавливаем BIND9 и утилиты
sudo apt install bind9 bind9utils bind9-doc dnsutils -y

# Проверяем, что служба запустилась
sudo systemctl status bind9

# Включаем автозапуск
sudo systemctl enable bind9

По умолчанию BIND уже работает как кеширующий сервер, но с минимальными настройками. Проверим:

# Тестируем локальный DNS
dig @localhost google.com

# Проверяем, что кеш работает (второй запрос должен быть быстрее)
time dig @localhost google.com

Настройка кеширующего DNS-сервера

Основной конфигурационный файл — /etc/bind/named.conf.options. Сделаем его более продвинутым:

sudo nano /etc/bind/named.conf.options

Вот оптимальная конфигурация для кеширующего сервера:

options {
    directory "/var/cache/bind";
    
    // Слушаем на всех интерфейсах
    listen-on port 53 { any; };
    listen-on-v6 port 53 { any; };
    
    // Разрешаем запросы от локальных сетей
    allow-query { localhost; localnets; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; };
    
    // Включаем рекурсию
    recursion yes;
    allow-recursion { localhost; localnets; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; };
    
    // Настройки кеша
    max-cache-size 256M;
    max-cache-ttl 604800;     // 7 дней
    max-ncache-ttl 3600;      // 1 час для негативных ответов
    
    // Безопасность
    dnssec-validation auto;
    auth-nxdomain no;
    version "DNS Server";
    
    // Производительность
    cleaning-interval 60;
    interface-interval 0;
    
    // Логирование
    querylog yes;
};

Теперь настроим логирование для мониторинга:

sudo nano /etc/bind/named.conf.local

Добавляем:

logging {
    channel default_debug {
        file "/var/log/named/default.log" versions 3 size 5m;
        severity dynamic;
    };
    
    channel query_log {
        file "/var/log/named/query.log" versions 3 size 10m;
        severity info;
    };
    
    category default { default_debug; };
    category queries { query_log; };
};

Создаём директорию для логов:

sudo mkdir -p /var/log/named
sudo chown bind:bind /var/log/named
sudo chmod 755 /var/log/named

Настройка форвардинг DNS-сервера

Форвардинг полезен, когда нужно направлять запросы на специализированные серверы или обеспечить дополнительную безопасность. Модифицируем /etc/bind/named.conf.options:

options {
    directory "/var/cache/bind";
    
    listen-on port 53 { any; };
    listen-on-v6 port 53 { any; };
    
    allow-query { localhost; localnets; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; };
    
    // Включаем форвардинг
    forward only;  // или forward first для гибридного режима
    forwarders {
        1.1.1.1;        // Cloudflare
        1.0.0.1;
        8.8.8.8;        // Google
        8.8.4.4;
    };
    
    // Настройки кеша остаются
    max-cache-size 256M;
    max-cache-ttl 604800;
    max-ncache-ttl 3600;
    
    dnssec-validation auto;
    auth-nxdomain no;
    version "DNS Server";
    
    querylog yes;
};

Разница между forward only и forward first:

Режим Поведение Плюсы Минусы
forward only Всегда форвардит на указанные серверы Предсказуемость, контроль трафика Если форвардеры недоступны — полный отказ
forward first Сначала форвардит, при неудаче — рекурсивный запрос Отказоустойчивость Может обходить политики безопасности

Гибридная конфигурация с зональным форвардингом

Самый мощный подход — настроить разные форвардеры для разных доменов. Это особенно полезно в корпоративной среде:

sudo nano /etc/bind/named.conf.local
// Локальные домены форвардим на внутренний DNS
zone "company.local" {
    type forward;
    forward only;
    forwarders { 192.168.1.10; 192.168.1.11; };
};

// Китайские домены через специальные серверы
zone "cn" {
    type forward;
    forward only;
    forwarders { 223.5.5.5; 223.6.6.6; };
};

// Домены для разработки
zone "dev.local" {
    type forward;
    forward only;
    forwarders { 192.168.100.5; };
};

А в основном конфиге оставляем forward first для всех остальных доменов:

options {
    // ... другие настройки
    
    forward first;
    forwarders {
        1.1.1.1;
        1.0.0.1;
        8.8.8.8;
        8.8.4.4;
    };
};

Тестирование и отладка

После каждого изменения конфигурации проверяем синтаксис:

# Проверка конфигурации
sudo named-checkconf

# Перезапуск службы
sudo systemctl restart bind9

# Проверка статуса
sudo systemctl status bind9

Комплексное тестирование:

# Тест базовой функциональности
dig @localhost google.com

# Тест кеширования (должен быть быстрее)
time dig @localhost google.com
time dig @localhost google.com

# Тест форвардинга конкретного домена
dig @localhost company.local

# Проверка DNSSEC
dig @localhost google.com +dnssec

# Тест производительности
for i in {1..10}; do time dig @localhost random-domain-$i.com; done

Полезные команды для мониторинга:

# Статистика BIND
sudo rndc stats
sudo cat /var/cache/bind/named.stats

# Дамп кеша
sudo rndc dumpdb -cache
sudo cat /var/cache/bind/named_dump.db

# Очистка кеша
sudo rndc flush

# Перезагрузка конфигурации без перезапуска
sudo rndc reload

Продвинутые настройки и оптимизация

Для высоконагруженных серверов добавим дополнительные оптимизации:

options {
    // ... базовые настройки
    
    // Производительность
    recursive-clients 10000;
    tcp-clients 1000;
    clients-per-query 100;
    max-clients-per-query 1000;
    
    // Настройки сети
    edns-udp-size 4096;
    max-udp-size 4096;
    
    // Таймауты
    resolver-query-timeout 10;
    
    // Кеширование
    lame-ttl 300;
    servfail-ttl 300;
    
    // Безопасность
    blackhole { 
        // Блокируем подозрительные сети
        192.0.2.0/24;
        198.51.100.0/24;
        203.0.113.0/24;
    };
    
    // Ограничиваем скорость запросов
    rate-limit {
        responses-per-second 100;
        window 5;
    };
};

Интеграция с системой мониторинга

Создаём скрипт для мониторинга DNS:

sudo nano /usr/local/bin/dns-monitor.sh
#!/bin/bash

# Проверка работы DNS
DNS_SERVER="127.0.0.1"
TEST_DOMAIN="google.com"

response_time=$(dig @$DNS_SERVER $TEST_DOMAIN | grep "Query time" | awk '{print $4}')
cache_size=$(sudo rndc status | grep "cache size" | awk '{print $3}')
queries_per_sec=$(sudo rndc status | grep "queries" | awk '{print $1}')

echo "DNS Response Time: ${response_time}ms"
echo "Cache Size: $cache_size"
echo "Queries/sec: $queries_per_sec"

# Проверка доступности
if dig @$DNS_SERVER $TEST_DOMAIN > /dev/null 2>&1; then
    echo "DNS Status: OK"
    exit 0
else
    echo "DNS Status: ERROR"
    exit 1
fi
sudo chmod +x /usr/local/bin/dns-monitor.sh

Добавляем в cron для регулярной проверки:

sudo crontab -e
# Проверка DNS каждые 5 минут
*/5 * * * * /usr/local/bin/dns-monitor.sh >> /var/log/dns-monitor.log 2>&1

Сравнение с альтернативными решениями

Решение Плюсы Минусы Лучший кейс
BIND9 Стандарт, максимум возможностей, стабильность Сложность настройки, ресурсоёмкость Корпоративная среда, сложные сценарии
Unbound Быстрый, безопасный, простой Меньше возможностей Кеширующий resolver для небольших сетей
PowerDNS Модульность, REST API, производительность Сложность, коммерческие фичи Хостинг-провайдеры, автоматизация
dnsmasq Лёгкий, простой, DHCP+DNS Ограниченные возможности Домашние сети, роутеры

Интересные факты и нестандартные применения

BIND можно использовать не только как классический DNS-сервер:

  • DNS-синкхол — перенаправление вредоносных доменов на localhost
  • Геолокационная балансировка — разные IP для разных регионов
  • Канарейка-токены — отслеживание взломов через специальные DNS-запросы
  • DNS-туннелирование — передача данных через DNS (хотя это спорно с точки зрения безопасности)

Пример настройки DNS-синкхола для блокировки рекламы:

sudo nano /etc/bind/named.conf.local
zone "doubleclick.net" {
    type master;
    file "/etc/bind/zones/null.zone";
};

zone "googleadservices.com" {
    type master;
    file "/etc/bind/zones/null.zone";
};
sudo mkdir -p /etc/bind/zones
sudo nano /etc/bind/zones/null.zone
$TTL 3600
@ IN SOA localhost. root.localhost. (
    2023010101 ; serial
    3600       ; refresh
    1800       ; retry
    604800     ; expire
    86400      ; minimum
)

@ IN NS localhost.
@ IN A 127.0.0.1
* IN A 127.0.0.1

Автоматизация и скрипты

Создаём скрипт для автоматического управления зонами:

sudo nano /usr/local/bin/dns-zone-manager.sh
#!/bin/bash

BIND_DIR="/etc/bind"
ZONES_DIR="$BIND_DIR/zones"
LOCAL_CONF="$BIND_DIR/named.conf.local"

add_block_zone() {
    local domain=$1
    
    # Добавляем зону в конфигурацию
    echo "zone \"$domain\" {" >> $LOCAL_CONF
    echo "    type master;" >> $LOCAL_CONF
    echo "    file \"$ZONES_DIR/null.zone\";" >> $LOCAL_CONF
    echo "};" >> $LOCAL_CONF
    
    # Перезагружаем конфигурацию
    rndc reload
    
    echo "Blocked domain: $domain"
}

remove_zone() {
    local domain=$1
    
    # Удаляем зону из конфигурации
    sed -i "/zone \"$domain\"/,/^};/d" $LOCAL_CONF
    
    # Перезагружаем конфигурацию
    rndc reload
    
    echo "Removed domain: $domain"
}

case "$1" in
    "block")
        add_block_zone "$2"
        ;;
    "unblock")
        remove_zone "$2"
        ;;
    "status")
        rndc status
        ;;
    *)
        echo "Usage: $0 {block|unblock|status} [domain]"
        exit 1
        ;;
esac
sudo chmod +x /usr/local/bin/dns-zone-manager.sh

Теперь можно легко блокировать домены:

# Блокировка домена
sudo /usr/local/bin/dns-zone-manager.sh block malware.com

# Разблокировка
sudo /usr/local/bin/dns-zone-manager.sh unblock malware.com

Безопасность и защита

Несколько важных аспектов безопасности:

# Настройка firewall
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow from 192.168.0.0/16 to any port 53
sudo ufw enable

# Ограничение доступа к конфигурации
sudo chmod 640 /etc/bind/named.conf*
sudo chown root:bind /etc/bind/named.conf*

# Настройка fail2ban для защиты от брутфорса
sudo apt install fail2ban -y
sudo nano /etc/fail2ban/jail.local
[named-refused]
enabled = true
filter = named-refused
logpath = /var/log/named/default.log
maxretry = 5
bantime = 3600

Производительность и мониторинг

Для мониторинга производительности можно использовать встроенные возможности BIND:

# Включение статистики
sudo nano /etc/bind/named.conf.options
options {
    // ... другие настройки
    
    statistics-file "/var/cache/bind/named.stats";
    zone-statistics yes;
};

И добавить в конфигурацию:

sudo nano /etc/bind/named.conf.local
statistics-channels {
    inet 127.0.0.1 port 8053 allow { 127.0.0.1; };
};

Теперь статистика доступна через HTTP на порту 8053. Можно интегрировать с Prometheus для мониторинга.

Заключение и рекомендации

BIND9 — это швейцарский нож в мире DNS. Да, он может показаться сложным на первый взгляд, но это окупается гибкостью и надёжностью. Для большинства задач достаточно базовой конфигурации кеширующего сервера, но возможности практически безграничны.

Когда использовать кеширующий режим:

  • Офисные сети с активным интернет-трафиком
  • Серверы разработки и тестирования
  • Небольшие дата-центры

Когда нужен форвардинг:

  • Корпоративные сети с политиками безопасности
  • Интеграция с существующей DNS-инфраструктурой
  • Необходимость фильтрации или логирования запросов

Гибридный подход подходит для:

  • Сложных сетевых топологий
  • Мультитенантных сред
  • Случаев, когда нужен максимальный контроль над DNS-трафиком

Помни: DNS — это критически важная служба. Всегда тестируй изменения, делай резервные копии конфигураций и настрой мониторинг. И не забывай про безопасность — открытые DNS-серверы часто используются для DDoS-атак.

Полезные ссылки для дальнейшего изучения:

Экспериментируй, изучай логи и не бойся пробовать новые возможности. DNS — это увлекательная область, где всегда есть что оптимизировать!


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked