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

64 lines
3.9 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

+++
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](/2022/12/smile_loud.jpg)
<!-- more -->
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.