web-dev-qa-db-fra.com

Adresse IP publique du conteneur LXC

Ok, je veux donc savoir comment faire du réseautage sur des conteneurs LXC. Pas simplement le type d'informations vagues que vous obtenez des autres sites Web, mais un véritable guide du débutant pour les faire fonctionner. Comme la plupart des exemples sont essentiellement configurés pour permettre aux utilisateurs de tester, je souhaite exécuter un service sur un ... comme un serveur Web par exemple.

Je suis sous Ubuntu 12.04 LTS et LXC est installé et je peux créer, démarrer et arrêter un conteneur. Mon serveur a évidemment une adresse IP publique et je voudrais savoir comment configurer un conteneur afin qu’il puisse également avoir une adresse IP publique. Puisqu'il semble déjà y avoir un pont en place par rapport à mon conteneur actuel, il me semble que je dois soit donner aux conteneurs une plage DHCP publique afin qu'ils puissent fonctionner, soit attribuer manuellement une adresse IP statique à mon conteneur.

Si je veux affecter de manière statique une adresse IP au conteneur, comment puis-je le faire? Dois-je modifier la configuration de ma passerelle sur l'hôte? Est-il préférable de le faire avec l'option MACVLAN?

Toute aide serait appréciée.

26
user132151

Mon approche suppose que votre serveur possède une seule carte réseau et que vous devez partager cette NIC entre l'hôte et les invités LXC. Cela implique l'utilisation d'un pont. Le pont possède et gère eth0. L'hôte configure maintenant son propre réseau sur br0 au lieu de eth0. Les invités LXC sont configurés pour se connecter au pont.

  1. Sur l'hôte, Sudo apt-get install bridge-utils.

  2. Sur l'hôte, remplacez eth0 par un pont:

    Ceci est dangereux. Corrigez-le et vous risqueriez d’être bloqué sur votre serveur. Assurez-vous d’avoir un login local activé et que l’accès à la console locale fonctionne pour pouvoir annuler cette modification si vous rencontrez un problème.

    Dans /etc/network/interfaces:

    1. Remplacez auto eth0 par auto br0.
    2. Remplacer:

      iface eth0 inet dhcp
      

      avec:

      iface br0 inet dhcp
          bridge_ports eth0
      

      Si vous aviez une configuration réseau statique, alors vous remplaceriez:

      iface eth0 inet static
          address ...
          netmask ...
          gateway ...
          etc.
      

      avec:

      iface br0 inet static
          bridge_ports eth0
          address ...
          netmask ...
          gateway ...
          etc.
      

      Vous changez simplement eth0 pour br0 et vous ajoutez la ligne bridge_ports eth0.

    3. Redémarrez l'hôte. Si vous faites cela localement, alors exécuter Sudo ifdown eth0 avant de commencer, puis Sudo ifup br0 le fera également. Notez que le pont peut prendre un peu de temps à se lever, donc donnez-le cinq minutes après le redémarrage avant de supposer que tout est perdu.

  3. Pour déplacer un conteneur LXC nommé vers une adresse IP publique:

    1. Arrêtez le conteneur.
    2. Sur l'hôte, éditez /var/lib/lxc/container_name/config et remplacez lxc.network.link par br0.
    3. Sur l'hôte, éditez /var/lib/lxc/container_name/rootfs/etc/network/interfaces et configurez votre IP publique comme vous le feriez normalement (DHCP ou une configuration statique si nécessaire). Notez que l'interface s'appelle toujours eth0 du point de vue du conteneur.
    4. Redémarrez le conteneur.
  4. Pour modifier la valeur par défaut des nouveaux conteneurs LXC, éditez /etc/lxc/default.conf sur l'hôte et remplacez lxc.network.link par br0.

  5. Si vous n'avez pas du tout besoin du pont NAT fourni par LXC (c'est-à-dire que tous vos conteneurs utiliseront le nouveau pont à la place), modifiez ensuite /etc/default/lxc de l'hôte et changez le USE_LXC_BRIDGE en "false", puis Exécuter l'hôte Sudo service lxc restart.

23
Robie Basak

J'ai eu le même problème et j'ai cette solution (rapide et sale).

server: eth0 = 10.1.0.77/24
server: lxdbr0 (lxd bridge) = 10.255.255.77/24

container: eth0 = 10.255.255.100/24 (same network as lxdbr0)
container: eth0:0 = 194.99.99.99/28  (public ip address on eth0 alias)

Sur le serveur: route add -Host 194.99.99.99 gw 10.255.255.100 dev lxdbr0

En outre, si nécessaire, ajoutez une route aux routeurs en amont.

Probablement pas la meilleure solution mais ne demande pas beaucoup d'effort! À votre santé.

1
andrea

Robie, merci beaucoup d'avoir posté cette réponse. Je me suis taraudée pour essayer de faire avancer les choses et c'est la seule méthode qui a fonctionné!

Je pensais devoir mentionner quelques points que j'avais découverts afin de clarifier les instructions destinées aux autres administrateurs.

Mon hôte avait plusieurs alias IP statiques attribués à eth0 sur l'invité, par exemple:

iface eth0:1 inet static
  address 5.5.5.5
  netmask 255.255.255.5
  gateway 5.5.5.1
etc.

Maintenant, nous ne voulons pas configurer br0 de la même manière, nous voulons simplement une adresse IP sans alias comme Robie indiqué ci-dessus.

Supposons donc que vous souhaitiez que 5.5.5.5 soit affecté au conteneur debian8.

Éditez /var/lib/lxc/debian8/etc/network/interfaceset ajoutez:

iface eth0 inet static 
      address 5.5.5.5
      netmask 255.255.255.5
      gateway 5.5.5.1
    etc.

Puis émettez cette commande: route add default gw <gateway-ip, in my case 5.5.5.1>

Après cela, redémarrez le conteneur et tout devrait enfin fonctionner! :)

1
Gregory Wolf