Comment faire pour que networkmanager configure des serveurs de noms spécifiques à un domaine avec openresolv + dnsmasq

11

Je me connecte souvent à plusieurs réseaux simultanément. Chacun de ces réseaux fournit une configuration de serveur de noms via DHCP. Par exemple, réseau 1: (eth0):

domain company1.corp #
nameserver 192.168.0.253
nameserver 192.168.0.254

Réseau 2 (tun0):

domain company2.corp #
nameserver 10.102.204.51
nameserver 10.102.208.51

# Les noms ont changé

Lorsqu'il est connecté aux deux réseaux simultanément:

# resolv.conf from NetworkManager
domain company1.corp, company2.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
nameserver 10.102.204.51
# NOTE: the libc resolver may not support more than 3 nameservers.
# The nameservers listed below may not be recognized.
nameserver 10.102.208.51

La résolution de service.company2.corp ne fonctionne pas car le serveur de prénom ne connaît que les noms de company1.corp.

Tellement inspiré par cet article , j'ai installé openresolv (une implémentation resolvconf) configurant un service dnsmasq local sur mon installation Arch linux.

Si je configure les serveurs de noms manuellement à l'aide de resolvconf:

# resolvconf -d NetworkManager
# echo "domain company1.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
" | resolvconf -a eth0
# echo "domain company2.corp
nameserver 10.102.204.51
nameserver 10.102.208.51
" | resolvconf -a tun0

Ensuite, je suis en mesure de résoudre les noms de company1.corp et company2.corp (le serveur dnsmasq local gère cela.)

Notez qu'après la configuration manuelle, resolveconf -l affiche séparément les 2 configurations:

~ # resolvconf -l
# resolv.conf from tun0
domain company2.corp
nameserver 10.102.204.51
nameserver 10.102.208.51

# resolv.conf from eth0
domain company1.corp
nameserver 192.168.0.253
nameserver 192.168.0.254

Cependant, lorsque vous laissez le gestionnaire de réseau faire la configuration, les 2 configurations ne sont pas distinctes, comme ce serait le cas si le gestionnaire de réseau écrivait dans /etc/resolve.conf

~ # resolvconf -l
# resolv.conf from NetworkManager
# Generated by NetworkManager
domain company1.corp, company2.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
nameserver 10.102.204.51
# NOTE: the libc resolver may not support more than 3 nameservers.
# The nameservers listed below may not be recognized.
nameserver 10.102.208.51

Ma question est de savoir comment puis-je demander au gestionnaire de réseau d'appeler correctement resolveconf pour que les serveurs de noms de chaque interface soient enregistrés séparément. (Malheureusement, googler pour cela est inutile car google pense que "resolveconf" == "resolver.conf")

Gary van der Merwe
la source
2
Sur Google, recherchez "resolvconf"avec les guillemets. Mettez toujours des guillemets autour des noms propres sur Google.
Gilles 'SO- arrête d'être méchant'

Réponses:

14

NetworkManager a la fonctionnalité pour gérer un serveur dnsmasq local intégré. Il n'est pas nécessaire d'utiliser resolvconf / openresolv pour ce faire.

Pour l'activer:

  • Désactivez la configuration resolvconf / openresolv dnsmasq si elle était précédemment activée et assurez-vous qu'aucune instance de dnsmasq n'est en cours d'exécution.
  • Assurez-vous que dnsmasq est installé
  • Ajouter dns=dnsmasqà /etc/NetworkManager/NetworkManager.conf.
  • Redémarrez NetworkManager

Une fois que vous avez fait cela, vous verrez que NetworkManager a démarré un processus dnsmasq:

$ pgrep dnsmasq -fl
1697 /usr/bin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/nm-dns-dnsmasq.pid --listen-address=127.0.0.1 --conf-file=/var/run/nm-dns-dnsmasq.conf --cache-size=400 --proxy-dnssec

/etc/resolve.conf devrait pointer vers l'instance dnsmasq locale:

$ cat /etc/resolv.conf
# Generated by NetworkManager
domain company1.corp
search company1.corp
nameserver 127.0.0.1

et nous pouvons voir quels serveurs dnsmasq utilise:

# cat /var/run/nm-dns-dnsmasq.conf 
server=/company2.corp/10.102.208.51
server=/10.in-addr.arpa/10.102.208.51
server=192.168.1.244
server=192.168.1.239
Gary van der Merwe
la source
vraiment sympa, merci! solution très simple et facile mais malheureusement peu connue - n'a pas pu résister, désolé
akostadinov
Cela semble fonctionner lors de la combinaison d'une connexion locale avec un ou deux VPN. Il semble que cela ne fonctionne pas avec deux connexions locales. Actuellement, je suis connecté au réseau de bureau via Ethernet, où malheureusement la connexion Internet en amont a échoué. Je suis également connecté via USB Ethernet (mon téléphone) à un Internet fonctionnel. Je ne peux pas demander à NetworkManager d'appliquer le nom de domaine au serveur DNS du bureau.
Oskar Berggren
@OskarBerggren: Sur votre Ethernet de bureau, sous l'onglet IPv4, cochez la case "Utiliser cette connexion uniquement pour les ressources de son réseau".
Gary van der Merwe
@GaryvanderMerwe C'est exactement ce que j'ai essayé, j'ai oublié de l'écrire. Il semble y avoir une demande de bogue / fonctionnalité connexe
Oskar Berggren
Pour info il n'y a pas d'option à utiliser ubounddonc aussi DNSSEC fonctionne, voir fedoraproject.org/wiki/Networking/NameResolution/DNSSEC
akostadinov
0

Il semble que NetworkManager écrase simplement /etc/resolv.confet n'utilise pas openresolv. Selon FS # 24635 , NetworkManager prend en charge openreslov, mais il n'était pas initialement activé dans la build. Quelle version d'Arch Linux utilisez-vous et quelle est la version du package networkmanager?

mgorven
la source
networkmanager 0.9.4.0-6 NetworkManager appelle resolveconf et n'écrit pas dans /etc/resolev.conf. Le problème est que NetworkManager fusionne les informations DNS et les transmet à resolveconf comme une seule interface, et non comme informations pour les interfaces distinctes.
Gary van der Merwe
0

Faites comme Gary van der Merwe a répondu, mais

/etc/NetworkManager/NetworkManager.conf

Je devais ajouter

[main]
dns=dnsmasq

dans le fichier. Pas seulement

dns=dnsmasq

Cela est dû au fait que tous les paramètres de ce fichier doivent se trouver dans une section et que ma version de distribution, manjaro (archlinux), du package NetworkManager ne remplit pas le fichier de configuration. (Je suppose que la distribution de Gary fonctionne puisque sa ligne suggérée a fonctionné pour lui et pour les autres)

Une autre note, toute configuration dnsmasq doit aller dans un fichier de configuration dans ce

/etc/NetworkManager/dnsmasq.d/

annuaire. Il peut s'agir d'un répertoire différent sur votre machine. J'ai appris le répertoire utilisé en consultant la ligne utilisée par NetworkManager pour démarrer le démon dnsmasq. Vous pouvez voir cette ligne en exécutant ps aux|grep dnsmasq. Vous devez attendre pour l'exécuter jusqu'à ce que vous ayez modifié la configuration de NetworkManager et redémarré son service.

SultanLegend
la source