Comment configurer les adresses IP externes pour les invités LXC?

18

J'explore les fonctionnalités LXC dans Ubuntu 12.04 et je veux vraiment mettre en place un réseau comme celui-ci:

client1:   192.168.56.101/24
lxc-host:  192.168.56.102/24
guest1     192.168.56.201/24
guest2     192.168.56.202/24
guest3     192.166.56.203/24

Je veux juste un réseau "plat" où les invités ont un accès complet au LAN et sont visibles des clients. J'ai l'habitude de mettre en réseau les ponts avec libvirt / KVM, comme décrit ici: http://libvirt.org/formatdomain.html#elementsNICSBridge

Sur l'hôte:

# /etc/network/interfaces
auto br0
iface br0 inet static
    address 192.168.56.102
    netmask 255.255.255.0
    broadcast 192.168.56.255
    bridge_ports eth1

lxc.conf pour le premier invité:

# /var/lib/lxc/guest1/config:
lxc.network.type=veth
lxc.network.link=br0
lxc.network.flags=up
lxc.network.hwaddr=00:16:3e:13:48:4e
lxc.network.ipv4=192.168.56.201/24

Il semble que 192.168.56.201 soit invisible pour le monde extérieur, ce qui n'est pas ce que je veux. On dirait que je dois faire l'une de ces choses:

1) Configurer manuellement le routage sur l'hôte et l'invité

2) Faites quelque chose de hokey ... créez à l'avance des interfaces virtuelles sur l'hôte et configurez les invités pour les utiliser lxc.network.type=phys. Je ne sais pas si cela fonctionnerait réellement.

Je suis concentré sur Ubuntu, mais les réponses pour RHEL / Fedora seraient également utiles ....

