Я хочу запустить dnsmasq на своей локальной машине, чтобы настроить подстановочный знак для разрешения адреса в 127.0.0.1 в целях тестирования.
Однако при запуске dnsmasq с помощью systemd я получил следующее сообщение об ошибке:
[root@dhcppc4 ~]# systemctl status dnsmasq -l
● dnsmasq.service - DNS caching server.
Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Fri 2015-10-09 21:49:58 BST; 14s ago
Process: 2652 ExecStart=/usr/sbin/dnsmasq -k (code=exited, status=2)
Main PID: 2652 (code=exited, status=2)
Oct 09 21:49:58 dhcppc4 systemd[1]: Started DNS caching server..
Oct 09 21:49:58 dhcppc4 systemd[1]: Starting DNS caching server....
Oct 09 21:49:58 dhcppc4 dnsmasq[2652]: dnsmasq: failed to create listening socket for port 53: Address already in use
Oct 09 21:49:58 dhcppc4 systemd[1]: dnsmasq.service: main process exited, code=exited, status=2/INVALIDARGUMENT
Oct 09 21:49:58 dhcppc4 systemd[1]: Unit dnsmasq.service entered failed state.
Oct 09 21:49:58 dhcppc4 systemd[1]: dnsmasq.service failed.
Не понимая, как порт 53 может быть занят, если в данный момент не запущен DNS-сервер (и это подтверждено с помощью dig @127.0.0.1
), я запустил netstat -ln
и обнаружил процесс, прослушивающий порт 53 по адресу 192.168.122.1
:
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
udp 0 0 192.168.122.1:53 0.0.0.0:*
ifconfig показывает, что 192.168.122.1
это виртуальный интерфейс virbr0.
Быстрый поиск в Google и wiki позже, я понял, что libvirt предоставляет виртуальную сеть хосту для абстрагирования физических интерфейсов. Libvirt использует виртуальный сетевой коммутатор, через который маршрутизируется весь трафик[1]Виртуальный сетевой коммутатор по умолчанию, virbr0, создается при первом запуске демона.
Затем я могу подтвердить, что могу отправлять запросы через DIG в dnsmasq на этом интерфейсе:
[grobinson@dhcppc4 ~]$ dig @192.168.122.1 +short
a.root-servers.net.
j.root-servers.net.
m.root-servers.net.
b.root-servers.net.
i.root-servers.net.
k.root-servers.net.
l.root-servers.net.
d.root-servers.net.
g.root-servers.net.
c.root-servers.net.
h.root-servers.net.
e.root-servers.net.
f.root-servers.net.
Вопрос 1: Я не понимаю, зачем dnsmasq прослушивает этот виртуальный интерфейс? Для /etc/resolv.conf я вижу, что DNS-серверы, настроенные на DHCP-сервере, сообщают машине направлять запросы на DNS-серверы Google. В чем его польза?
# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.4.4
Я обнаружил, что могу отредактировать /etc/NetworkManager/NetworkManager.conf
и добавить строку dns=dnsmasq
, а затем перезапустить сетевой менеджер с помощью systemd. С этого момента сетевой менеджер настроен на направление запросов в dnsmasq по адресу обратной связи и может быть просмотрен с помощью простого вызова dig:
[grobinson@dhcppc4 ~]$ dig @127.0.0.1 +short
l.root-servers.net.
g.root-servers.net.
i.root-servers.net.
...
Теперь вывод netstat -ln
показывает два сокета, привязанных и прослушивающих порт 53:
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN
вопрос 2: как так получается, что сетевой менеджер может запустить dnsmasq на 127.0.0.1, а я не могу с systemctl? Это потому, что конфигурация по умолчанию пытается прослушивать все интерфейсы, что не удается для virbr0? Мне просто нужно указать желаемый интерфейс?
Вопрос 3: Похоже, что есть два варианта конфигурации для dnsmasq: /etc/dnsmasq.conf
и папка /etc/NetworkManager/dnsmasq.d/
, в которую можно записывать файлы конфигурации. Похоже, что последний вариант предназначен для случая, когда dns=dnsmasq
установлено и dnsmasq слушает 127.0.0.1, поскольку редактирование /etc/dnsmasq.conf
не влияет на запросы к @127.0.0.1. Может ли первый вариант быть для dnsmasq в libvirt?
решение1
По умолчанию libvirt запускает экземпляр dnsmasq для каждого из своих виртуальных интерфейсных мостов. Это делается для предоставления DHCP-сервиса для виртуальных машин, работающих в виртуальной сети.
http://wiki.libvirt.org/page/Виртуальная сеть
По сути, мост virbr создается libvirt каждый раз, когда вы запускаете VM с настройками по умолчанию. Если вы хотите предотвратить это, вам нужно создать мост самостоятельно перед запуском VM, а затем запустить ее в режиме «моста», указав свой собственный мост в качестве аргумента. Вот страница руководства, которая довольно хорошо это объясняет. Посмотрите под опцией --network:
https://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatvirtinstalloptions.htm
Каждый раз, когда вы создаете "виртуальную сеть" в libvirt, он также запускает для нее экземпляр dnsmasq. Так что, опять же, вам придется прекратить использовать виртуальные сети libvrt и перейти на ручное управление.
решение2
Если вы хотите, чтобы изменения в локальном файле /etc/hosts были распространены на ваши виртуальные машины, использующие тот же интерфейс, вы можете просто выполнить SIGHUP для локального процесса libvirt.
решение3
Настройте экземпляр dnsmasq, указав явный список интерфейсов, которые он хочет прослушивать.
В /etc/dnsmasq.conf
вы можете использовать либо имена интерфейсов, interface=eth0
либо IP-адрес интерфейса listen-address=192.168.0.1
. Даже с этим набором dnsmasq будет услужливо привязываться ко всем интерфейсам, поэтому отключите это, добавив bind-interfaces
в файл конфигурации.
Либо в файле конфигурации укажите черный список интерфейсов с помощью except-interface=virtbr*
.
Источники: