Verwenden von dnsmasq mit NetworkManager

15

Es war bekannt, dass NetworkManager nicht gut funktioniert dnsmasq(siehe hier ). Ich habe die lange Diskussion hier durchgesehen, bin mir aber immer noch nicht sicher, wie ich mit der Situation umgehen soll.

Ich möchte dnsmasqlediglich DNS und DHCP für mein lokales Netzwerk bereitstellen. Was wäre der empfohlene Weg in diesem Fall?

Es scheint, dass das Problem auch für Ubuntu 14.04 bestehen bleibt, auch wenn behauptet wird, dass der Fehler behoben ist.

Als Workaround behindern Menschen NM-Versklavte aus dnsmasq-basefolgenden Gründen:

Der NM-Sklave dnsmasqverwendet fest codierte Optionen (in C), die eine äußerst eingeschränkte Funktionalität bieten.

  • Es hört nicht auf ethX ( --listen-address=127.0.0.1). Wir können unsere Server also nicht als DNS-Server für unsere lokalen Netzwerk-PCs verwenden, dh für LANs völlig nutzlos.
  • Es werden keine Anforderungen zwischengespeichert ( --cache-size=0). Kein Caching ==> keine DNS-Anfragen beschleunigen. Dies ist wiederum für LANs von großer Bedeutung, da viele Benutzer gleichzeitig angemeldet sind.
  • Schließlich benötigen wir auch die DHCP- und TFTP-Funktionalität von dnsmasq. Selbst wenn NM + dnsmasq einen echten DNS-Server enthalten würde, müssten wir ein weiteres dnsmasq ausführen

Aber ich bin mir nicht sicher, ob sie noch halten und / oder wie der Fix das Problem (die Probleme) gelöst hat. Keiner von ihnen weiß genau, was er getan hat und wie er sein Problem gelöst hat. Dh der Lösungsteil fehlt in der langwierigen Diskussion . Kann jemand bitte die Lücken ausfüllen? Dh

Die dnsmasqvon Ubuntu bereitgestellte Out-of-Box funktioniert aus den oben genannten Gründen auf der Serverseite nicht. Und auf der Clientseite kann "das auf diesen Ubuntu-Laptops installierte dnsmasq keine LAN-DNS-Abfrage von meinem DNS-Server ausführen" , weil "der NetworkManager (für Ubuntu-Laptops) bewirkt, dass sie eine seltsame 127.0.1.1-Nameserver-Einstellung haben" ( ref: DNS - Lösung für LAN oder lokales Heimnetzwerk )

Wie kann ich dnsmasq so einrichten, dass es reibungslos mit NetworkManager zusammenarbeitet, um meinem lokalen Netzwerk sowohl auf Server- als auch auf Clientseite DNS und DHCP (und TFTP) bereitzustellen?

TL'dr

für diejenigen, die die Antwort suchen. Von allen Antworten unten fand ich die einfachste Lösung für die Serverseite @ brad (für die Clientseite immer noch keine gute Antwort):

Die einzige Lösung für das Problem besteht darin, das NM-Laufwerk dnsmasq ... zu deaktivieren, "standard" dnsmasq zu installieren und dann über die Standardkonfigurationsdatei zu /etc/dnsmasq.confkonfigurieren.

xpt
quelle
2
Nur für Googler (wie ich): In neueren Versionen von Ubuntu ist dnsmasq-core in NetworkManager etwas benutzerfreundlicher. Siehe hier: askubuntu.com/questions/233195/…
A. Rabus

Antworten:

3

Ich habe auch deine Probleme.

Nach wiki.archlinux scheint es im Prinzip ausreichend zu sein, eine Datei zu erstellen, /etc/NetworkManager/dnsmasq.d/cachedie einfach enthält , um das Zwischenspeichern zu ermöglichen

$ cat /etc/NetworkManager/dnsmasq.d/cache 
cache-size=1000

Ich habe es versucht, aber nach dem Neustart von NM habe ich immer noch keinen Cache:

# ps ax | grep dns
11724 ?        S      0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d

Beachten Sie, dass die angegebene conf-Datei immer leer ist: Ich konnte mit diesem Verfahren keine Option konfigurieren.

