Come configurare systemd-risolto e systemd-networkd per utilizzare il server DNS locale per risolvere domini locali e server DNS remoto per domini remoti?


26

Sono connesso alla rete locale con accesso a Internet tramite gateway. Esiste un server DNS nella rete locale in grado di risolvere i nomi host dei computer dalla rete locale.

Vorrei configurare systemd-resolved e systemd-networkd in modo che le richieste di ricerca per i nomi host locali vengano indirizzate (instradate) esclusivamente al server DNS locale e le richieste di ricerca per tutti gli altri nomi host vengano indirizzate esclusivamente a un altro server DNS remoto.

Supponiamo che non sappia dove siano i file di configurazione o se dovrei aggiungere altri file e richiedere che i loro percorsi siano specificati nella risposta.

Risposte:


28

Nel file di configurazione per l'interfaccia di rete locale dobbiamo specificare che vogliamo ottenere l'indirizzo del server DNS locale dal server DHCP usando l' DHCP=opzione :

[Network]
DHCP=yes

o specifica esplicitamente il suo indirizzo usando l' DNS=opzione :

[Network]
DNS=10.0.0.1

Inoltre, dobbiamo specificare (nella stessa sezione) domini locali utilizzando l' Domains=opzione

Domains=domainA.example domainB.example ~example

Specifichiamo i domini locali domainA.example domainB.exampleper ottenere il seguente comportamento (da systemd-resolved.service, pagina man risolta da systemd ):

Le ricerche per un nome host che termina in uno dei domini per interfaccia vengono indirizzate esclusivamente alle interfacce corrispondenti.

In questo modo hostX.domainA.exampleverrà risolto esclusivamente dal nostro server DNS locale.

Specifichiamo ~exampleche tutti i domini che terminano exampledevono essere trattati come domini di sola route per ottenere il seguente comportamento (dalla descrizione di questo commit):

I server DNS che dispongono di domini di sola route devono essere utilizzati solo per i domini specificati.

In questo modo hostY.on.the.internetverrà risolto esclusivamente dal nostro server DNS remoto globale.

Nota

Idealmente, quando si utilizza il protocollo DHCP, i nomi di dominio locali dovrebbero essere ottenuti dal server DHCP anziché essere specificati esplicitamente nel file di configurazione dell'interfaccia di rete sopra. Vedere UseDomains=l'opzione . Tuttavia, ci sono ancora problemi in sospeso con questa funzione: vedere il problema relativo all'opzione Domini di ricerca DHCP di systemd-networkd .

Dobbiamo specificare il server DNS remoto come nostro server DNS globale a livello di sistema. Possiamo farlo nel /etc/systemd/resolved.conffile:

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

Non dimenticare di ricaricare la configurazione e riavviare i servizi:

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

Attenzione!

Le garanzie di cui sopra si applicano solo quando i nomi vengono risolti da systemd-resolved - vedere la pagina man per nss-resolve, libnss_resolve.so.2 e la pagina man per systemd-resolved.service, systemd-resolved .

Guarda anche:

Riferimenti:


6
Hai considerato di non utilizzare .localin questo esempio? Certamente con avahi, questo doveva essere riservato a MDNS e l'uso improprio era un grande no-no. Per me sarebbe più chiaro usare example.como .example .
sourcejedi

1
@sourcejedi Per riferimento .localè definito come dominio speciale in RFC 6762 - DNS multicast nella sezione Nomi DNS multicast . Grazie, risolto.
Piotr Dobrogost,

Nota non correlata: puoi anche accettare autonomamente le risposte.
intelfx

2
Penso che sarebbe utile aggiungere la posizione del file di configurazione per l'interfaccia di rete locale . Non sei sicuro di avere ragione, vero /etc/systemd/network/*.network? Trovato qui superuser.com/a/1365864
Pierre Cordier,

1
Osservo che questa risposta "Nel file di configurazione ..." non risponde all'OP "Supponiamo che non so dove siano i file di configurazione ..." Come qualcuno che è arrivato qui nello stesso stato di ignoranza riguardo al posizione di particolari file di configurazione, questa risposta è incompleta.
Eric Towers,

1

Giusto per ampliare risposta eccellente @piotrDobrogost s', non dimenticate di config /etc/nsswitch.confdi utilizzare systemd-resolvedcome fonte di risoluzione DNS. La tua hostsdirettiva dovrebbe apparire come segue per il tuo caso d'uso particolare:

/etc/nsswitch.conf

hosts:  files resolve dns

Quindi, se si limita la risoluzione solo ai domini specificati nella Domainsdirettiva /etc/systemd/resolved.confcome sopra come dettagli di Piotr, il DNS dovrebbe essere consultato nell'ordine delle fonti di risoluzione dei nomi specificate /etc/nsswitch.confquando i domini NON si trovano nella Domainsdirettiva:

Il seguente link riferimenti il requisito per specificare risolvere in /etc/nsswitch.confmodo systemd-resolvedviene consultato durante la risoluzione dei nomi:

https://github.com/systemd/systemd/issues/940

Documentazione di SystemD che ho trovato essere terribile. Ho dovuto mettere insieme una comprensione da più collegamenti, inclusa la risposta di Piotr sopra ;-)


Quando si utilizza la modalità operativa consigliata di systemd-resolved in cui /etc/resolve.confè presente un collegamento simbolico al /run/systemd/resolve/stub-resolv.conffile che a sua volta contiene l'indirizzo del resolver di stub DNS di systemd-resolve non è necessario inserire la resolvedirettiva nel /etc/nsswitch.conffile poiché le richieste DNS verranno indirizzate (a causa della nss-dnsdirettiva standard ) a risolutore di stub che agisce secondo le regole di systemd-risolved .
Piotr Dobrogost,

@PiotrDobrogost Come è possibile controllare le fonti dell'ordine di risoluzione DNS vengono consultate senza utilizzare /etc/nsswitch.conf``? In the specimen config above, / etc / hosts` (" file ") verrebbe verificato per IP statico : mappature dei nomi e se non ne viene trovato uno, lo stub risolto da systemd verrà successivamente consultato . Non riesco a vedere come sarebbe quindi possibile mettere in scena le fonti di risoluzione DNS senza usare /etc/nsswitch.conf. Mi sto perdendo un trucco qui?
F1Linux il

Non sto dicendo che /etc/nsswitch.confnon è necessario. Sto dicendo che quando si usa il risolutore DNS stub di systemd-resolved è sufficiente che la dnsdirettiva sia elencata in hosts:linea (presumibilmente dopo la filedirettiva). Non c'è bisogno di resolvedirettiva in quanto è il risolutore di stub che è il punto di accesso alla logica del sistema risolto e non al nss-resolvemodulo plug-in ...
Piotr Dobrogost

... In altre parole, è possibile raggiungere la logica di systemd-risolved tramite la resolvedirettiva ➟ modulo plug-in NSS n-risolvesystemd-risolto o attraverso la dnsdirettiva ➟ nss-dns modulo plug-in NSS ➟ risolutore DNS stub di systemd-risoltosystemd-resolved
Piotr Dobrogost,

@PiotrDobrogost Penso che sono arrivato in filespoi resolvethingy in /etc/nsswitch.confdal 2 ° parte della tua domanda. Rileggendolo, sembra che tu stia solo parlando del controllo della cache locale per un IP: mappatura dei nomi, quindi raggiungendo uno spedizioniere se non trovato. In genere ho impostato la filesprima fonte di risoluzione DNS per bypassare DNS per consentirmi di testare e non colpire gli host di produzione - T
F1Linux
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.