Comment configurer systemd-resolution et systemd-networkd pour utiliser le serveur DNS local pour résoudre les domaines locaux et le serveur DNS distant pour les domaines distants?

26

Je suis connecté au réseau local avec accès à Internet via une passerelle. Il existe un serveur DNS dans le réseau local qui est capable de résoudre les noms d'hôte des ordinateurs à partir du réseau local.

Je voudrais configurer systemd- resolution et systemd-networkd afin que les demandes de recherche de noms d'hôtes locaux soient dirigées (routées) exclusivement vers le serveur DNS local et les demandes de recherches pour tous les autres noms d'hôtes soient dirigées exclusivement vers un autre serveur DNS distant.

Supposons que je ne sais pas où se trouvent les fichiers de configuration ou si je dois ajouter d'autres fichiers et exiger que leur (s) chemin (s) soient spécifiés dans la réponse.

Piotr Dobrogost
la source

Réponses:

28

Dans le fichier de configuration de l'interface réseau local, nous devons spécifier si nous voulons obtenir l'adresse du serveur DNS local à partir du serveur DHCP en utilisant l' DHCP=option :

[Network]
DHCP=yes

ou spécifiez explicitement son adresse en utilisant l' DNS=option :

[Network]
DNS=10.0.0.1

De plus, nous devons spécifier (dans la même section) les domaines locaux en utilisant l' Domains=option

Domains=domainA.example domainB.example ~example

Nous spécifions les domaines locaux domainA.example domainB.example pour obtenir le comportement suivant (à partir de systemd-resolu.service, page de manuel systemd-resolu ):

Les recherches d'un nom d'hôte se terminant par l'un des domaines par interface sont exclusivement acheminées vers les interfaces correspondantes.

Cette façon hostX.domainA.examplesera résolue exclusivement par notre serveur DNS local.

Nous spécifions ~exampleque tous les domaines se terminant par exampledoivent être traités comme des domaines de route uniquement pour obtenir le comportement suivant (à partir de la description de ce validation):

Les serveurs DNS qui ont des domaines de routage uniquement ne doivent être utilisés que pour les domaines spécifiés.

Cette façon hostY.on.the.internetsera résolue exclusivement par notre serveur DNS global et distant.

Remarque

Idéalement, lors de l'utilisation du protocole DHCP, les noms de domaine locaux doivent être obtenus auprès du serveur DHCP au lieu d'être spécifiés explicitement dans le fichier de configuration de l'interface réseau ci-dessus. Voir UseDomains=option . Cependant, il reste des problèmes en suspens avec cette fonctionnalité - voir l' option domaines de recherche DHCP systemd-networkd .

Nous devons spécifier le serveur DNS distant comme notre serveur DNS global, à l'échelle du système. Nous pouvons le faire en /etc/systemd/resolved.conffichier:

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

N'oubliez pas de recharger la configuration et de redémarrer les services:

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

Mise en garde!

Les garanties ci-dessus s'appliquent uniquement lorsque les noms sont résolus par systemd-resolved - voir la page de manuel pour nss-resolver, libnss_resolve.so.2 et la page de manuel pour systemd- resolu.service , systemd-resolu .

Voir également:

Les références:

Piotr Dobrogost
la source
6
Avez-vous envisagé de ne pas utiliser .localdans cet exemple? Certes, avec avahi, cela était censé être réservé au MDNS et en abuser était un gros non-non. Il serait plus clair pour moi d'utiliser example.comou .exemple .
sourcejedi
1
@sourcejedi Pour référence .localest défini comme domaine spécial dans la RFC 6762 - DNS multidiffusion dans la section Noms DNS multidiffusion . Merci, réparé.
Piotr Dobrogost
Remarque indépendante: vous pouvez également accepter vous-même les réponses.
intelfx
2
Je pense qu'il serait utile d'ajouter l'emplacement du fichier de configuration pour l'interface réseau locale . Pas sûr d'avoir raison, n'est-ce pas /etc/systemd/network/*.network? Trouvé ici superuser.com/a/1365864
Pierre Cordier
1
J'observe que cette réponse "Dans le fichier de configuration ..." ne répond pas aux PO "Supposons que je ne sais pas où sont les fichiers de configuration ..." Comme quelqu'un qui est arrivé ici dans le même état d'ignorance l'emplacement de fichiers de configuration particuliers, cette réponse est incomplète.
Eric Towers
1

Juste pour développer l'excellente réponse de @piotrDobrogost, n'oubliez pas de configurer /etc/nsswitch.confpour l'utiliser systemd-resolvedcomme source de résolution DNS. Votre hostsdirective doit se présenter comme suit pour votre cas d'utilisation particulier:

/etc/nsswitch.conf

hosts:  files resolve dns

Donc, si vous limitez la résolution aux seuls domaines spécifiés dans la Domainsdirective en /etc/systemd/resolved.conftant que détails Piotr ci-dessus, DNS devrait ensuite être consulté dans l'ordre des sources de résolution de noms spécifiées /etc/nsswitch.conflorsque les domaines NE SONT PAS trouvés dansDomains directive:

Les références de lien suivant la exigence de préciser la détermination de /etc/nsswitch.confsisystemd-resolved est consulté lors de la résolution de nom:

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

La documentation de SystemD que j'ai trouvée terrible. J'ai dû rassembler une compréhension de plusieurs liens, y compris la réponse de Piotr ci-dessus ;-)

F1Linux
la source
Lorsque vous utilisez le mode de fonctionnement recommandé de systemd-resolu où se /etc/resolve.conftrouve un lien symbolique vers un /run/systemd/resolve/stub-resolv.conffichier qui contient à son tour l'adresse du résolveur de stub DNS de systemd- resolver, il n'est pas nécessaire de placer une resolvedirective dans le /etc/nsswitch.conffichier car les requêtes DNS seront dirigées (en raison de la nss-dnsdirective standard ) vers résolveur de stub qui agit selon les règles de systemd-resolution .
Piotr Dobrogost
@PiotrDobrogost Comment pouvez-vous contrôler l'ordre dans lequel les sources de résolution DNS sont consultées sans utiliser /etc/nsswitch.conf``? In the specimen config above, / etc / hosts` (" fichiers ") seraient vérifiées pour l' IP statique : les mappages de noms et si aucun n'est trouvé, le stub résolu par systemd résolu serait ensuite consulté . Je ne vois pas comment il serait possible de mettre en scène des sources de résolution DNS sans utiliser /etc/nsswitch.conf. Ai-je raté un tour ici?
F1Linux
Je ne dis pas que ce /etc/nsswitch.confn'est pas nécessaire. Je dis que lorsque l'on utilise le résolveur DNS de stub résolu par systemd, il suffit alors d'avoir la dnsdirective listée en hosts:ligne (probablement après la filedirective). Il n'y a pas besoin de resolvedirective car c'est le résolveur de stub qui est le point d'entrée de la logique de systemd-resolution et non le nss-resolvemodule plug-in ...
Piotr Dobrogost
... En d'autres termes, vous pouvez accéder à la logique de systemd-resolution soit par la resolvedirective ➟ module plug-in NSS -resolve NSS ➟ par systemd-resolu ou par la dnsdirective ➟ module plug-in NSS nss-dns ➟ 'résolveur DNS stub de systemd-resolu ' résolu par systemd
Piotr Dobrogost
@PiotrDobrogost Je pense que je suis arrivé au truc filesalors de la 2ème partie de votre question. En le relisant, il semble que vous parliez simplement de vérifier le cache local pour un mappage IP: nom , puis de contacter un redirecteur s'il n'est pas trouvé. Je règle généralement la première source de résolution DNS pour contourner le DNS pour me permettre de tester et de ne pas toucher les hôtes de productionresolve/etc/nsswitch.conffiles
F1Linux