twblamer
la source
1
Suivi: j'ai mis br0 en mode promiscuité et il semble faire ce que je veux maintenant. Je suppose que c'est une pratique standard, mais elle n'a été abordée dans aucun des nombreux tutoriels LXC que j'ai lus. Je vais laisser cette question ouverte pendant un certain temps au cas où j'obtiendrais des commentaires ...
twblamer
J'ai fait à peu près la même chose (sauf avec une configuration un peu plus manuelle): script netup dans chaque configuration lxc pour ajouter veth au pont (sur l'hôte), configuration IP manuelle dans chaque conteneur, script / interface supplémentaire dans chaque conteneur à définir le routage (via le transfert ip4 sur l'hôte). Mais, pour autant que je vois, les deux solutions signifient que le conteneur peut définir sa propre adresse IP à peu près n'importe quoi (et l'ajout de l'interface principale de l'hôte à un pont est légèrement gênant). Je suis donc également intéressé par certains commentaires / solutions.
HoverHell

Réponses:

13

C'est à peu près juste, bien qu'il vous manque une ligne comme celle-ci:

lxc.network.ipv4.gateway = X.X.X.X

J'ai un invité LXC fonctionnant sur Debian. Tout d'abord, vous configurez le pont hôte (la manière la plus simple), dans /etc/network/interfaces:

auto wan
iface wan inet static
        address 72.X.X.X
        netmask 255.255.255.0
        gateway 72.X.X.1
        bridge_ports wan_phy    # this line is important.
        bridge_stp off
        bridge_fd 2
        bridge_maxwait 20

Dans votre cas, vous l'avez appelé br0et je l'ai appelé wan. Le pont peut être appelé comme vous voulez. Vous obtenez ce travail d'abord - s'il échoue, examinez avec (par exemple,)brctl

Ensuite, votre configuration LXC est configurée pour rejoindre ce pont:

lxc.utsname = FOO
lxc.network.type = veth
lxc.network.link = wan                  # remember, this is what I call my bridge
lxc.network.flags = up
lxc.network.name = v-wan                # optional, I believe
lxc.network.ipv4 = 72.X.X.Y/24          # different IP than the host
lxc.network.ipv4.gateway = 72.X.X.1     # same as on the host

Comme le note HoverHell, une personne ayant la racine dans le conteneur peut modifier l'adresse IP. Oui. C'est un pont (aka switch Ethernet). Si vous voulez empêcher cela, vous pouvez utiliser des règles de pare-feu sur l'hôte - au moins dans mon cas, les paquets doivent passer par les iptables de l'hôte.

derobert
la source
10
Merci tout le monde. C'est un peu triste, mais je viens de revenir à cela, j'ai trouvé cela sur Google et j'ai oublié que j'étais le demandeur d'origine ...
twblamer
2
@derobert: pas sûr que c'était disponible à l'époque, mais autoc'est aussi une valeur valide pour lxc.network.ipv4.gatewayet, à ma connaissance, par défaut, l'adresse IP du pont auquel l'interface veth est connectée.
0xC0000022L
L'interface de pont nécessite-t-elle sa propre IP? Si wan_phyest face à Internet, alors l'IP du pont devrait être une autre adresse IPv4 publique valide car elle doit être dans le même sous-réseau que les autres adresses IPv4 publiques avec lesquelles je vais configurer mes invités lxc, non? Mais cela semble assez inutile. askubuntu.com/a/884293/394569 suggère que la configuration d'une adresse de pont n'est pas strictement requise.
josch
@josch Dans cet exemple, wan_phy n'a pas d'adresse IP, il est à la place sur le pont. Je doute qu'il ait besoin d'une adresse IP du tout, cependant, si vous ne voulez pas que "l'hôte" ait une adresse IP externe.
derobert
6

Je ne suis pas complètement entré dans LXC,

mais j'ai configuré plusieurs conteneurs avec leurs propres adresses IP statiques dans le LAN qui fournissent des services Internet pour certains de mes sites Web ...

Peut-être que cela peut aider, sur ce que vous voulez pour le vôtre.

Je lance plusieurs conteneurs, comme ça,

SUR LA MACHINE HÔTE J'ai édité le fichier de l'hôte, en ajoutant chaque conteneur et machine hôte: vi / etc / hosts

lxc host machine:   192.168.1.100
container1:   192.168.1.101
container2:     192.168.1.102
container3:   192.168.56.102
container4:   192.166.56.103

après avoir enregistré ...

Encore une fois, sur la machine hôte, j'ai défini le réseau et le pont sur:

# /etc/network/interfaces
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
        **address** 192.168.1.100
        netmask 255.255.255.0
        **network 192.168.1.1**
        **broadcast** 192.168.1.100
        gateway 192.168.1.1
        dns-nameservers 8.8.8.8 8.8.4.4

au-dessus du réseau est mon ip de routeur, pour lan. l' adresse (interne) et la diffusion sont la machine hôte, l'IP interne, que j'utiliserai plus tard un VHOST pour l'accès à Internet, les serveurs Web, le ftp, etc.

POUR LES CONTENEURS LXC 1-4 JE CONFIGURE CONFIG COMME SO:

LXC CONFIG
lxc.network.type=veth
lxc.network.link=br0
lxc.network.flags=up
lxc.network.hwaddr=00:16:3e:13:48:4e
**lxc.network.ipv4=192.168.1.101**

maintenant Container 1 IP = 192.168.1.101

Je répète pour que les conteneurs supplémentaires aient leur propre IP statique sur le LAN.

dans le récipient 1-4,

connectez-vous depuis l'hôte:

lxc-console -n CONTAINERNAME,

& i définit chaque réseau de conteneurs sur statique, eth0 sur:

auto eth0
iface eth0 inet static
        address 192.168.1.101
        netmask 255.255.255.0
        network 192.168.0.0
        broadcast 192.168.1.101
        gateway 192.168.1.1
        dns-nameservers 8.8.8.8 8.8.4.4

CHACUN DES CONTENEURS DISPOSE D'UNE IP, (locale) DISPONIBLE SUR LE LAN. U PEUT SSH CHAQUE IP LOCALE INDIVIDUELLE, POUR TESTER À L'AIDE DE PUTTY!

Après cela, je suis sûr que vous devriez comprendre comment les exécuter via Internet après, par exemple, vhost vers le conteneur ip / équilibreurs de charge / proxy / etc.

Peut-être que cette configuration peut vous aider de toute façon.

M1-Serverz
la source
Si vous configurez l'IP et la passerelle, etc. dans la configuration du conteneur LXC, il n'est pas nécessaire de répéter cela à l'intérieur du conteneur. Définissez plutôt la ifacestrophe sur manual(not staticor dhcp). up, down, dns-nameserversEtc peuvent encore être utilisés dans Debian , etc.
0xC0000022L
1

Je n'ai pas encore joué avec LXC, mais cet article devrait vous aider: configuration réseau à l'aide de ponts Ethernet (vérifiez la méthode 2).

Pour vous donner un indice sur la configuration (je suppose que vous avez déjà br0 correctement configuré):

  1. Vous devez créer une paire de périphériques veth en utilisant ip link add type veth
  2. La commande précédente a créé 2 interfaces virtuelles: veth0 et veth1
  3. Ajoutez maintenant l'interface virtuelle veth0 au pont: brctl addif br0 veth0
  4. dans votre shell lxc, tapez: ns_exec -nm -- /bin/bash
  5. Maintenant, nous devons définir l'autre if virtuel sur l'espace de noms réseau du shell lxc: ip link set veth1 netns PID_OF_LXC_SHELL
  6. Maintenant, en configurant veth1 dans le shell lxc à l'adresse IP que vous voulez (par exemple 192.168.56.201), vous devriez être prêt.
Huygens
la source
Vous ne l'avez pas testé du tout? Vous obtiendrez probablement la prime, mais votre réponse ne m'aide pas du tout et j'ai exactement la même configuration que OP.
Jonas G. Drange
Comment puis-je vous aider davantage? Y avait-il une étape dans ma réponse qui n'a pas fonctionné, ou les avez-vous exécutées et cela n'a pas résolu le problème? Non, comme je l'ai dit dans ma réponse, LXC est sur ma liste de choses à faire, mais je n'ai pas encore commencé de vrais tests.
Huygens