Alles in allem scheint die NM-versklavte dnsmask in 14.04 (die vom dnsmasq-base-Paket bereitgestellt wird) vollständig gesperrt zu sein, so dass weder das Cachen noch etwas anderes (dhcp, tftp) aktiviert werden kann.

Wenn dies richtig ist, denke ich, dass, wie Sie sagen, die einzige Lösung für das Problem darin besteht, das NM-Laufwerk dnsmasq zu deaktivieren, indem Sie die Zeile auskommentieren

dns=dnsmasq

in der Datei /etc/NetworkManager/NetworkManager.confund installieren Sie den "Standard" dnsmasq und konfigurieren Sie ihn dann über seine Standardkonfigurationsdatei /etc/dnsmasq.conf.

Brad
quelle
Willkommen bei Superuser Brad! Danke für Ihre Hilfe!
10.
1
Tatsächlich aktiviert dies den Cache, da er mit ausgeführt wird --conf-dir=/etc/NetworkManager/dnsmasq.dund die cache-sizein der von Ihnen erstellten Datei angegebene verwendet wird. Sie können den Unterschied mitdig
sirfz 25.08.16
6

Es ist möglich, Einstellungen zu überschreiben, indem Sie sie eingeben /etc/NetworkManager/dnsmasq.d/*.conf. Einstellungen in der Konfigurationsdatei haben Vorrang vor Befehlszeilenflags. Sie werden angewendet, wenn NetworkManager dnsmasq startet. Führen Sie, sudo service network-manager restartum erneut anzuwenden. (Wenn es irgendeinen Zweifel gibt: Brad hat die Antwort verpasst, die ps ax | grep dnsein --conf-dirArgument zeigt )

Beispielsweise:

echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

Wie ich mich erinnere, deaktiviert NetworkManager das DNSMASQ-Caching standardmäßig, da Bedenken hinsichtlich einer Cachevergiftung bestehen. Bei einem Computer, auf dem allen Benutzern vertraut wird, ist dies möglicherweise kein Problem.

NetworkManager lässt sich nicht integrieren resolvconf, und der NM-Server unter 127.0.1.1wird nicht lokal verwendet, wenn das resolvconf-Paket installiert ist. resolvconf ist Teil von Ubuntu-Minimal- und Standard-Debian-Installationen; NetworkManager implementiert diese Funktionalität stärker integriert und weniger skriptbasiert.

Networkmanager machen sicher nicht mit einer globalen dnsmasq Instanz (Bindung an einem sekundären Loopback - IP und Einstellung zu stören bind-interfacesdurch /etc/dnsmasq.d/network-manager). Wenn Sie eine globale dnsmasq-Instanz installieren und die NM-Instanz beibehalten, überprüfen Sie noch einmal /etc/resolv.conf, welche Instanz standardmäßig vom Host verwendet wird.

Während Sie die dnsmasq-Instanz von NetworkManager wie oben gezeigt anpassen können, sollten Sie, wenn Sie einen DNS-Server benötigen, der sich an öffentliche Schnittstellen bindet, das dnsmasqPaket installieren (nur NetworkManager verwendet dnsmasq-base, das keine globale Instanz konfiguriert) und Ihre Konfiguration vornehmen /etc/dnsmasq.d/*.conf. Die Slave-Instanz von NetworkManager soll nur an die Loopback-Schnittstelle gebunden werden, und die Konfiguration über diesen Bereich hinaus könnte sie beschädigen.


Zusammenfassend für jemanden, der nur lokales DNS-Caching möchte:

sudo apt-get remove dnsmasq resolvconf dhcpcd5 rdnssd
echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

Für ein einfaches LAN sollte die Verbindungsfreigabe von NetworkManager immer noch ausreichen. Aber für ein benutzerdefiniertes LAN mit TFTP und so weiter:

sudo apt-get install resolvconf dnsmasq
echo 192.168.0.50,192.168.0.150,12h |sudo tee -a /etc/dnsmasq.d/lan.conf
echo enable-tftp |sudo tee -a /etc/dnsmasq.d/lan.conf
sudo service dnsmasq restart
Tobu
quelle
Vielen Dank. Auch wenn Sie mehr beschreiben sollten in vollem Umfang , was Ihre „zusammenfassend“ Befehle zu tun, dh die Anweisungen entfernen auch 4 Pakete , wenn Sie sie haben derzeit mehr Links und Diskussion auf reddit.com/r/Ubuntu/comments/2j0va4/...
nealmcb
Ganz einverstanden mit @nealmcb, Tobu, erklären Sie bitte, warum "jemand, der nur lokales DNS-Caching möchte" , das Paket entfernen mussdnsmasq . Wofür ist dann der nächste echoBefehl? da dnsmasqwird der weg sein.
22.
@xpt Tobu schlägt vor, zu entfernen dnsmasq, aber Sie sollten noch dnsmasq-basewegen NM installiert haben .
Thalis Kalfigkopoulos
0

Ich wollte einer bestimmten IP-Adresse einen bestimmten MAC zuweisen und aus Stabilitätsgründen so viel wie möglich mit dem Standard-Network Manager / dnsmasq arbeiten.

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.c enthält den Kommentar zur Verwendung von --conf-file zum Ignorieren von Konfigurationen, jedoch später in der Datei

/* dnsmasq exits if the conf dir is not present */
    if (g_file_test (CONFDIR, G_FILE_TEST_IS_DIR))
        nm_cmd_line_add_string (cmd, "--conf-dir=" CONFDIR);

