Установка и примеры настройки Dnsmasq

Обновлено Обновлено: Опубликовано Опубликовано:

Используемые термины: Dnsmasq, DNS, Linux.

Данная инструкция будет состоять из двух основных частей — установка программного обеспечения и примеры по его настройки под различные задачи. Мы рассмотрим примеры работы на системах Linux Ubuntu и Rocky Linux (CentOS).

Установка, настройка системы и запуск

1. Установка выполняется немного, по-разному, в зависимости от выбранного дистрибутива Linux. Рассмотрим примеры систем на базе Deb и RPM.

а) Для Debian / Ubuntu (Deb):

apt install dnsmasq

б) Для Rocky Linux / CentOS (RPM):

yum install dnsmasq

Установка завершена. 

После установки или старта сервиса мы можем увидеть ошибку:

failed to create listening socket for port 53: Address already in use

Как правило, она связана с тем, что на компьютере работает сервис systemd-resolved, который занял порт 53. Чтобы это исправить, отключаем его:

systemctl disable systemd-resolved --now

2. После установки разрешим автозапуск сервиса.

Вводим команду:

systemctl enable dnsmasq

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

systemctl start dnsmasq

3. Настраиваем брандмауэр. Нам необходимо открыть UDP порт 53.

Как правило, используется 2 системы управления netfilter — iptables и firewalld. Рассмотрим обе.

а) При использовании iptables (как правило, для систем на базе Deb):

iptables -I INPUT -p udp --dport 53 -j ACCEPT

И сохраняем правило.

б) При использовании firewalld (как правило, для систем на базе RPM):

firewall-cmd --permanent --add-port=53/udp

firewall-cmd --reload

4. Проверяем работоспособность сервиса:

systemctl status dnsmasq

Также мы можем убедиться, что запросы на порту 53 прослушиваются сервером:

ss -tunlp | grep :53

Примеры настройки dnsmasq

Переходим к основной части инструкции. Приведем примеры использования и соответствующей настройки dnsmasq.

1. Перевод запросов на другой DNS-сервер для определенного домена

Предположим, у нас есть задача — переводить все запросы для имен с доменом consul на другой DNS-сервер, который находится в нашей сети. Также, данный сервер слушает не на стандартном для NS-сервера порту (53), а на порту 8600. Кстати, это реальный пример работы при настройке кластера consul.

Создаем конфигурационный файл:

vi /etc/dnsmasq.d/consul

В него добавим одну строку:

server=/consul/127.0.0.1#8600

* в данном примере мы будем переводить все запросы для домена consul на сервер 127.0.0.1 (в этом примере локальный сервер, но может быть любой) и порт 8600.

Если мы работаем в системе с включенным SELinux и переводим запросы на нестандартный порт, то необходимо добавить правило:

semanage port -a -t dns_port_t -p tcp 8600

* где 8600 — порт, на который переводим запросы DNS.

Чтобы настройки вступили в силу, перезапускаем dnsmasq:

systemctl restart dnsmasq

2. Настройка кэширования

По умолчанию, dnsmasq работает как кэширующий сервер. Мы же подредактируем настройки.

Создаем конфигурационный файл:

vi /etc/dnsmasq.d/cache

cache-size=10000
all-servers
no-negcache

* где:

  • cache-size — размер кэша (количество хостов).
  • all-servers — задает поведение, при котором наш сервер будет отправлять запрос всем доступным ему серверам DNS и принимать ответ от того, кто первый ему ответит.
  • no-negcache — не кэшировать негативные ответы.

Чтобы настройки вступили в силу, перезапускаем dnsmasq:

systemctl restart dnsmasq

3. Подмена IP-адресов

Есть несколько вариантов подмены IP-адресов в dnsmasq. Для настройки создадим файл:

vi /etc/dnsmasq.d/replacement

В зависимости от ситуации, применяем один из вариантов, описанных ниже.

а) Подмена одного адреса:

alias=1.1.1.1,2.2.2.2

* в данном примере если наш сервер получит ответ 1.1.1.1, он его заменит на 2.2.2.2.

б) Подмена адресов в подсети:

