Я хочу запустить 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 и вики позже, я понимаю, что 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
output теперь показывает два связанных сокета и прослушивание порта 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?
По умолчанию libvirt запускает экземпляр dnsmasq для каждого из своих мостов виртуального интерфейса. Это делается для предоставления службы DHCP виртуальным машинам, работающим в виртуальной сети.
http://wiki.libvirt.org/page/VirtualNetworking
По сути, мост virbr создается libvirt каждый раз, когда вы запускаете виртуальную машину с настройками по умолчанию. Если вы хотите предотвратить это, вам необходимо создать мост самостоятельно перед запуском виртуальной машины, а затем запустить ее в режиме «моста», указав свой настраиваемый мост в качестве аргумента. Вот страница руководства, которая довольно хорошо это объясняет. Посмотрите под опцией --network:
https://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatvirtinstalloptions.htm
Каждый раз, когда вы создаете «виртуальную сеть» в libvirt, она также запускает для нее экземпляр dnsmasq. Итак, опять же, вы должны прекратить использовать виртуальные сети libvrt и перейти на ручной режим.
Настройте свой экземпляр dnsmasq на явный список интерфейсов, которые вы хотите, чтобы он прослушивал.
В /etc/dnsmasq.conf
вы можете использовать любое имя интерфейса interface=eth0
или интерфейс IP listen-address=192.168.0.1
. Даже с этим набором dnsmasq будет помогать связываться со всеми интерфейсами, поэтому отключите это, добавив bind-interfaces
в файл конфигурации.
Либо в файле конфигурации укажите черный список интерфейсов с помощью except-interface=virtbr*
.
Источники: