Настройка dnsmasq: DHCP и DNS

Настройка dnsmasq: DHCP и DNSDnsmasq — это программа, поддерживающая работу сразу двух сетевых сервисов, 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

 

Настройка dnsmasq: DHCP и DNS: 8 комментариев

  1. Влад

    Здравствуйте! А вы не подскажите в чём отличие «domain=» и «local=» конфига dnsmasq?

    1. Maxim Norin Автор записи

      Здравствуйте. Я процитирую:

      # Add local-only domains here, queries in these domains are answered
      # from /etc/hosts or DHCP only.
      #local=/localnet/
      
      # Set the domain for dnsmasq. this is optional, but if it is set, it
      # does the following things.
      # 1) Allows DHCP hosts to have fully qualified domain names, as long
      #     as the domain part matches this setting.
      # 2) Sets the "domain" DHCP option thereby potentially setting the
      #    domain of all systems configured by DHCP
      # 3) Provides the domain part for "expand-hosts"
      #domain=thekelleys.org.uk
      
      1. Влад

        Видел, но хотелось бы прочитать русскоязычную версию, а не через переводчик…

  2. Артем

    dhcp-option=2,255.255.255.0
    Задать значение опции DHCP с номером 2. Опция с номером 3 — это маска подсети (netmask).

    Судя по списку ссылку на который вы указали.
    Маска подсети это опция 1.

    1. Maxim Norin Автор записи

      Спасибо! Поправил. Правильно я, видимо, сделал, что перестал по ночам писать. :)

  3. Александр

    Прелесть DNSMASQ как заменителя DNS еще в том, что можно подменить какие нибуть надоедливые Яндекс Дзены и прочие рекламные ресурсы, которые лезут изо всех щелей одним очень полезным IP а именно 0.0.0.0 правда их надо подменять очень много, но есть эти списки…..

    1. Влад

      Для этого лучше использовать dnscrypt (там можно использовать блеклисты, в которых допускается использование регулярных выражений и есть скрипт для загрузки блеклистов с разных серверов, который подготавливает блеклист для dnscrypt в нужном формате), сделав его вышестоящим dns-сервером, указав в конфиге dnsmasq строку типа «server=127.0.0.1#4053» и «no-resolv», где 4053 порт прослушиваемый dnscrypt. Тем более указывать что-то типа «server=8.8.8.8» и т.п. как тут не секьюрно, т.к. гугл (как тут) смотрит ваши запросы, а провайдер может (ещё до гугла) их так же перехватить, например для блокировки вашего запроса.

      1. Maxim Norin Автор записи

        Я так думаю, в 2014 году, когда была опубликована статья, ситуация все-таки немного отличалась. Но в целом да, согласен.

Обсуждение закрыто.