dnsmasq auf virbr0 (libvirt) und Netzwerkmanager

dnsmasq auf virbr0 (libvirt) und Netzwerkmanager

Ich möchte dnsmasq auf meinem lokalen Computer ausführen, um zu Testzwecken ein Platzhalterzeichen für die Auflösung in 127.0.0.1 zu konfigurieren.

Als ich jedoch versuchte, dnsmasq mit systemd zu starten, erhielt ich die folgende Fehlermeldung:

[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.

Ich war verwirrt, wie Port 53 belegt werden kann, wenn kein aktueller DNS-Server läuft (und hatte dies mit bestätigt dig @127.0.0.1). Deshalb habe ich ausgeführt netstat -lnund einen Prozess gefunden, der auf Port 53 an der Adresse lauscht 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:* 

Eine ifconfig-Anweisung zeigt, dass es 192.168.122.1sich um die virtuelle Schnittstelle virbr0 handelt.

Nach einer kurzen Google-Suche und einem Wiki verstehe ich, dass libvirt dem Host virtuelle Netzwerke zur Verfügung stellt, um physische Schnittstellen zu abstrahieren. Libvirt verwendet einen virtuellen Netzwerk-Switch, über den der gesamte Datenverkehr geleitet wird.[1]. Der standardmäßige virtuelle Netzwerk-Switch virbr0 wird beim ersten Start des Daemons erstellt.

Ich kann dann bestätigen, dass ich über diese Schnittstelle Anfragen per DIG an dnsmasq senden kann:

[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.

Frage 1: Ich verstehe nicht, warum dnsmasq diese virtuelle Schnittstelle abhört. In /etc/resolv.conf kann ich sehen, dass die auf dem DHCP-Server konfigurierten DNS-Server dem Computer mitteilen, Anfragen an Google DNS-Server weiterzuleiten. Wozu dient das?

# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 8.8.4.4

/etc/NetworkManager/NetworkManager.confIch finde, dass ich die Zeile bearbeiten und hinzufügen dns=dnsmasqund dann den Netzwerkmanager mit systemd neu starten kann. Von hier aus ist der Netzwerkmanager so konfiguriert, dass er Anfragen an dnsmasq an die Loopback-Adresse weiterleitet und mit einem einfachen Aufruf von dig angezeigt werden kann:

[grobinson@dhcppc4 ~]$ dig @127.0.0.1 +short
l.root-servers.net.
g.root-servers.net.
i.root-servers.net.
...

Die netstat -lnAusgabe zeigt nun zwei Sockets, die an Port 53 gebunden sind und auf diesem lauschen:

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 

Frage 2: Wie kommt es, dass der Netzwerkmanager dnsmasq auf 127.0.0.1 starten kann und ich das mit systemctl nicht kann? Liegt das daran, dass die Standardkonfiguration versucht, auf allen Schnittstellen zu lauschen, was bei virbr0 fehlschlägt? Ich muss nur die gewünschte Schnittstelle angeben?

Frage 3: Es sieht so aus, als gäbe es zwei Konfigurationsoptionen für dnsmasq: /etc/dnsmasq.confund einen Ordner /etc/NetworkManager/dnsmasq.d/, in den Konfigurationsdateien geschrieben werden können. Es sieht so aus, als wäre Letzteres für den Fall dns=dnsmasqgedacht, dass dnsmasq auf 127.0.0.1 lauscht, da die Bearbeitung /etc/dnsmasq.confkeine Auswirkungen auf Abfragen an @127.0.0.1 hat. Könnte Ersteres für dnsmasq in libvirt sein?

Antwort1

Standardmäßig startet libvirt eine dnsmasq-Instanz für jede seiner virtuellen Schnittstellenbrücken. Dies geschieht, um den in einem virtuellen Netzwerk laufenden VMs DHCP-Dienste bereitzustellen.

http://wiki.libvirt.org/page/VirtualNetworking

Im Wesentlichen wird die Virbr-Brücke von libvirt jedes Mal erstellt, wenn Sie eine VM mit den Standardeinstellungen starten. Wenn Sie dies verhindern möchten, müssen Sie die Brücke vor dem Starten einer VM selbst erstellen und sie dann im „Bridge“-Modus starten, wobei Sie Ihre benutzerdefinierte Brücke als Argument angeben. Hier ist eine Manpage, die es ziemlich gut erklärt. Schauen Sie unter der Option --network nach:

https://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatvirtinstalloptions.htm

Jedes Mal, wenn Sie in libvirt ein „virtuelles Netzwerk“ erstellen, wird auch eine Instanz von dnsmasq dafür gestartet. Sie müssen also erneut aufhören, die virtuellen Netzwerke von libvrt zu verwenden, und manuell vorgehen.

Antwort2

Wenn Sie möchten, dass Ihre lokalen /etc/hosts-Änderungen über dieselbe Schnittstelle an Ihre VMs weitergegeben werden, können Sie den lokalen Libvirt-Prozess einfach mit einem SIGHUP ausführen.

Antwort3

Konfigurieren Sie Ihre DNSMASQ-Instanz auf eine explizite Liste der Schnittstellen, auf denen sie abhören soll.

/etc/dnsmasq.confSie können entweder Schnittstellennamen interface=eth0oder Schnittstellen-IPs verwenden. Selbst listen-address=192.168.0.1mit diesem Set wird dnsmasq hilfreicherweise an alle Schnittstellen gebunden, deaktivieren Sie dies also, indem Sie es bind-interfaceszur Konfigurationsdatei hinzufügen.

Alternativ können Sie in der Konfigurationsdatei die Schnittstellen-Blacklist mit angeben except-interface=virtbr*.

Quellen:

verwandte Informationen