Der richtige Weg, um zu verhindern, dass dnsmasq die von DHCP bereitgestellte DNS-Serverliste überschreibt?

8

Ich habe zwei Schnittstellen:

  • wlan0 - Wi-Fi-Client über DHCP konfiguriert;
  • wlan1- statische IP-Adresse, die hostapdals Zugriffspunkt ausgeführt wird dnsmasqund IP-Adressen und Service-DNS-Anforderungen auf dieser Schnittstelle ausgibt.

Leider scheint es, dass beim dnsmasqAusführen etwas das überschreibt resolv.confund das lokale dnsmasqfür die lokalen Abfragen übernimmt. Hier ist das resolv.confAfter dnsmasqgelaufen ...

pi@raspberrypi:~$ cat /etc/resolv.conf
# Generated by resolvconf
domain home
nameserver 127.0.0.1

dnsmasqist nur an gebunden wlan1und wurde in keinem Fall so konfiguriert, dass er als lokaler Namensauflöser fungiert.

Wenn ich dnsmasqdie DHCP-Lease töte und dann aktualisiere, verfügt die resolv.confDatei über die richtigen DNS-Server, die über DHCP konfiguriert wurden.

Ich denke, dies könnte das Ergebnis einer Interaktion mit sein resolv.conf, aber ich bin mir nicht sicher.

Ich kann nicht herausfinden, wer die DNS-Serverkonfiguration des lokalen Computers überschreibt, um auf den lokalen Server zu verweisen dnsmasq, oder wie dies korrekt verhindert werden kann.

Beachten Sie, dass ich dnsmasqnur DNS-Anfragen beantworten wlan1möchte, weil ich diese Schnittstelle so einrichten möchte, dass ein Captive-Portal zum Konfigurieren der SSID auf der wlan0Schnittstelle über eine Webseite erstellt wird und die auf dem Computer ausgeführte Software die wlan0Verbindung verwendet ins Internet gehen.

Bigjosh
quelle

Antworten:

7

Es scheint, dass das /etc/init.d/dnsmasqSkript den lokalen Computer automatisch als Resolver hinzufügt, es sei denn, der loAdapter ist explizit deaktiviert ...

start_resolvconf()
{
# If interface "lo" is explicitly disabled in /etc/default/dnsmasq
# Then dnsmasq won't be providing local DNS, so don't add it to
# the resolvconf server set.

        for interface in $DNSMASQ_EXCEPT
        do
                [ $interface = lo ] && return
        done

        if [ -x /sbin/resolvconf ] ; then
                echo "nameserver 127.0.0.1" | /sbin/resolvconf -a lo.$NAME
        fi

        for interface in $DNSMASQ_EXCEPT
        do
                [ $interface = lo ] && return
        done

        if [ -x /sbin/resolvconf ] ; then
                echo "nameserver 127.0.0.1" | /sbin/resolvconf -a lo.$NAME
        fi
        return 0
}

Dies scheint mit den Informationen in der dnsmasq-Dokumentation in Konflikt zu stehen ...

Auf dem Nameserver-Computer wird dnsmasq verwendet.

In der oben beschriebenen einfachen Konfiguration verwenden Prozesse auf dem Computer dnsmasq nicht, da sie ihre Informationen darüber, welche Nameserver verwendet werden sollen, von /etc/resolv.conf erhalten, das auf die Upstream-Nameserver festgelegt ist. Um dies zu beheben, ersetzen Sie einfach den Nameserver in /etc/resolv.conf durch die lokale Adresse 127.0.0.1 und geben Sie die Adresse (n) des Upstream-Nameservers (der Upstream-Nameserver) direkt an dnsmasq weiter. Sie können dies entweder mit der Serveroption oder indem Sie sie in eine andere Datei einfügen und dnsmasq mit der Option resolv-file über ihren Speicherort informieren.

Um zu verhindern, dass dnsmasq lokale DNS-Anforderungen blockiert, müssen wir die Zeile explizit hinzufügen ...

DNSMASQ_EXCEPT=lo

... in die Datei /etc/default/dnsmasq. Beachten Sie, dass wir dies nur tun, um zu verhindern, dass das Init-Skript resolvconf aufruft. Beachten Sie auch, dass das Hinzufügen einer except-interface=loZeile zur /etc/dnsmasq/confDatei nicht den gewünschten Effekt hat, da das Init-Skript den Inhalt dieser Datei nicht überprüft.

Bigjosh
quelle
/etc/default/dnsmasqhat jetzt die Option, am Ende den Hash zu entfernen, was die Arbeit erledigt : IGNORE_RESOLVCONF=yes.
Maynard
1
Ich habe festgestellt, dass das Kommentieren IGNORE_RESOLVCONF=yeseigentlich nichts bewirkt, das Hinzufügen hat DNSMASQ_EXCEPT=lodas Problem tatsächlich behoben. Dies war auf rasbian 2018-03-13 mit dnsmasq 2.76.
Mtfurlan