Utilisation de dnsmasq avec NetworkManager

15

Il était bien connu que NetworkManager ne jouait pas bien avec dnsmasq(réf: ici ). J'ai survolé la longue discussion ici, mais je ne sais toujours pas quelle est la façon recommandée de gérer la situation.

Tout ce que je veux, c'est utiliser dnsmasqpour fournir DNS et DHCP à mon réseau local. Quelle serait la voie recommandée dans ce cas?

Il semble que le problème persiste même pour Ubuntu 14.04, même le bug est censé être corrigé.

Pendant le contournement, les gens désactivent l'esclave NM dnsmasq-basepour les raisons suivantes:

Le NM-esclave dnsmasqutilise des options codées en dur (en C) qui offrent des fonctionnalités extrêmement limitées.

  • Il n'écoute pas sur ethX ( --listen-address=127.0.0.1). Nous ne pouvons donc pas utiliser nos serveurs comme serveurs DNS pour nos PC de réseau local, c'est-à-dire qu'ils sont complètement inutiles pour les LAN.
  • Il ne met pas en cache les requêtes ( --cache-size=0). Pas de mise en cache ==> pas d'accélération des requêtes DNS. Ceci est encore très important pour les réseaux locaux car il existe de nombreux utilisateurs simultanés.
  • Enfin, nous avons également besoin des fonctionnalités DHCP et TFTP de dnsmasq, donc même si NM + dnsmasq incluait un vrai serveur DNS, nous devrions exécuter un autre dnsmasq

Mais je ne sais pas s'ils tiennent toujours et / ou comment le correctif a résolu le (s) problème (s). De plus, aucun d'entre eux ne sait exactement ce qu'ils ont fait et comment ils l'ont fait pour résoudre leur problème. C'est-à-dire que la partie solution est absente de la longue discussion . Quelqu'un peut-il remplir les blancs s'il vous plaît? C'est à dire,

Le dnsmasqprêt à l'emploi fourni par Ubuntu ne fonctionne pas, côté serveur, pour les raisons ci-dessus. Et aussi, du côté client, "le dnsmasq installé sur ces ordinateurs portables Ubuntu ne peut pas faire de requête DNS LAN depuis mon serveur DNS" , car "le NetworkManager (ordinateurs portables Ubuntu ') leur fait avoir un paramètre de serveur de noms 127.0.1.1 étrange" ( ref: solution DNS pour LAN ou réseau domestique local )

Comment faire en sorte que dnsmasq fonctionne correctement avec NetworkManager, afin de fournir DNS et DHCP (et TFTP) à mon réseau local, côté serveur et côté client?

TL'dr

pour ceux qui cherchent la réponse. De toutes les réponses ci-dessous, j'ai trouvé que la solution la plus simple est @ brad's, pour le côté serveur (toujours pas de bonne réponse pour le côté client):

la seule solution au problème est de désactiver le dnsmasq du lecteur NM ..., d'installer le dnsmasq "standard" puis de le configurer via son /etc/dnsmasq.conffichier de configuration standard .

xpt
la source
2
Juste pour les Googleurs (comme moi): dans les nouvelles versions d'ubuntu, dnsmasq-core à l'intérieur de NetworkManager est un peu plus convivial. Voir ici: askubuntu.com/questions/233195/…
A. Rabus

Réponses:

3

J'ai aussi tes problèmes.

En principe, après wiki.archlinux , il semble que pour activer la mise en cache, il devrait suffire de créer un fichier /etc/NetworkManager/dnsmasq.d/cachecontenant simplement

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

J'ai essayé mais après le redémarrage de NM, je n'ai toujours pas de 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

Notez que le fichier de conf cité est toujours vide: je n'ai pu configurer aucune option à l'aide de cette procédure.

Dans l'ensemble, il semble que le masque dns asservi NM dans 14.04 (qui est fourni par le paquetage dnsmasq-base) est complètement verrouillé, il n'est donc pas possible d'activer la mise en cache, ni rien d'autre (dhcp, tftp).

Si c'est vrai, je pense que, comme vous le dites, la seule solution au problème est de désactiver le dnsmasq NM-drive en commentant la ligne

dns=dnsmasq

dans le fichier /etc/NetworkManager/NetworkManager.confet installez le dnsmasq "standard" puis configurez-le via son /etc/dnsmasq.conffichier de configuration standard .