Unter Ubuntu 16.04 zeigt LTS nach dem Einrichten eines Wi-Fi-Hotspots und dem Teilen einer anderen Verbindung, ps auxgww | grep dnsmasqdass das letzte Befehlszeilenargument für jeden der dnsmasq-Prozesse wie folgt lautet:

--conf-dir=/etc/NetworkManager/dnsmasq-shared.d

Auf diese Weise können in diesem Verzeichnis Konfigurationsdateien erstellt werden, die von allen Aufrufen von dnsmasq, die von Network Manager gestartet werden, gemeinsam genutzt werden.

Ich habe /etc/NetworkManager/dnsmasq-shared.d/Hue erstellt

dhcp-host=0c:4d:e9:a0:ce:cf,192.168.1.221

und neu gestartet, obwohl ausgeführt

sudo service network-manager restart

hätte funktioniert.

Dies führte dazu, dass mein Gerät die entsprechende IP-Adresse erhielt.

Ja, dies ist falsch, da dies bedeutet, dass alle Aufrufe von dnsmasq durch NetworkManager diese Deklaration erhalten. In diesem Fall ist dies jedoch harmlos, da es nur wichtig ist, ob der MAC im fraglichen Netzwerk angezeigt wird. Wenn das Netzwerk nicht 192.168.1 ist, treten Probleme auf.

Dies ist robuster als das Ersetzen von / usr / sbin / dnsmasq durch ein Skript, wie es unter https://gist.github.com/magnetikonline/6236150 vorgeschlagen wird

Die richtige Lösung wäre, zu ändern, wie dnsmasq aufgerufen wird, um die dnsmasq-Konfigurationsdateien ordnungsgemäß zu verwenden. Ich verstehe den Wunsch, dass Network Manager "nur funktioniert", aber wenn Tools idiotensicher sind, können sie nur von Idioten verwendet werden.

Christopher Brooks
quelle
danke für die antwort christopher allerdings kann ich wirklich nicht folgen ... "ich wollte einer bestimmten ip-adresse einen bestimmten mac zuweisen und aus stabilitätsgründen" ... "ps auxgww | grep dnsmasq zeigt das Das letzte Befehlszeilenargument für jeden der dnsmasq-Prozesse " ... ", die ich erstellt habe ... hätte funktioniert " ... " Ja, das ist falsch " ... Das heißt, ich kann Ihrem Gedankengang wirklich nicht folgen , um zu verstehen, was Sie hier sagen wollen.
22.
0

Meine Lösung könnte den Network Manager beschädigen und alles auf einfache Weise erledigen. Da NM mit dnsmasq nicht richtig umgeht, überschreibe ich es einfach mit meiner unten stehenden Methode.

