Come disabilitare systemd risolto e risolvere DNS con dnsmasq?


Risposte:


35

dnsmasq i pacchetti sono ancora disponibili in 16.10 e 17.04.

  1. Installa dnsmasqe dipendenze (o almeno scarica i loro pacchetti) prima di disabilitaresystemd-resolved :

    sudo apt-get install dnsmasq
    
  2. Disabilita systemd-resolvede verifica che dnsmasqsia in esecuzione:

    sudo systemctl stop systemd-resolved
    sudo systemctl disable systemd-resolved
    
    systemctl status dnsmasq
    
  3. Condire dnsmasqa piacere. Dopo aver applicato le impostazioni, riavvia dnsmasq:

    sudo systemctl stop dnsmasq
    sudo systemctl start dnsmasq
    

Dopo il passaggio 2 potresti non avere un risolutore del sistema funzionante fino al completamento del passaggio 3. Potrebbe essere necessario riavviare il sottosistema di rete (o semplicemente riavviare) per dnsmasqfunzionare con le configurazioni predefinite. Nel mio test, l'aggiunta di un server DNS noto /etc/dnsmasq.confe il riavvio sono dnsmasqstati sufficienti per farlo funzionare in un ambiente liveCD.


Ottima risposta e apparentemente l'unica soluzione per disabilitare NetworkManager non è accettabile!
bogl

3
Per me, questa è stata un'ottima risposta, ma ha anche richiesto i passaggi aggiuntivi dalla risposta di @ blabla, aggiungendo la dns=dnsmasqconfigurazione a/etc/NetworkManager/NetworkManager.conf
Roberto Tyley,

Anch'io. Dopo aver lottato con il passaggio da dnsmasq a systemd risolto e non associato, ha fatto il trucco su Ubuntu 17.10. Ho dovuto usare le aggiunte di Blabla però.
Alberto L. Bonfiglio,

17

Oltre alla risposta di @quixotic:

Assicurati di avere in /etc/NetworkManager/NetworkManager.conf:

[main]
dns=dnsmasq

se è necessario aggiungerlo, riavviare NetworkManager in questo modo:

sudo systemctl restart NetworkManager

e /etc/resolv.confdeve essere un collegamento simbolico a /var/run/NetworkManager/resolv.conf. potrebbe essere fatto così

sudo rm /etc/resolv.conf; sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf

In realtà l'ho impostato come dns=defaulte funziona bene perché ho i nameserver definiti da NetworkManager invece di essere definiti in dnsmasq; questo funziona per me - NM ottiene i nameserver dalle impostazioni effettuate nella configurazione NM di KDE tramite la barra delle applicazioni. Uso l'IP fisso sulla mia rete domestica FWIW.
pbhj,

1
Questo passaggio è stato un'aggiunta necessaria alla risposta di @ quixotic per me (ubuntu 17.04, installazione completa, non LiveCD).
Roberto Tyley,

0

Secondo il manuale di systemd-resolved , systemd-resolved fornisce servizi di risoluzione dei nomi tramite tre diverse interfacce:

  1. "l'API con funzionalità complete e il sistema risolto espone sul bus"
  2. "un listener di stub DNS locale sull'indirizzo IP 127.0.0.53 sull'interfaccia di loopback locale"
  3. L'API glibc getaddrinfo (3) come definita da RFC3493 e le relative funzioni di risoluzione, incluso gethostbyname (3). Questa API è ampiamente supportata, anche oltre la piattaforma Linux. Nella sua forma attuale, tuttavia, non espone le informazioni sullo stato di convalida DNSSEC ed è solo sincrono. Questa API è supportata dal glibc Name Service Switch (nss (5)). L'utilizzo del modulo NSS di glibc nss-resolve (8) è necessario per consentire alle funzioni di risoluzione NSS di glibc di risolvere i nomi host tramite systemd-resolved.

Sembra che le prime due interfacce non interferiscano con la normale risoluzione DNS e per me è probabile che il problema risieda nella terza.

Nel manuale di nss-resolver :

Per attivare il modulo NSS, aggiungere "resolver" alla riga che inizia con "hosts:" in /etc/nsswitch.conf. In particolare, si consiglia di inserire "risolvi" all'inizio della riga "hosts:" di /etc/nsswitch.conf (ma dopo le voci "files" o "mymachines"), subito prima della voce "dns" se esiste, seguita da "[! UNAVAIL = return]", per garantire che le query DNS siano sempre instradate tramite systemd-resolved (8) se è in esecuzione, ma sono indirizzate a nss-dns se questo servizio non è disponibile

Quindi ciò che è necessario è fare in modo che "dns" preceda "risolvi" in "host:" riga di /etc/nsswitch.conf . E quindi getaddrinfodovrebbe semplicemente aderire a /etc/resolv.conf .

Questa soluzione impedisce solo a systemd-resolved di gestire tutte le richieste di risoluzione DNS e non è limitata a un gestore di rete specifico. Inoltre, garantisce che il servizio LLMNR e mDNS funzioni normalmente.

(Non ho familiarità con il funzionamento della risoluzione dei nomi su Linux e non sono sicuro di ciò che ho capito da questi manuali. I motivi indicano che ho sbagliato qualcosa. Grazie :)


0

Per (X) Ubuntu 18.04 (vedi la mia risposta su stackexchange ).

Eccone una copia (dovrei fare una copia?)

Ecco la soluzione per (X) Ubuntu 18.04 Bionic.

Installa dnsmasq

sudo apt install dnsmasq

Disabilita il listener risolto da systemd sulla porta 53 (non toccare /etc/systemd/resolved.conf, perché potrebbe essere sovrascritto durante l'aggiornamento):

$ cat /etc/systemd/resolved.conf.d/noresolved.conf 
[Resolve]
DNSStubListener=no

e riavviarlo

$ sudo systemctl restart systemd-resolved

(in alternativa disabilitarlo completamente entro $ sudo systemctl disable systemd-resolved.service)

Elimina /etc/resolv.conf e crea di nuovo. Questo è importante, perché resolv.conf è un collegamento simbolico a /run/systemd/resolve/stub-resolv.conf per impostazione predefinita. Se non si eliminerà il collegamento simbolico, il file verrà sovrascritto da systemd al riavvio (anche se abbiamo disabilitato systemd-risolto!). Inoltre NetworkManager (NM) verifica se si tratta di un collegamento simbolico per rilevare la configurazione risolta dal sistema.

$ sudo rm /etc/resolv.conf
$ sudo touch /etc/resolv.conf

Disabilita la sovrascrittura di /etc/resolv.conf da NM (esiste anche un'opzione rc-manager, ma non funziona, nonostante sia descritta in un manuale):

$ cat /etc/NetworkManager/conf.d/disableresolv.conf 
[main]
dns=none

e riavviarlo:

$ sudo systemctl restart NetworkManager

Di 'a dnsmasq di usare resolv.conf da NM:

$ cat /etc/dnsmasq.d/nmresolv.conf 
resolv-file=/var/run/NetworkManager/resolv.conf

e riavviarlo:

$ sudo systemctl restart dnsmasq

Utilizzare dnsmasq per la risoluzione:

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.