Accéder aux conteneurs LXC depuis des machines virtuelles KVM/QEMU

Bonjour,

Sur mon hôte je dispose de la configuration suivante :

  • Plusieurs conteneurs connectés au bridge généré par lxc-net : lxcbr0
  • Plusieurs machines virtuelles connectés à un bridge que j’ai crée via systemd-netword : br0

J’arrive à “pinger” et à accéder aux conteneurs depuis l’hôte mais pas depuis les machines virtuelles.
J’arrive également à “pinger” et à accéder aux machines virtuelles depuis les conteneurs.

Ci-dessous le fichier /etc/systemd/network/25-bridge-static.network pour br0 :

[Match]
Name=br0

[Network]
Address=192.168.1.2/24
Gateway=192.168.1.1
DNS=192.168.1.1

J’utilise les options par défaut de lxc-net, que l’on retrouve dans /usr/lib/x86_64-linux-gnu/lxc/lxc-net, à savoir :

USE_LXC_BRIDGE="true" 
LXC_BRIDGE="lxcbr0" 
LXC_BRIDGE_MAC="00:16:3e:00:00:00" 
LXC_ADDR="10.0.3.1" 
LXC_NETMASK="255.255.255.0" 
LXC_NETWORK="10.0.3.0/24" 
LXC_DHCP_RANGE="10.0.3.2,10.0.3.254" 
LXC_DHCP_MAX="253" 
LXC_DHCP_CONFILE="" 
LXC_DHCP_PING="true" 
LXC_DOMAIN=""

Je dois avouer que j’ai des connaissances limitées en terme de réseau, et je n’arrive pas à saisir pourquoi je peux accéder aux machines virtuelles depuis les conteneurs, mais pas aux conteneurs depuis les machines virtuelles.

Par avance merci.

Bonjour,

C’est mon cas aussi, mais je crois qu’une piste est à chercher du coté du NAT. Tes deux ponts disposent d’un sous-réseau totalement différent. Tu as dû, je ne sais pas comment, permettre à tes conteneur de communiquer avec tes VM mais pas tes VM avec tes conteneurs.

Je ne sais pas si c’est la méthode la plus efficace, mais je testerais des traceroute depuis les VM vers les conteneurs et puis l’inverse, histoire de voir par où ça passe et où ça bloque.

NB : le réseau n’est vraiment pas mon fort, donc n’hésite pas à attendre des gens plus calés sur le sujet !

IP :

  • Machine virtuelle : 192.168.1.100
  • Conteneur : 10.0.3.27

Depuis le conteneur :

root@nginx:/# traceroute 192.168.1.100
traceroute to 192.168.1.100 (192.168.1.100), 30 hops max, 60 byte packets
1  10.0.3.1 (10.0.3.1)  0.058 ms  0.023 ms  0.028 ms
2  192.168.1.100 (192.168.1.100)  0.124 ms  0.152 ms  0.089 ms

Depuis une machine virtuelle :

root@vm:/# traceroute 10..0.3.27
traceroute to 10.0.3.27 (10.0.3.27), 30 hops max, 60 byte packets
1  192.168.1.1 (192.168.1.1)  0.678 ms  0.823 ms  1.158 ms
2  145.239.153.11 (145.239.153.11)  24.729 ms  26.631 ms  30.740 ms
3  * * *
5  * * *
6  * * *
7  * * *
8  * * *
9  * * *
10  * * *
...

Absolument.
Je ne connais pas les fonctionnalités de bridging des deux solutions et ce qu’elles bridgent vraiment, mais la config LXC attribue en DHCP des adresses manifestement internes à ton réseau de containers donc elles fonctionnent forcément avec un nat sur ta gateway 10.0.3.1.

De leur coté, les VM QEMU, elles, doivent avoir leur carte réseau virtuelle bridgées chacune avec ta carte lan physique, et elles doivent chacune recevoir une adresse en 192.168.1.X distribuée par le serveur DNS de ton LAN physique, donc elles ne passent pas par un nat, elles sont comme si elles étaient branchées chacunes sur le même switch physique que ta machine physique.
[espérant avoir été clair].

Si tu veux bosser dans les deux sens, il doit falloir trouver une config du réseau de containers qui ne passe pas par un nat (je ne sais pas si ça existe, je ne connais pas LXC).

En effet lxcbr0 est un bridge NAT, il faut donc créer une règle iptables qui permettent le transfère de paquet vers l’extérieur.

iptables -t nat -A PREROUTING -i eno0 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.10:80     
iptables -t nat -A PREROUTING -i eno0 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.10:443

10.0.3.10 est l’adresse de mon container Nginx et eno0 l’interface réseau de l’hôte.

Merci pour vos explications !