Инструкция по установке и настройке DNSMASQ для локального DNS-сервера

DNSMASQ — это легкий DHCP- и DNS-сервер, который можно использовать для организации локального DNS-резолвинга в вашей сети. Он кэширует DNS-запросы, ускоряя доступ к часто используемым доменам, и позволяет добавлять локальные имена хостов.

1. Установка DNSMASQ

Ubuntu/Debian

sudo apt update
sudo apt install dnsmasq

CentOS/RHEL

sudo yum install dnsmasq

Arch Linux

sudo pacman -S dnsmasq

После установки сервис запустится автоматически, но его лучше остановить до настройки:

sudo systemctl stop dnsmasq

2. Базовая настройка DNSMASQ

Основной конфигурационный файл: /etc/dnsmasq.conf

Рекомендуемые настройки

Откройте файл для редактирования:

sudo nano /etc/dnsmasq.conf
  • Настройка DNS-кэширования

    # Слушать только локальный интерфейс (безопасность)
    listen-address=127.0.0.1,192.168.1.1  # замените на IP вашего сервера в LAN
    bind-interfaces
    
    # Внешние DNS-серверы для запросов (например, Cloudflare или Google)
    server=8.8.8.8
    server=1.1.1.1
    
    # Локальный домен для сети
    local=/lan/
    domain=lan
    
    # Кэширование DNS-запросов
    cache-size=1000  # количество кэшируемых записей
    
  • Добавление локальных имен хостов

    # Статичные записи (можно также использовать /etc/hosts)
    address=/router.lan/192.168.1.1
    address=/nas.lan/192.168.1.10
    
  • Опционально: настройка DHCP (если нужно раздавать IP)

    # Диапазон IP и время аренды
    dhcp-range=192.168.1.100,192.168.1.200,24h
    
    # Шлюз и DNS-сервер для клиентов
    dhcp-option=3,192.168.1.1  # шлюз
    dhcp-option=6,192.168.1.1  # DNS (этот же сервер)
    

3. Запуск и проверка DNSMASQ

Запуск сервиса
sudo systemctl start dnsmasq
sudo systemctl enable dnsmasq  # автозагрузка при старте системы
Проверка статуса
sudo systemctl status dnsmasq
Тестирование DNS
dig google.com @localhost  # или nslookup google.com 192.168.1.1
Если добавлены локальные имена, проверьте:
ping router.lan

4. Настройка клиентов

Настройте устройства в локальной сети использовать ваш DNS-сервер:

Вручную

Прописать в настройках сети DNS 192.168.1.1 (IP вашего сервера).

Через DHCP

Если включен DHCP в dnsmasq, клиенты получат DNS автоматически.

5. Дополнительные настройки

Логирование DNS-запросов

log-queries
log-facility=/var/log/dnsmasq.log

После этого перезапустите сервис:

sudo systemctl restart dnsmasq

Блокировка рекламы и доменов

Создайте файл со списком блокируемых доменов (например, /etc/dnsmasq.blocklist) и добавьте в конфиг:

addn-hosts=/etc/dnsmasq.blocklist

Пример блокировки:

0.0.0.0 adserver.com
0.0.0.0 tracker.com

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

Firewall: Разрешите входящие подключения на порт 53 (DNS).
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
Отключите рекурсивные запросы (если сервер только для локальной сети):
no-resolv
no-poll

Заключение

Теперь у вас работает локальный DNS-сервер с кэшированием и поддержкой локальных имен. Для более сложных сценариев (например, интеграции с Active Directory или Pi-hole) можно расширить конфигурацию.

Если есть проблемы, проверьте логи:

journalctl -u dnsmasq -f

Если порт 53 занят systemd-resolved, это может мешать работе dnsmasq. Решить проблему можно несколькими способами:

1. Отключите systemd-resolved (рекомендуется, если не нужен)

Остановка и отключение systemd-resolved
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
Удаление симлинка /etc/resolv.conf
sudo rm /etc/resolv.conf
Создание нового /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf  # или ваш локальный DNS
Перезапуск dnsmasq
sudo systemctl restart dnsmasq

2. Перенастроить systemd-resolved на другой порт (альтернатива)

Если systemd-resolved нужен (например, для работы NetworkManager), можно заставить его слушать на другом порту.

Изменение конфигурации systemd-resolved

Откройте файл:

sudo nano /etc/systemd/resolved.conf

Добавьте или раскомментируйте:

[Resolve]
DNSStubListener=no  # отключает прослушку 53 порта
Перезапуск systemd-resolved
sudo systemctl restart systemd-resolved
Проверка, освободился ли порт 53
sudo ss -tulnp | grep 53

Теперь dnsmasq сможет занять порт 53.

3. Запуск dnsmasq на другом порте (если нельзя освободить 53)

Если по каким-то причинам нельзя освободить порт 53, можно заставить dnsmasq слушать на другом порте (например, 5353).

Изменение конфига dnsmasq
sudo nano /etc/dnsmasq.conf

Добавьте:

port=5353  # слушать на 5353 вместо 53

Настройка systemd-resolved или клиентов на использование dnsmasq

Теперь клиенты должны явно указывать dnsmasq как DNS-сервер с портом:

# Пример для NetworkManager (если используется)
nmcli con mod "Имя-подключения" ipv4.dns "192.168.1.1:5353"

Или вручную в /etc/resolv.conf:

nameserver 192.168.1.1:5353
(Но такой подход менее удобен, лучше освободить порт 53.)

Проверка работы DNS

После настройки проверьте:

dig google.com @localhost -p 5353  # если dnsmasq на 5353
nslookup google.com 192.168.1.1

Вывод

Лучший вариант — отключить systemd-resolved (если он не нужен) или перенастроить его, чтобы освободить порт 53. Если это невозможно, можно запустить dnsmasq на другом порте, но это менее удобно.

Если остались проблемы, проверьте логи:

journalctl -u dnsmasq -f