Wie konfiguriere ich externe IP-Adressen für LXC-Gäste?

18

Ich erkunde die LXC-Funktionen in Ubuntu 12.04 und möchte unbedingt ein Netzwerk wie das folgende einrichten:

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

Ich möchte nur ein "flaches" Netzwerk, in dem die Gäste vollen Zugriff auf das LAN haben und für die Kunden sichtbar sind. Ich bin es gewohnt, Netzwerke mit libvirt / KVM zu verbinden, wie hier beschrieben: http://libvirt.org/formatdomain.html#elementsNICSBridge

Auf dem Host:

# /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 für den ersten Gast:

# /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

Es sieht so aus, als wäre 192.168.56.201 für die Außenwelt unsichtbar, was ich nicht will. Scheint, als müsste ich eines der folgenden Dinge tun:

1) Richten Sie das Routing auf dem Host und dem Gast manuell ein

2) Machen Sie etwas Tolles ... erstellen Sie im Voraus virtuelle Schnittstellen auf dem Host und konfigurieren Sie die Gäste so, dass sie diese verwenden lxc.network.type=phys. Ich weiß nicht, ob das wirklich funktionieren würde.

Ich konzentriere mich auf Ubuntu, aber Antworten für RHEL / Fedora wären auch nützlich ...

twblamer
quelle
1
Follow-up: Ich habe br0 auf Promiscuous-Modus gesetzt und es scheint zu tun, was ich jetzt will. Ich denke, dies ist Standardübung, aber in keinem der vielen LXC-Tutorials, die ich durchgelesen habe, wurde darauf eingegangen. Ich lasse diese Frage eine
Weile
Ich habe ungefähr das gleiche getan (außer mit etwas mehr manueller Einrichtung): Netup-Skript in jeder lxc-Konfiguration, um veth zur Bridge hinzuzufügen (auf dem Host), manuelle IP-Einrichtung in jedem Container, zusätzliches Skript / Schnittstelle in jedem Container, um einzustellen up routing (via ip4 forwarding auf dem host). Beide Lösungen bedeuten jedoch, dass der Container die eigene IP-Adresse auf so ziemlich alles setzen kann (und auch das Hinzufügen der primären Schnittstelle des Hosts zu einer Bridge ist etwas unpraktisch). Deshalb bin ich auch an Feedback / Lösungen interessiert.
HoverHell

Antworten:

13

Das ist so ziemlich richtig - obwohl Ihnen eine Zeile wie diese fehlt:

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

Ich habe einen LXC-Gast, der unter Debian läuft. Zuerst richten Sie die Host-Bridge ein (auf einfache Weise) /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

In deinem Fall hast du es genannt br0und ich habe es genannt wan. Die Brücke kann beliebig benannt werden. Das funktioniert zuerst - wenn es fehlschlägt, untersuchen Sie es mit (z. B.)brctl

Dann ist Ihre LXC-Konfiguration so eingerichtet, dass sie dieser Bridge beitritt:

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

Wie HoverHell feststellt, kann jemand mit root im Container die IP-Adresse ändern. Ja. Es ist eine Brücke (auch Ethernet-Switch genannt). Wenn Sie dies verhindern möchten, können Sie Firewall-Regeln auf dem Host verwenden - zumindest in meinem Fall müssen die Pakete die Iptables des Hosts durchlaufen.

derobert
quelle
10
Vielen Dank an alle. Es ist irgendwie traurig, aber ich bin gerade darauf zurückgekommen, habe es über Google herausgefunden und habe vergessen, dass ich der ursprüngliche Fragesteller war ...
twblamer
2
@derobert: Ich bin mir nicht sicher, ob dies damals verfügbar war, aber es autoist auch ein gültiger Wert für lxc.network.ipv4.gatewayund nach meinem Verständnis wird standardmäßig die IP der Bridge verwendet, mit der die Veth-Schnittstelle verbunden wird.
0xC0000022L
Benötigt die Bridge-Schnittstelle eine eigene IP? Wenn Sie wan_phymit dem Internet konfrontiert sind, muss die Bridge-IP eine weitere gültige öffentliche IPv4-Adresse sein, da sie sich im selben Subnetz wie die anderen öffentlichen IPv4-Adressen befinden muss, mit denen ich meine lxc-Gäste konfigurieren werde, oder? Aber das scheint ziemlich verschwenderisch. askubuntu.com/a/884293/394569 schlägt vor, dass die Konfiguration einer Bridge-Adresse nicht unbedingt erforderlich ist.
Josef
@josch In diesem Beispiel hat wan_phy keine IP, sondern befindet sich stattdessen auf der Bridge. Ich bezweifle, dass es überhaupt eine IP braucht, wenn der "Host" keine externe IP haben soll.
Derobert
6