Brad
la source
Bienvenue sur superutilisateur brad! Merci de votre aide!
xpt
1
En fait, cela active le cache, car il s'exécute avec --conf-dir=/etc/NetworkManager/dnsmasq.d, le cache-sizespécifié dans le fichier que vous avez créé est utilisé. Vous pouvez voir la différence en utilisantdig
sirfz
6

Il est possible de remplacer les paramètres en les insérant /etc/NetworkManager/dnsmasq.d/*.conf. Les paramètres du fichier de configuration ont priorité sur les indicateurs de ligne de commande. Ils sont appliqués lorsque NetworkManager démarre dnsmasq. Courez sudo service network-manager restartpour réappliquer. (En cas de doute: la réponse de Brad a manqué le fait qui ps ax | grep dnsmontre un --conf-dirargument)

Par exemple:

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

Si je me souviens, NetworkManager désactive la mise en cache dnsmasq par défaut en raison de problèmes d'empoisonnement du cache. Pour une machine sur laquelle tous les utilisateurs sont fiables, ce n'est peut-être pas un problème.

NetworkManager ne s'intègre pas avec resolvconfet le serveur de NM 127.0.1.1ne sera pas utilisé localement si le package resolvconf est installé. resolvconf fait partie des installations Debian minimales et ubuntu; NetworkManager réimplémente cette fonctionnalité d'une manière plus intégrée et moins basée sur des scripts.

NetworkManager ne fait sûr de ne pas interférer avec une instance globale de dnsmasq ( la liaison à un paramètre IP loopback secondaire et bind-interfacespar /etc/dnsmasq.d/network-manager). Si vous installez une instance globale de dnsmasq et conservez l'instance de NM, vérifiez à nouveau /etc/resolv.confcelle que l'hôte utilisera par défaut.

Bien que vous puissiez personnaliser l'instance dnsmasq de NetworkManager comme indiqué ci-dessus, si vous voulez un serveur DNS qui se lie aux interfaces publiques, vous devez installer le dnsmasqpackage (NetworkManager utilise uniquement dnsmasq-base, qui ne configure pas une instance globale) et mettre votre configuration dedans /etc/dnsmasq.d/*.conf. L'instance esclave de NetworkManager est uniquement destinée à se lier à l'interface de bouclage et sa configuration au-delà de cette portée risquerait de la casser.


En résumé, pour quelqu'un qui veut juste une mise en cache DNS locale:

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

Pour un LAN simple, le partage de connexion de NetworkManager devrait toujours suffire. Mais pour un LAN configuré sur mesure, avec TFTP et ainsi de suite:

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
la source
Merci. Bien que vous devriez décrire plus en détail ce que font vos commandes "en résumé", c'est-à - dire que les instructions suppriment également 4 packages si vous les avez actuellement Plus de liens et de discussion sur reddit.com/r/Ubuntu/comments/2j0va4/…
nealmcb
Tout à fait d'accord avec @nealmcb, Tobu, veuillez expliquer pourquoi "pour quelqu'un qui veut juste une mise en cache DNS locale" , il doit supprimer le dnsmasqpaquet. alors à quoi echosert la prochaine commande? depuis le dnsmasqsera parti.
xpt
@xpt Tobu suggère de supprimer dnsmasq, mais vous devriez toujours avoir dnsmasq-baseinstallé à cause de NM.
Thalis Kalfigkopoulos
0

Je voulais attribuer un MAC particulier à une adresse IP particulière et, pour des raisons de stabilité, m'en tenir autant que possible au gestionnaire de réseau / dnsmasq par défaut.

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.c contient le commentaire sur l'utilisation de --conf-file pour ignorer les configurations, mais plus loin dans le fichier, nous avons

/* 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);

Sous Ubuntu 16.04 LTS, après avoir configuré un point d'accès Wi-Fi et partagé une autre connexion, ps auxgww | grep dnsmasqmontre que le dernier argument de ligne de commande de chacun des processus dnsmasq est:

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

Ainsi, il est possible de créer des fichiers de configuration dans ce répertoire qui sont partagés entre toutes les invocations de dnsmasq qui sont démarrées par Network Manager.

J'ai créé /etc/NetworkManager/dnsmasq-shared.d/Hue

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

et redémarré, bien qu'en cours d'exécution

sudo service network-manager restart

aurait fonctionné.

Cela a permis à mon appareil d'obtenir l'adresse IP appropriée.

Oui, c'est faux car cela signifie que toutes les invocations de dnsmasq par NetworkManager obtiendront cette déclaration, mais dans ce cas, elle est inoffensive car cela n'a d'importance que si le MAC apparaît sur le réseau en question. Si le réseau n'est pas 192.168.1, il y aura des problèmes.

C'est plus robuste que de remplacer / usr / sbin / dnsmasq par un script comme cela est proposé sur https://gist.github.com/magnetikonline/6236150

La bonne solution serait de modifier la façon dont dnsmasq est invoqué pour utiliser correctement les fichiers de configuration de dnsmasq. Je comprends le désir que Network Manager "fonctionne tout simplement", mais rendre les outils à l'épreuve des idiots signifie que seuls les idiots peuvent les utiliser.

Christopher Brooks
la source
merci pour la réponse Christopher, cependant, je ne suis vraiment pas en mesure de suivre ... "Je voulais attribuer un MAC particulier à une adresse IP particulière et pour des raisons de stabilité" ... "ps auxgww | grep dnsmasq montre que le dernier argument de ligne de commande de chacun des processus dnsmasq " ... " J'ai créé ... aurait fonctionné " ... " Oui, c'est faux " ... C'est-à-dire que je ne peux vraiment pas suivre votre train de pensée , pour donner un sens à ce que vous essayez de dire ici.
xpt
0

Ma solution pourrait briser Network Manager et sa façon de tout faire simple. Avec la manière cassée de NM de gérer dnsmasq, je viens de le remplacer avec ma méthode ci-dessous.

Une solution de contournement au problème consistait simplement à procéder comme suit:

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

Modifiez le ~/dnsmasq.conffichier dans votre répertoire utilisateur comme vous le souhaitez et enregistrez-le.

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

J'ai créé un alias bash simple et je l'ai placé au bas de mon fichier ~ / .bash_aliases pour faciliter la modification du fichier dnsmasq.conf. Voici l'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"

Bien sûr, vous pouvez choisir n'importe quel éditeur à votre convenance pour la deuxième commande sudo dans l'alias, mais j'ai utilisé nano pour plus de facilité pour tout le monde. Enregistrez le fichier, fermez et rouvrez votre onglet / fenêtre de terminal de commande. Cela devrait permettre à l'alias d'être disponible pour les onglets / fenêtres de terminal récemment ouverts.

Exécutez simplement à eddmcpartir de votre compte utilisateur et il vous demandera votre mot de passe pour exécuter les commandes élevées.

Notez que j'ai toujours chattr +ile dossier. C'est ainsi que Network Manager ne remplacera pas votre configuration par la sienne.

Sur les connexions Ethernet filaires, il ne devrait y avoir aucun problème. J'ai découvert depuis que j'utilise dnsmasq pour la mise en cache DNS sur les ordinateurs portables avec sans fil que je dois redémarrer manuellement le service dnsmasq.après la connexion à un point d'accès. Je pense que Network Manager peut effectuer des tâches comme le redémarrage des services lors de la connexion, mais je n'ai pas encore examiné cela.

jpyper
la source
0

Malgré les affirmations contraires ici et ailleurs, NetworkManager ignore complètement tous les fichiers de configuration de dmsmasq - même ceux de son propre répertoire /etc/NetworkManager/dnsmasq-shared.d. La preuve est dans le code source de NetworkManager ... Voici le commentaire pertinent:

/ * dnsmasq peut lire à partir de son emplacement de fichier de configuration par défaut, qui si cet emplacement est un fichier de configuration valide, il se combinera avec les options ici et provoquera des effets secondaires indésirables. Comme envoyer de fausses adresses IP comme passerelle ou autre. Dites donc à dnsmasq de ne pas utiliser de fichier de configuration du tout. * /

Voici le lien vers le code source pertinent (lignes 139-144).

bsalnick
la source
2
Un lien pour pointer vers le code source afin que les lecteurs puissent le valider et lire le code associé serait utile si possible.
jamesc
1
Donc oui, on ne peut pas spécifier de fichier de configuration explicite. --conf-file est codé en dur à / dev / null. Cependant, si vous regardez la ligne de commande complète utilisée pour démarrer dnsmasq via le NetworkManager, vous voyez que conf-dir est utilisé: '/ 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 ', ce qui signifie que tous les fichiers du répertoire donné sont lus.
Hardy