Dnsmasq - это легкий и быстро конфигурируемый DNS, DHCP сервер.
Dnsmasq работает как кэширующий DNS-сервер с очень полезной и часто необходимой особенностью. Он может использовать файл /etc/hosts как источник записей DNS.
Рассмотрим два варианта настройки:
1. Просто DNS сервер. Без DHCP.
2. Связка DNS + DHCP.
3. Моменты которые не использованы.
Это базовые настройки. Я бы даже сказал поверхностные, но достаточные для работы. Не буду размусоливать, а сразу перейду к установке и настройке. Погнали.
1. Настройка только DNS-сервера. DHCP-сервер будет отключен.
Инсталляция:
$ apt-get install dnsmasq
Настройка производится путем правки конфиг-файла /etc/dnsmasq.conf или путем создания файла dnsmasq.conf в каталоге /etc/dnsmasq.d. Оба способа рабочие.
Файл с настройками должен выглядеть примерно так:
-------------------------------------------------------------------------
# интерфейс, на котором должны отвечать DNS-сервер и DHCP-сервер
interface=eth1
# блокировка DHCP сервера (остается только DNS)
no-dhcp-interface=eth1
# не пересылать простые текстовые запросы (без точки или без части домена)
domain-needed
# никогда не пересылать не маршрутизированные адреса
bogus-priv
# позволять запускать более одного процесса
bind-interfaces
# запрет считывать адреса DNS-серверов с файла resolv.conf
no-resolv
# отключение отслеживание изменения файла /etc/resolv.conf
# или другого файла выполняющего его функцию
no-poll
# адреса верхних DNS-серверов (прописаны google OpenDNS)
server=8.8.8.8
server=8.8.4.4
# пересылать запрос сразу на все вышестоящие DNS серверы
all-servers
# для защиты от DNS атак необходимо запретить ответы от вышестоящих
# DNS серверов с IP адресами компьютеров локальной сети:
stop-dns-rebind
# очистка DNS-кэша при перезапуске сервиса
clear-on-reload
# отключаем кеширование ошибочных DNS запросов,
no-negcache
# логирование
log-queries
log-facility=/var/log/dnsmasq-queries.log
-------------------------------------------------------------------------
!!! Не забудьте поменять eth1 на свой интерфейс.
После чего надо перезапустить сервис:
$ service dnsmasq restart
Добавляем dnsmasq в автозагрузку:
$ systemctl enable dnsmasq
2. Настройка DNS+DHCP сервера.
Делаем все по порядку как указано выше. Нужно только в файле конфигурации dnsmasq.conf вместо
# блокировка DHCP сервера (остается только DNS)
no-dhcp-interface=eth1
Написать
# выдача адреса на 24 часа из диапазона 192.168.0.10-192.168.0.100
dhcp-range=eth1,192.168.0.10,192.168.0.100,24h
В данном случае мы будем выдавать пользователям ip адреса в диапазоне от 192.168.0.10 до 100.
После чего надо перезапустить сервис:
$ service dnsmasq restart
Добавляем dnsmasq в автозагрузку:
$ systemctl enable dnsmasq
3. Моменты которые не использованы.
Самый важный момент это resolv.conf который система использует для списка DNS серверов которые обработают запросы.
Для того чтобы все запросы шли непосредственно к dnsmasq нужно в /etc/resolv.conf прописать следующее
nameserver 127.0.0.1
Но тут возникает затык. Т.к. при перезагрузке или при переключении интерфейса эта запись исчезнет. И как показала практика этот момент не связан с тем что адрес статический и указан ручками либо получается автоматически при подключении.
Чтобы этого избежать, нужно раскоментировать строчку в файле /etc/dhcp/dhclient.conf (или /etc/dhcp3/dhclient.conf)
prepend domain-name-servers 127.0.0.1;
Количество интерфейсов которые принимают запросы не ограничиваются одним. Можно добавить столько сколько нужно.
interface=eth0
interface=eth1
Если же нужно указать интерфейс который не будет принимать запросы. Т.е. указать его явно, то дописываем:
except-interface=eth3
Или вообще можно указать IP адрес
listen-address= 192.168.0.6
Указать доменное имя
domain=localdomain.ru
Или вообще указать отдельное доменное имя, для отдельной сети
domain=guest.localdomain.ru,192.168.1.0/24
Указание адресов доменных серверов для перенаправления запроса к определенным зонам
server=/nolocaldomain.ru/192.168.2.100
Аналогично для обратной зоны
server=/2.168.192.in-addr.arpa/192.168.2.1
В конфигурационном файле можно указать соответствие имени IP
Запись типа А
address=/tutdomain.ru/127.0.0.1
Если нужно чтобы SERVER отзывался на SRV то
cname=server,srv
Если мы не хотим использовать файл /etc/host для сопоставления имя/IP
no-hosts
Или например мы имеем несколько файлов содержащих имя/IP
addn-hosts=/path/to/file
Одна из удобных функций это подмена полученного IP адреса своим. Например подменим 1.2.3.4. адресом 5.6.7.8
alias=1.2.3.4,5.6.7.8
Подменить можно и целую подсеть. Подменим 1.2.3.0/24 на 5.6.7.0/24.
alias=1.2.3.0,5.6.7.0,255.255.255.0
Для указания статической привязки адресов DHCP указываем MAC-адрес хоста и IP-адрес который будем ему выдавать
dhcp-host=00:50:B6:5B:CA:6A,192.168.0.7
Или ip-адрес и имя хоста
dhcp-host=00:50:B6:5B:CA:6A,server,192.168.0.7,60m
Лимит на аренду ip-адреса в секундах (по-умолчанию 150)
dhcp-lease-max=3600
Чтобы иметь представление кто, когда и какой адрес получил указываем файл для хранения информации об аренде адресов
dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases
!!!!После редактирования конфигурационного файла обязательно перезагружаем сервис dnsmasq иначе результатов не будет до перезагрузки.
$ service dnsmasq restart
На этом все. На самом деле описал только малую толику всего того что можно наворотить. И в большинстве случаев рассмотренных первых двух вариантов достаточно для нормальной работы, а дальше уже больше тюнинг. Сейчас есть более продвинутые варианты, но этот поддерживает любая Linux система независимо от версии или года или железа.
Всё что понаписано выше проверено на Ubuntu Server 18/20 и работает по сей день.