Ich bin noch nicht vollständig in LXC eingestiegen.

Ich habe jedoch mehrere Container mit eigenen statischen IP-Adressen im LAN eingerichtet, die Internetdienste für einige meiner Websites bereitstellen.

Vielleicht kann das helfen, was Sie für Ihr wollen.

Ich betreibe mehrere Container, wie so,

AUF HOST-MASCHINE Ich habe die Datei des Hosts bearbeitet und jeden Container und jede Host-Maschine hinzugefügt: 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

nach dem Speichern ...

Auch hier habe ich auf dem Host-Rechner Netzwerk & Bridge auf Folgendes eingestellt:

# /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

über dem netz ist meine router ip, für lan. (interne) Adresse & Broadcast ist der Hostrechner, die interne IP, die ich später als VHOST für den Internetzugang, Webserver, FTP usw. verwende.

FÜR LXC-CONTAINER 1-4 I SETUP CONFIG LIKE 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**

jetzt Container 1 IP = 192.168.1.101

Ich wiederhole für zusätzliche Container, um dort eine eigene statische IP auf dem LAN zu haben.

in Behälter 1-4,

vom Host aus einloggen:

lxc-console -n CONTAINERNAME,

& Ich setze jedes Containernetzwerk auf statisch, eth0 auf:

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

JEDER CONTAINER HAT EIGENE IP (lokal), DIE IM LAN VERFÜGBAR IST. U KANN JEDES INDIVIDUELLE LOKALE IP SSH, UM UNTER VERWENDUNG VON PUTTY ZU TESTEN!

Danach bin ich mir ziemlich sicher, dass du herausfinden solltest, wie man sie über das Internet ausführt, nachdem zum Beispiel vhost die IP-Adresse / Load Balancer / Proxy / etc.

Vielleicht kann dieses Setup trotzdem helfen.

M1-Serverz
quelle
Wenn Sie die IP-Adresse und das Gateway usw. in der LXC-Containerkonfiguration konfigurieren, müssen Sie dies nicht im Container wiederholen. Setzen Sie stattdessen die ifaceZeilengruppe auf manual(not staticor dhcp). up, down, dns-nameserversEtc. kann nach wie vor in Debian usw. verwendet werden
0xC0000022L
1

Ich habe noch nicht mit LXC gespielt, aber dieser Artikel soll Ihnen helfen: Netzwerkkonfiguration mit Ethernet-Bridges (überprüfen Sie Methode 2).

Um Ihnen einen Hinweis zur Konfiguration zu geben (ich gehe davon aus, dass Sie br0 bereits richtig konfiguriert haben):

  1. Sie müssen ein Paar veth-Geräte mit erstellen ip link add type veth
  2. Der vorherige Befehl hat zwei virtuelle Schnittstellen erstellt: veth0 und veth1
  3. Fügen Sie nun die virtuelle Schnittstelle veth0 zur Bridge hinzu: brctl addif br0 veth0
  4. Geben Sie in Ihre LXC-Shell Folgendes ein: ns_exec -nm -- /bin/bash
  5. Jetzt müssen wir das andere virtuelle if auf den Netzwerk-Namespace der lxc-Shell setzen: ip link set veth1 netns PID_OF_LXC_SHELL
  6. Wenn Sie nun veth1 in der lxc-Shell auf die gewünschte IP-Adresse konfigurieren (z. B. 192.168.56.201), sollten Sie alle Einstellungen vornehmen.
Huygens
quelle
Sie haben das noch gar nicht getestet? Sie werden wahrscheinlich das Kopfgeld bekommen, aber Ihre Antwort hilft mir überhaupt nicht und ich habe genau das gleiche Setup wie OP.
Jonas G. Drange
Wie kann ich Ihnen weiterhelfen? Gab es einen Schritt in meiner Antwort, der nicht funktioniert hat, oder haben Sie sie ausgeführt und das Problem dadurch nicht gelöst? Nein, wie in meiner Antwort gesagt, ist LXC auf meiner Wunschliste, aber ich habe noch nicht mit echten Tests begonnen.
Huygens