Dnsmasq — это программа, поддерживающая работу сразу двух сетевых сервисов, DNS и DHCP. Dnsmasq как сервис имеет ряд преимуществ по сравнению с другими сервисами DNS и DHCP. Во-первых, настройка dnsmasq проста, во-вторых, он нетребователен к ресурсам, в-третьих, он реализует сразу два сервиса, в-четвертых, он гибок и позволяет, например, реализовать обращение по именам к компьютерам в локальной сети, причем сделать это просто и быстро. Именно поэтому он используется как на серверах, так и в embeded-системах, например, в роутерах, и отлично подходит для обеспечения работы небольших сетей.
Установка
Обычно dnsmasq устанавливается на машину, выполняющую роль сетевого шлюза, в небольших сетях обычно именно на нем работают сервисы DHCP и DNS. Поскольку dnsmasq присутствует в репозиториях многих дистрибутивов, его можно установить при помощи менеджера пакетов:
apt-get install dnsmasq
или
yum install dnsmasq
После этого можно приступать к настройке.
Настройка dnsmasq как DHCP
DHCP — это один из базовых сервисов в локальных сетях, благодаря которому отпадает необходимость конфигурировать настройки сети вручную. Он позволяет выдавать автоматически такие настройки как IP-адрес, адрес DNS-сервера и шлюза по-умолчанию, а также резервировать IP-адреса по MAC-адресам.
Для того, чтобы dnsmasq работал как DHCP-сервер, в конфигурационном файле /etc/dnsmasq.conf должны присутствовать следующие строки (они могут уже присутствовать в конфиге, их надо только раскомментировать и исправить):
domain=mydomain.com
Эта строка не обязательна, она нужна в том случае, если вы хотите, чтобы хосты, получающие адреса по DHCP, имели FQDN-имя, то есть полное имя, включающее имя домена.
interface=eth1
Сетевой интерфейс, на котором будет работать сервис. Обычно основной интерфейс eth0 подключен к провайдеру, поэтому его крайне нежелательно указывать в качестве интерфейса для работы сервиса.
dhcp-range=192.168.0.20,192.168.0.100,24h
Интервал выдаваемых адресов и время аренды адресов (в данном случае 24 часа).
dhcp-host=80:15:AA:BB:CC:DD,192.168.0.10
Резервация IP-адреса по MAC-адресу, чтобы устройство с указанным MAC-адресом всегда получало указанный IP-адрес.
dhcp-option=1,255.255.255.0
Задать значение опции DHCP с номером 1. Опция с номером 1 — это маска подсети (netmask).
dhcp-option=3,192.168.0.1
Задать значение опции DHCP с номером 3. Опция с номером 3 — это шлюз по умолчанию (default gateway).
Этих опций в небольшой офисной или домашней сети обычно достаточно.
Список всех опций DHCP можно посмотреть на странице IANA (Internet Assigned Numbers Authority).
После задания настроек надо рестартовать сервис:
service dnsmasq restart
Теперь можно задавать настройки на компьютерах в сети на автоматическое получение адресов по DHCP.
Настройка dnsmasq как DNS
DNS — это второй базовый сервис, без которого в локальных сетях не обойтись, если, конечно, вы не планируете обращаться к компьютерам в локальной сети и Интернете по IP-адресам, в чем я сильно сомневаюсь. Dnsmasq работает как кэширующий DNS-сервер. У него есть одна полезная особенность. Он умеет использовать файл /etc/hosts как источник информации для DNS, что может быть очень полезно. Например, если есть какой-то локальный сервис, с которым работают пользователи в локальной сети, они могут к нему обращаться по имени, а не по адресу, адрес будет запрашиваться у DNS-сервера, который будет возвращать IP-адрес, к которому необходимо обращаться.
Настройка dnsmasq как DNS по сути не отличается от настройки как DHCP, поскольку все настройки хранятся в том же файле — /etc/dnsmasq.conf
Самое первое, что необходимо, — это название домена
domain=mydomain.com
Для определенной подсети можно указать отдельное имя домена:
domain=fin.mydomain.com,192.168.1.0/24
И точно так же можно указать имя домена для интервала адресов:
domain=fin.mydomain.com,192.168.1.10,192.168.1.30
Основная функция DNS-сервера — это преобразование доменных имен в IP-адреса и наоборот, но DNS-серверов даже в локальной сети может быть несколько. Поэтому может потребоваться указать для определенных доменов адреса DNS-серверов, на которые должны отравляться запросы:
server=/remoteoffice.org/192.168.3.10
Аналогично указывается сервер для обратной зоны:
server=/3.168.192.in-addr.arpa/192.168.3.1
В конфигурационном файле также можно указать соответствие имени IP-адресу.
Запись типа A в прямой зоне DNS (сопоставляющей IP-адрес запрошенному имени):
address=/extdomain.net/127.0.0.1
На любое имя хоста *.extdomain.net возвращается адрес 127.0.0.1.
Запись типа CNAME:
cname=sambaserver,smb
Эта запись создает алиас для локального имени sambaserver, чтобы к нему можно было обращаться по более короткому имени smb.
По умолчанию dnsmasq использует файл /etc/hosts для сопоставления имен хостов IP-адресам, но это тоже можно изменить. Если вы не хотите использовать /etc/hosts, вы можете указать это при помощи опции
no-hosts
Если же вы хотите использовать совместно с /etc/hosts еще один файл аналогичной структуры, для этого есть опция
addn-hosts=/path/to/file
Кроме задания собственных записей DNS можно изменять информацию, получаемую от внешних DNS-серверов путем подмены полученного IP-адреса. Для замены одного адреса:
alias=1.2.3.4,5.6.7.8
Если при запросе доменного имени от внешнего DNS-сервера мы получим IP-адрес 1.2.3.4, то мы подменим его на адрес 5.6.7.8. Можно осуществлять подмену целыми подсетями:
alias=1.2.3.0,5.6.7.0,255.255.255.0
Такая запись подменит любой адрес из подсети 1.2.3.0/24 на адрес из подсети 5.6.7.0/24. Если же вам необходимо подменять определенный интервал адресов, то такая возможность тоже есть:
alias=10.0.0.10-10.0.0.40,192.168.0.0,255.255.255.0
Эта запись подменит адреса из интервала 10.0.0.10-10.0.0.40 на адреса 192.168.0.10-192.168.0.40
Для того, чтобы обращения к DNS шли именно на dnsmasq на том же сервере, где он сам работает, необходимо указать первой записью в /etc/resolv.conf следующую строку:
nameserver 127.0.0.1
Сам dnsmasq будет игнорировать эту запись, поскольку предполагает, что эта запись обозначает его собственный сервис, он начинает использование записей с указанием серверов имен со следующей записи, в которой указывается уже внешний DNS-сервер.
Во многих системах /etc/resolv.conf генерируется автоматически при получении адреса от провайдера по DHCP, поэтому если просто записать эту строчку руками, при переподключении основного сетевого интерфейса файл будет перезаписан и эта строка исчезнет. Этого можно избежать, если раскомментировать в файле /etc/dhcp/dhclient.conf (или /etc/dhcp3/dhclient.conf, в зависимости от системы) строчку
prepend domain-name-servers 127.0.0.1;
Тогда даже при получении списка DNS-серверов по DHCP первой строчкой в /etc/resolv.conf будет строчка «nameserver 127.0.0.1».
И еще одна опция, которая может вам пригодиться, если вы хотите использовать свой список DNS-серверов:
resolv-file=/path/to/file
Файл, который указывается в этой опции, должен иметь такую же структуру, как и /etc/resolv.conf. При наличии этой опции будет использован указанный файл вместо /etc/resolv.conf. И таких записей может быть больше одной.
А если необходимо просто указать несколько DNS-серверов, на которые будут форвардиться запросы, это можно сделать при помощи записи нескольких строчек с опцией server:
server=8.8.8.8 server=8.8.4.4 ... server=208.67.222.222 server=208.67.220.220
Вот, в общем, и всё. И не забывайте после изменения настроек рестартовать dnsmasq командой
service dnsmasq reload
Здравствуйте! А вы не подскажите в чём отличие «domain=» и «local=» конфига dnsmasq?
Здравствуйте. Я процитирую:
Видел, но хотелось бы прочитать русскоязычную версию, а не через переводчик…
dhcp-option=2,255.255.255.0
Задать значение опции DHCP с номером 2. Опция с номером 3 — это маска подсети (netmask).
Судя по списку ссылку на который вы указали.
Маска подсети это опция 1.
Спасибо! Поправил. Правильно я, видимо, сделал, что перестал по ночам писать. :)
Прелесть DNSMASQ как заменителя DNS еще в том, что можно подменить какие нибуть надоедливые Яндекс Дзены и прочие рекламные ресурсы, которые лезут изо всех щелей одним очень полезным IP а именно 0.0.0.0 правда их надо подменять очень много, но есть эти списки…..
Для этого лучше использовать dnscrypt (там можно использовать блеклисты, в которых допускается использование регулярных выражений и есть скрипт для загрузки блеклистов с разных серверов, который подготавливает блеклист для dnscrypt в нужном формате), сделав его вышестоящим dns-сервером, указав в конфиге dnsmasq строку типа «server=127.0.0.1#4053» и «no-resolv», где 4053 порт прослушиваемый dnscrypt. Тем более указывать что-то типа «server=8.8.8.8» и т.п. как тут не секьюрно, т.к. гугл (как тут) смотрит ваши запросы, а провайдер может (ещё до гугла) их так же перехватить, например для блокировки вашего запроса.
Я так думаю, в 2014 году, когда была опубликована статья, ситуация все-таки немного отличалась. Но в целом да, согласен.