Files
BaC/content/2022-12-23-LXC-:-résoudre-localement-les-noms-des-conteneurs.md
2025-02-27 12:52:48 +01:00

3.9 KiB
Raw Blame History

+++ title = "LXC: résoudre localement les noms des conteneurs" date = 2022-12-23 [taxonomies] tags = [ "lxc", "système", "dns" ] +++

Et je vais lappeler systemd. Je suis sûr que tout va bien se passer.

Grand sourire

Alors, je tarrête tout de suite, je nai pas dallergie chronique à systemd. Dans labsolu, je trouve même que cest pas si mal foutu que cela (et on aura loccasion dy revenir un peu plus tard). Alors, oui, il y a aussi des trucs à la con (et pas quun peu dailleurs) mais le simple fait que ça normalise énormément de choses est déjà en soi une bonne idée.

Bref, ce nétait pas tellement le sujet, je voulais surtout parler de LXC et de comment tu peux faire pour résoudre les noms de tes conteneurs directement depuis la machine hôte (pratique quand on doit faire un peu dexpérimentation, du Ansible, des choses comme ça).

Donner un nom de domaine à résoudre

Généralement LXC sous Linux vient avec tout un tas de trucs pour simplifier les choses, et notamment un service qui se nomme lxc-net. Ce dernier est en réalité un «gros» script qui comprend:

  • linitialisation de linterface de bridge qui va permettre aux conteneurs daccéder au monde extérieur (et dêtre accédé aussi)
  • le démarrage dun dnsmasq pour assurer la partie DHCP/résolution de nom

Or il se trouve que ce dnsmasq peut aussi servir pour faire la résolution de nom des machines derrière le bridge en question (en gros, tu vas pouvoir joindre facilement tes conteneurs).

Pour cela, quelques manipulations sont nécessaires. Première chose, il faut aller éditer /etc/default/lxc-net (sous Debian et Archlinux, cest comme ça, je ne sais pas pour les autres). Il faut y ajouter la ligne suivante:

LXC_DOMAIN=lxc.buttse.cx.local

Ça peut être mis nimporte où évidemment. Cela permet dindiquer à lxc-net que lon souhaite que la résolution du service dnsmasq se fasse en lxc.buttse.cx.local (tu peux évidemment mettre nimporte quoi, il ny a pas de limitation particulière a priori).

En redémarrant le service, tu peux constater que tu peux résoudre ces noms en tapant directement sur linterface de bridge:

> dig +short @100.64.4.1 youpi.lxc.buttse.cx.local
100.64.4.94

100.64.4.1 étant ladresse de mon bridge LXC

Voilà, tout ça, cest très bien mais comment tu fais pour que ton hôte (la grosse babasse là) puisse aussi faire cette résolution sans faire trop de contorsion.

Enter systemd

Côté réseau systemd, cest un peu le bordel par contre. Personnellement, étant sous Archlinux, jutilise netctl pour la partie réseau et systemd-resolved pour faire la partie résolution de noms. Pas que je trouve ça particulièrement efficace, mais ça permet de gérer tout un tas de cas tordus à peu près automagiquement (changement de réseaux, VPN, etc…), donc je men contente pour le moment.

Bref, idéalement, on aimerait bien indiquer pour lxc.buttse.cx.local, il faut utiliser le dnsmasq local plutôt que le reste de la chaîne de résolution de noms. Bah il se trouve quon peut (et cest presque pas tordu, tu vas voir). En fait, avec lindicateur DNS= dans /etc/systemd/resolved.conf, on peut préciser plein de trucs: à quel serveur DNS sadresser, mais également sur quelle interface et pour quel domaine. La syntaxe fait un peu peur mais ça marche relativement bien:

[Resolve]
DNS=100.64.4.1%lxcbr0#lxc.buttse.cx.local

Évidemment, rien nempêche den ajouter dautres, séparés par un espace. En redémarrant le service en question, on peut alors faire la résolution sans préciser le serveur DNS:

> dig +short youpi.lxc.buttse.cx.local
100.64.4.94

Et en prime, ça ne perturbe rien dautres. Tu pourrais dailleurs très bien imaginer en ajouter dautres pour KVM, Docker, etc…

Voilà, cest gratuit, cest pour moi.