Eine Problemumgehung bestand darin, einfach Folgendes zu tun:

sudo apt install dnsmasq
cp /etc/dnsmasq.conf ~/

Bearbeiten Sie die ~/dnsmasq.confDatei in Ihrem Benutzerverzeichnis und speichern Sie sie.

sudo rm -v /etc/dnsmasq.conf
sudo cp -v ~/dnsmasq.conf /etc/
sudo chattr +i /etc/dnsmasq.conf
sudo systemctl restart dnsmasq.service

Ich habe einen einfachen Bash-Alias ​​erstellt und ihn am Ende meiner Datei ~ / .bash_aliases abgelegt, um das Bearbeiten der Datei dnsmasq.conf zu vereinfachen. Hier ist der Alias:

alias="sudo chattr -i /etc/dnsmasq.conf && sudo nano -w /etc/dnsmasq.conf && sudo chattr +i /etc/dnsmasq.conf && sudo systemctl restart dnsmasq.service"

Natürlich können Sie für den zweiten sudo-Befehl im Alias ​​einen beliebigen Editor auswählen, aber ich habe nano dort verwendet, um es allen zu erleichtern. Speichern Sie die Datei, schließen Sie das Befehlsfenster und öffnen Sie es erneut. Dadurch sollte der Alias ​​für neu geöffnete Terminal-Registerkarten / -Fenster verfügbar sein.

Gehen eddmcSie einfach von Ihrem Benutzerkonto aus und Sie werden nach Ihrem Passwort gefragt, um die Befehle mit erhöhten Rechten auszuführen.

Beachten Sie, dass ich immer chattr +idie Datei. Dies ist so, dass Network Manager Ihre Konfiguration nicht mit einer eigenen überschreibt.

Bei kabelgebundenen Ethernet-Verbindungen sollte es keine Probleme geben. Ich habe festgestellt, seitdem ich dnsmasq für das DNS-Caching auf Laptops mit WLAN verwende, dass ich den dnsmasq.service nach dem Herstellen einer Verbindung zu einem Zugriffspunkt manuell neu starten muss. Ich denke, Network Manager kann Aufgaben wie das Neustarten von Diensten beim Herstellen einer Verbindung ausführen, habe dies jedoch noch nicht untersucht.

jpyper
quelle
0

Trotz gegenteiliger Behauptungen ignoriert NetworkManager alle dmsmasq-Konfigurationsdateien - auch die in seinem eigenen Verzeichnis /etc/NetworkManager/dnsmasq-shared.d. Der Beweis ist im Quellcode für NetworkManager ... Hier ist der relevante Kommentar:

/ * dnsmasq liest möglicherweise von seinem Standardverzeichnis der Konfigurationsdatei. Wenn dieses Verzeichnis eine gültige Konfigurationsdatei ist, wird es mit den hier angegebenen Optionen kombiniert und verursacht unerwünschte Nebenwirkungen. Wie das Senden gefälschter IP-Adressen als Gateway oder was auch immer. Sagen Sie also dnsmasq, dass Sie überhaupt keine Konfigurationsdatei verwenden sollen. * /

Hier ist ein Link zum relevanten Quellcode (Zeilen 139-144).

bsalnick
quelle
2
Ein Link, der auf den Quellcode verweist, damit die Leser diesen validieren und den zugehörigen Code lesen können, wäre hilfreich, wenn dies möglich ist.
Jamesc
1
Also ja, man kann keine explizite Konfigurationsdatei angeben. --conf-Datei ist fest in / dev / null codiert. Wenn Sie sich jedoch die vollständige Befehlszeile ansehen, die zum Starten von dnsmasq über den NetworkManager verwendet wird, sehen Sie, dass conf-dir verwendet wird: '/ usr / sbin / dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file = / var / run / NetworkManager / dnsmasq.pid --listen-address = 127.0.0.1 --cache-size = 400 --clear-on-reload --conf-file = / dev / null --proxy-dnssec --enable-dbus = org.freedesktop.NetworkManager.dnsmasq --conf-dir = / etc / NetworkManager / dnsmasq.d ', dh alle Dateien im angegebenen Verzeichnis werden gelesen.
Hardy