Öffentliche IP-Adresse für LXC-Container

26

Ok, ich möchte wissen, wie man auf LXC-Containern vernetzt. Nicht nur die vagen Informationen, die Sie von den anderen Websites erhalten, sondern auch eine echte Anleitung für Anfänger, um sie zum Laufen zu bringen. Da die meisten Beispiele im Wesentlichen für Testzwecke eingerichtet sind, möchte ich einen Dienst für einen ... wie einen Webserver zum Beispiel.

Ich verwende Ubuntu 12.04 LTS und habe LXC installiert und kann einen Container erstellen, starten und stoppen. Mein Server hat offensichtlich eine öffentlich zugängliche IP und ich möchte wissen, wie man einen Container einrichtet, damit auch er eine öffentliche IP haben kann. Da anscheinend bereits eine Brücke zu meinem aktuellen Container vorhanden ist, muss ich den Containern entweder einen öffentlichen DHCP-Bereich zuweisen, damit sie arbeiten können, oder meinem Container manuell eine statische IP-Adresse zuweisen.

Wie kann ich dem Container eine statische IP zuweisen? Muss ich Änderungen an meiner Bridge-Konfiguration auf dem Host vornehmen? Ist es eigentlich besser, es mit der MACVLAN-Option zu tun?

Jede Hilfe wäre dankbar.

user132151
quelle
Ich bin nicht mit LXC vertraut, aber Ihr typischer ISP wird Ihnen nur eine öffentliche IP-Adresse geben. Haben Sie ein Paket mit mehreren statischen IPS?
Wlraider70
Öffentlich zugängliche IPs sind nicht der einzige Anwendungsfall. Wir möchten, dass unseren Load-Balancer-Containern zwei öffentliche IPs zugewiesen werden. Wir möchten jedoch dedizierte LAN-IPs für eine Vielzahl anderer Dienste. Auf diese Weise ist das Verschieben von Containern auf unterschiedlicher Hardware so einfach wie das Verschieben der IP (DNS funktioniert in dieser Hinsicht für einige der von uns verwendeten Komponenten nicht)
David Parks

Antworten:

23

Mein Ansatz geht davon aus, dass Ihr Server eine einzige Netzwerkkarte hat und Sie diese Netzwerkkarte zwischen dem Host und den LXC-Gästen teilen müssen. Dies beinhaltet die Verwendung einer Brücke. Die Brücke besitzt und verwaltet eth0. Der Host konfiguriert nun seine eigene Vernetzung auf br0statt eth0. Die LXC-Gäste sind für die Verbindung mit der Bridge konfiguriert.

  1. Auf dem Host sudo apt-get install bridge-utils.

  2. Ersetzen Sie auf dem Host durch eth0eine Brücke:

    Das ist gefährlich. Wenn Sie dies falsch verstehen, können Sie von Ihrem Server ausgeschlossen werden. Stellen Sie sicher, dass eine lokale Anmeldung aktiviert ist und der lokale Konsolenzugriff funktioniert, damit Sie diese Änderung bei Problemen rückgängig machen können.

    In /etc/network/interfaces:

    1. Ersetzen auto eth0durch auto br0.
    2. Ersetzen:

      iface eth0 inet dhcp
      

      mit:

      iface br0 inet dhcp
          bridge_ports eth0
      

      Wenn Sie eine statische Netzwerkkonfiguration hätten, würden Sie Folgendes ersetzen:

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

      mit:

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

      Sie ändern nur eth0für br0und das Hinzufügen der bridge_ports eth0Linie.

    3. Starten Sie den Host neu. Wenn Sie dies lokal tun, müssen sudo ifdown eth0Sie vor und sudo ifup br0nach dem Start ausführen. Beachten Sie, dass das Hochfahren der Bridge einige Zeit dauern kann. Geben Sie sie daher fünf Minuten nach dem Neustart ein, bevor Sie davon ausgehen, dass alles verloren ist.

  3. So verschieben Sie einen angegebenen benannten LXC-Container auf eine öffentliche IP:

    1. Stoppen Sie den Behälter.
    2. Bearbeiten und ändern Sie auf dem Host zu ./var/lib/lxc/container_name/configlxc.network.linkbr0
    3. Bearbeiten und konfigurieren Sie auf dem Host Ihre öffentliche IP-Adresse wie gewohnt (DHCP oder eine statische Konfiguration nach Bedarf). Beachten Sie, dass die Schnittstelle aus Sicht des Containers weiterhin aufgerufen wird ./var/lib/lxc/container_name/rootfs/etc/network/interfaceseth0
    4. Starten Sie den Container neu.
  4. Wenn Sie die Standardeinstellung für neue LXC-Container ändern möchten, bearbeiten Sie sie /etc/lxc/default.confauf dem Host und ändern Sie sie lxc.network.linkin br0.

  5. Wenn Sie die von LXC bereitgestellte NAT-Bridge überhaupt nicht benötigen (dh alle Ihre Container verwenden stattdessen die neue Bridge), bearbeiten /etc/default/lxcund ändern Sie USE_LXC_BRIDGEsie "false"auf dem Host und führen Sie sie dann aus sudo service lxc restart.

Robie Basak
quelle
Vielen Dank! Es gibt viele ähnliche Fragen. Aber diese Antwort hat mir endlich geholfen, Dinge zum Laufen zu bringen.
Mausy5043
1

Robie, vielen Dank, dass du diese Antwort gepostet hast. Ich habe versucht, alles in Ordnung zu bringen, und das war die einzige Methode, die funktioniert hat!

Ich dachte, ich sollte ein paar Dinge erwähnen, die ich herausgefunden habe, um die Anweisungen für andere Administratoren zu klären.

Mein Host hatte auf dem Gast mehrere statische IP-Aliase, die eth0 zugewiesen waren, zum Beispiel:

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

Jetzt wollen wir br0 nicht so einrichten, wir wollen nur eine IP ohne Aliase wie Robie, wie oben angegeben.

Nehmen wir also an, Sie möchten, dass 5.5.5.5 dem Container debian8 zugewiesen wird.

Bearbeiten /var/lib/lxc/debian8/etc/network/interfacesund hinzufügen:

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

Dann geben Sie diesen Befehl ein: route add default gw <gateway-ip, in my case 5.5.5.1>

Danach starten Sie den Container neu und alles sollte endlich funktionieren! :)

Gregory Wolf
quelle
1

Ich hatte das gleiche Problem und ich habe diese Lösung (schnell und schmutzig).

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)

Auf dem Server: route add -host 194.99.99.99 gw 10.255.255.100 dev lxdbr0

Fügen Sie bei Bedarf auch Route zu Upstream-Routern hinzu.

Wahrscheinlich nicht die beste Lösung, erfordert aber keinen großen Aufwand! Prost.

andrea
quelle