Очень часто возникает необходимость установить и настроить локальный кэширующий DNS-сервер в локальной сети. Для достижения этой цели воспользуемся dnsmasq с поддержкой шифрования исходящего трафика при помощи TLS.
Введение
Основным DNS-сервером мы будем использовать простой и потребляющий мало ресурсов, но при этом достаточно мощный dnsmasq, а в качестве бэкэнда TLS-шифрования исходящего трафика — stubby.
Все описанные ниже действия приводятся на примере дистрибутива Fedora, но, за исключением способа установки пакетов, они будут работать и в любом другом.
Установка и настройка dnsmasq
Установим пакет dnsmasq из основного репозитория:
sudo dnf install dnsmasq
Создадим новый файл конфигурации и зададим правильные права доступа:
sudo touch /etc/dnsmasq.d/dnsmasq.conf sudo chown root:dnsmasq /etc/dnsmasq.d/dnsmasq.conf sudo chmod 0644 /etc/dnsmasq.d/dnsmasq.conf
Загрузим его в текстовый редактор:
sudoedit /etc/dnsmasq.d/dnsmasq.conf
Внесём соответствующие правки:
# Указываем интерфейсы для прослушивания. listen-address=::1 listen-address=127.0.0.1 listen-address=192.168.1.1 bind-interfaces # Запрещаем чтение файла /etc/resolv.conf для получения DNS-серверов. no-resolv # Запрещаем добавление хостов из файла /etc/hosts. no-hosts # Указываем вышестоящие DNS-серверы. server=::1#5353 server=127.0.0.1#5353 # Указываем количество элементов для локального кэша DNS. cache-size=5000 # Экспортируем дополнительные хосты при необходимости. address=/example.org/192.168.1.25
Сохраним изменения.
Установка и настройка stubby
Установим пакет stubby (для поддержки DoT):
sudo dnf install stubby
Откроем файл /etc/stubby.yml в текстовом редакторе:
sudoedit /etc/stubby.yml
Внесём ряд правок (в качестве примера мы приводим листинг готового файла конфигурации с комментариями на русском языке):
# Активируем режим STUB-резолвера. resolution_type: GETDNS_RESOLUTION_STUB # Активируем транспорт TLS. dns_transport_list: - GETDNS_TRANSPORT_TLS # Требуем обязательного использования TLS. tls_authentication: GETDNS_AUTHENTICATION_REQUIRED # Задаём стойкость шифра (128 или 256 бит). tls_query_padding_blocksize: 128 # Активируем rfc7871. edns_client_subnet_private : 1 # Разрешаем переключение на другой DNS-сервер в случае недоступности текущего. round_robin_upstreams: 1 # Задаём таймаут keepalive в миллисекундах. idle_timeout: 9000 # Указываем лимит исходящих DNS-запросов на вышестоящий сервер. limit_outstanding_queries: 100 # Задаём таймаут ожидания ответа от сервера в миллисекундах. timeout: 1000 # Указываем используемые шифры для TLS 1.2 и ниже. tls_cipher_list: "EECDH+AESGCM:EECDH+CHACHA20" # Указываем используемые шифры для TLS 1.3 и выше. tls_ciphersuites: "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256" # Устанавливаем минимальную версию TLS. tls_min_version: GETDNS_TLS1_2 # Устанавливаем максимальную версию TLS. tls_max_version: GETDNS_TLS1_3 # Настраиваем stubby на прослушивание loopback-интерфейса и порта 5353. listen_addresses: - 127.0.0.1@5353 - 0::1@5353 # Указываем используемые серверы DNS. upstream_recursive_servers: - address_data: 9.9.9.9 tls_auth_name: "dns.quad9.net" - address_data: 1.1.1.1 tls_auth_name: "cloudflare-dns.com" - address_data: 2620:fe::fe tls_auth_name: "dns.quad9.net" - address_data: 2606:4700:4700::1111 tls_auth_name: "cloudflare-dns.com"
Сохраним изменения.
Настройка межсетевого экрана
Разрешим входящий трафик на следующие порты: 53/udp и 5353/udp:
sudo firewall-cmd --add-service=dns --permanent sudo firewall-cmd --add-port=5353/udp --permanent
Перезагрузим конфигурацию брандмауэра:
sudo firewall-cmd --reload
Изменение резолвера по умолчанию
Для того, чтобы dnsmasq смог занять стандартный порт 53/udp, мы должны отключить и заблокировать запуск сервиса systemd-resolved, применяемого по умолчанию в качестве локального DNS-резолвера в большинстве современных дистрибутивов:
sudo systemctl disable --now systemd-resolved.service sudo systemctl mask systemd-resolved.service
Удалим символическую ссылку /etc/resolv.conf, создадим пустой текстовый файл и установим правильные права доступа:
sudo rm -f /etc/resolv.conf sudo touch /etc/resolv.conf sudo chown root:root /etc/resolv.conf sudo chmod 0644 /etc/resolv.conf
Откроем созданный файл в текстовом редакторе:
sudoedit /etc/resolv.conf
Добавим следующее содержание:
nameserver 127.0.0.1 nameserver ::1 options trust-ad options ndots:1
Сохраним изменения и выйдем из редактора.
Настройка автозапуска
Активируем systemd-юниты:
sudo systemctl enable --now dnsmasq.service sudo systemctl enable --now stubby.service
Перезапустим их для корректного вступления в силу изменений конфигурации:
sudo systemctl restart dnsmasq.service sudo systemctl restart stubby.service
Проверка работы DNS
Проверим работу настроенной связки:
dig @127.0.0.1 easycoding.org
Если всё сделано верно, будет возвращён действительный ответ.
Литература
При написании статьи использовалась литература из следующих источников:
NetworkManager затрет /etc/resolv.conf, поэтому я настроил openresolv с интеграцией с NM.
В современных версиях Fedora конфигурационный файл /etc/resolv.conf — это символическая ссылка на виртуальный /run/systemd/resolve/stub-resolv.conf.
Если пользователь удалит данную ссылку и создаст вместо этого текстовый файл, как сказано в заметке, всё будет работать штатно.
Кстати, а вроде в NM можно просто указать dnsmasq и он будет его сам запускать со своими конфигами. Это хорошее решение?
Network Manager умеет автоматически запускать dnsmasq для использования в качестве DHCP-сервера при раздаче Wi-Fi или мостов, но конфиги он будет генерировать самостоятельно и без опций DNS.