alias=1.1.1.0,2.2.2.0,255.255.255.0

* в данном примере все адреса из подсети 1.1.1.0/24 будут заменены на соответствующие адреса подсети 2.2.2.2/24.

в) Диапазоны:

alias=1.1.1.100-1.1.1.200,192.168.0.0,255.255.255.0

* в данном примере адреса в диапазоне от 1.1.1.100 до 1.1.1.200 будут переопределены в адреса в диапазоне от 192.168.0.100 до 192.168.0.200.

После внесения необходимых строк, нужно перезагрузить сервис.

Выполняем команду:

systemctl restart dnsmasq

4. Произвольный адрес

Мы можем быстро добавить любой адрес и привязать его к доменному имени. Делается это с помощью директивы address:

vi /etc/dnsmasq.d/addresses

address=/dmosk.local/127.0.0.1
address=/dmosk.local/192.168.0.15
address=/mail.dmosk.local/192.168.0.16

* в нашем примере dnsmasq будет знать о двух записях — dmosk.local и mail.dmosk.local. Первая будет разрешаться в два адреса.

Выполняем команду:

systemctl restart dnsmasq

5. Форвард запросов на другой сервер

С помощью опции server мы можем указать серверы, на которые нужно передавать запрос DNS.

vi /etc/dnsmasq.d/forwards

server=8.8.8.8
server=8.8.4.4

* в данном примере мы передадим запросы на серверы Google.

Применяем настройку:

systemctl restart dnsmasq

6. Файл hosts

В зависимости от ситуации, нам может потребоваться разрешать некоторые имена с помощью файла /etc/hosts. Или наоборот — настройки из данного файла могут нам мешать.

В dnsmasq предусмотрена директива hosts, с помощью которой мы можем манипулировать результатами с использованием файла hosts.

vi /etc/dnsmasq.d/hosts

а) Если мы хотим, чтобы данные из файла учитывались:

hosts

б) Если нам не нужны данные из файла:

no-hosts

Применяем настройку:

systemctl restart dnsmasq

7. Прослушивание на интерфейсах

По умолчанию, dnsmasq начинает слушать на одном из интерфейсов (как правило, который система видет первым по списку) и игнорирует запросы, которые приходят на другие.

Чтобы настроить прослушивание на все или определенном интерфейсе создаем файл:

vi /etc/dnsmasq.d/interfaces

И добавим:

interface=*

* так мы разрешим работать на всех интерфейсах.

Или можно разрешить определенный:

interface=eth1

Или можно указать конкретный адрес, на котором нужно слушать запросы:

listen-address=192.168.1.10

Применяем настройку:

systemctl restart dnsmasq

Диагностика и решение проблем

Рассмотрим, как можно проверять работу настроенного dnsmasq.

DNS запросы от клиента

На любом из компьютеров в сети делаем запрос при помощи nslookup:

nslookup dmosk.ru 192.168.0.15

* где 192.168.0.15 — адрес в сети нашего сервера, куда мы установили dnsmasq.

Мы должны получить ответ на подобие:

Server:        192.168.0.15
Address:    192.168.0.15#53

Non-authoritative answer:
Name:    dmosk.ru
Address: 92.53.96.18

Наш dnsmasq установлен и готов к дальнейшей настройке.

Логирование

По умолчанию, dnsmasq пишет не очень много логов. Чтобы это исправить, необходимо отредактировать конфигурацию. Для этого создаем файл:

vi /etc/dnsmasq.d/logs

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

* где опция log-queries разрешает логи запросов; log-facility позволяет задать путь до файла с логами.

Создаем каталог для хранения лога:

mkdir /var/log/dnsmasq

Перезапускаем dnsmasq, чтобы применить изменения:

systemctl restart dnsmasq

Прочитать лог можно командой (непрерывное чтение):

tail -f /var/log/dnsmasq/dnsmasq.log

Смотрите также

Возможно, также будет интересны инструкции:

1. Как установить и настроить DNS-сервер BIND на Linux CentOS.

2. Установка и настройка bind на Ubuntu.

# Linux # Серверы # Сети
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет