Назад | Перейти на главную страницу

dnsmasq на virbr0 (libvirt) и диспетчере сети

Я хочу запустить 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*.

Источники: