Keine Netzwerkkonnektivität im LXC-Container, der im „gerouteten“ Modus eingerichtet ist

Keine Netzwerkkonnektivität im LXC-Container, der im „gerouteten“ Modus eingerichtet ist

Ich experimentiere mit lxc/lxd in Vagrant, bin aber ziemlich neu darin. Ich habe es geschafft, einen laufenden Container zu erstellen, aber ich kann von innen nichts anpingen (auch nicht 8.8.8.8). Ich kann seine IP von meinem nicht virtuellen System auf oberster Ebene anpingen, aber es lehnt SSH-Verbindungen ab. Ich kann den Container nur direkt vom Host des direkten Containers (Vagrant) aus aufrufen, indem ich verwende lxc exec my-container /bin/bash.

Ich habe versucht, meinen Container im Modus einzurichten routed, und ich möchte ihn immer noch, zu Lernzwecken. Die LXD/LXC-Dokumentation scheint jedoch etwas mangelhaft zu sein.

Ich habe versucht, dieser Anweisung zu folgen:https://blog.simos.info/wie-bekommt-man-lxd-container-eine-ip-vom-lan-mit-geroutetem-netzwerk/aber bei mir hat es am Ende nicht funktioniert. Ich könnte etwas übersehen haben, da ich mich mit Linux-Netzwerken noch nicht so gut auskenne.

Mein Vagrant-Host läuft auf Ubuntu 20.04.

Mein LXC-Container läuft auf Debian 10.

LXC-Konfiguration auf meinem Vagrant-Host:

config:
  core.https_address: '[::]:8443'
  core.trust_password: true
networks: []
storage_pools:
- config:
    source: /home/luken/lxd-storage-pools
  description: ""
  name: default
  driver: dir
profiles:
- name: default
  config: {}
  description: ""
  devices:
    root:
      path: /
      pool: default
      type: disk
- name: mail-server
  config:
    user.network-config: |
      version: 2
      ethernets:
        eth0:
          addresses:
          - 192.168.33.11/32
          nameservers:
            addresses:
            - 8.8.8.8
            search: []
          routes:
          -   to: 0.0.0.0/0
            via: 169.254.0.1
  description: Mail Server LXD profile
  devices:
    eth0:
      ipv4.address: 192.168.33.11
      nictype: routed
      parent: eth1
      type: nic
cluster: null

ip addrin meinem Vagrant-Host:

luken@luken-tech-test:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:be:4a:e8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 76347sec preferred_lft 76347sec
    inet6 fe80::a00:27ff:febe:4ae8/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:65:e6:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.2/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe65:e628/64 scope link 
       valid_lft forever preferred_lft forever
6: vetha8400046@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:48:28:3e:e4:fa brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 169.254.0.1/32 scope global vetha8400046
       valid_lft forever preferred_lft forever
    inet6 fe80::fc48:28ff:fe3e:e4fa/64 scope link 
       valid_lft forever preferred_lft forever

ip addrin meinem Container:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 9a:14:96:30:67:43 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.33.11/32 brd 255.255.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9814:96ff:fe30:6743/64 scope link 
       valid_lft forever preferred_lft forever

ip rin meinem Vagrant-Host:

default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100 
192.168.33.0/24 dev eth1 proto kernel scope link src 192.168.33.2 
192.168.33.11 dev vetha8400046 scope link

ip rin meinem Container:

default via 169.254.0.1 dev eth0 
169.254.0.1 dev eth0 scope link

Habe ich etwas (wahrscheinlich eine Menge) vergessen?

Antwort1

Damit Ihr Schema funktioniert, sind mehrere Dinge erforderlich:

  1. Überprüfen Sie die Weiterleitung an den Hostschnittstellen: ip -4 netconf show dev vetha8400046und ip -4 netconf show dev eth0. Sie sollten die aktivierte Weiterleitung in der Ausgabe sehen. Andernfalls aktivieren Sie sie mit dem sysctl -w net.ipv4.conf.<iface>.forwarding=1Befehl. Fügen Sie die entsprechenden Zeichenfolgen in die /etc/sysctl.confDatei ein, um sie dauerhaft zu machen.

  2. Überprüfen Sie das Routing auf dem Host: ip -4 route get 8.8.8.8 from 192.168.33.11 iif vetha8400046. Sie sollten die gültige Route über Ihr Standard-Gateway sehen ( ... via 10.0.2.2 dev .... Überprüfen Sie auch die umgekehrte Route mit dem ip -4 route get 192.168.33.11 from 8.8.8.8 iif eth0.

  3. Pingen Sie den Container vom Host aus an und umgekehrt.

  4. Richten Sie das NAT auf dem Host ein: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE. Pingen Sie einen externen Host vom Container aus an. Die Zähler dieser Regel iptables-save -csollten ungleich Null sein.

  5. Stellen Sie die Frage, wenn Sie nicht weiterkommen.

Antwort2

Dies ist die richtige Konfiguration, damit Debian 10-Container in unserem lokalen Netzwerk über ihre eigenen statischen IPs erreichbar sind und Zugriff auf das Internet haben.

Unser Vagrantfile:

Vagrant.configure("2") do |config|

  config.vm.define "main" do |main|
    main.vm.box = "bento/ubuntu-20.04"
    main.vm.box_version = "202010.24.0"
    main.vm.hostname = "lxc-host"

    main.vm.network "public_network", auto_config: false

    main.vm.provision "shell",
      run: "always",
      inline: "ip address add **192.168.1.200**/24 dev eth1"
    main.vm.provision "shell",
      run: "always",
      inline: "ip link set eth1 up"

    main.vm.provider :virtualbox do |vb|
        vb.memory = 1024
    end
  end

end

Beachten Sie, dass wir ein „öffentliches“ Netzwerk einrichten. Das bedeutet, dass Sie beim Starten von Vagrant aufgefordert werden, die zu verwendende Schnittstelle auszuwählen. Wählen Sie die Schnittstelle aus, die Sie für die Verbindung mit Ihrem lokalen Netzwerk verwenden.

Beachten Sie auch, dass wir vorerst nur eine einzige IP einrichten. Dies (192.168.1.200) wird die IP unseres Hosts sein.Wir richten hier keine IP des Containers ein.

Aktivieren Sie nach dem Starten unseres Hosts die IP-Weiterleitung in seiner Konfiguration, indem Sie die Kommentarzeichenfolge entfernen: net.ipv4.ip_forward=1in /etc/sysctl.confund sysctl durch Ausführen neu starten systemctl restart systemd-sysctl.

Vorausgesetzt, dass Sie die Installation und Einrichtung LXDauf dem Host korrekt durchgeführt haben, können Sie die Initialisierung lxdmit der folgenden Konfiguration durchführen:

config:
  core.https_address: '[::]:8443'
  core.trust_password: true
networks: []
storage_pools:
- config:
    source: [path-to-storage-pools-directory]
  description: ""
  name: default
  driver: dir
profiles:
- name: default
  config:
  description: ""
  devices:
    root:
      path: /
      pool: default
      type: disk
- name: test-container
  config:
    user.user-data: |
      #cloud-config
      bootcmd:
        - echo 'nameserver 8.8.8.8' > /etc/resolvconf/resolv.conf.d/tail
        - systemctl restart resolvconf
  description: Mail Server LXD profile
  devices:
    eth0:
      ipv4.address: 192.168.1.201
      nictype: routed
      parent: eth1
      type: nic
cluster: null

Ändern[Pfad zum Speicherpool-Verzeichnis]in den tatsächlichen Pfad zum Verzeichnis, in dem Sie Ihre Pools speichern möchten.

Beachten Sie, dass wir zum Einrichten des Netzwerks nicht Cloud-Init verwenden, da dies mit dem Netzwerkdienst von Debian kollidieren und zu einem Startfehler führen würde.

Beachten Sie auch, dass wir Cloud-Init verwenden, um den Nameserver für die Verwendung durch unseren Gast einzurichten.

192.168.1.201 wird die IP unseres Gastes sein. Dieses Setup setzt voraus, dass das lokale Netzwerk 192.168.1.0 ist. Wenn Ihr Netzwerk anders ist, ändern Sie die IPs entsprechend. Stellen Sie außerdem sicher, dass die hier verwendeten IPs nicht bereits von anderen Geräten im Netzwerk verwendet werden.

Wir verwenden hier zwei Profile, aber es bleibt Ihnen überlassen, wie Sie Ihre Konfiguration organisieren.

Lassen Sie uns nun unseren Container ausführen:

lxc launch images:debian/10/cloud our-actual-test-container --profile default --profile test-container

Es sollte laufen und im lokalen Netzwerk verfügbar sein, aber es hat keinen Zugriff auf das Internet, und das ist der schwierige Teil. Dies wird durch das Routing verursacht, das vom Vagrant/Virtualbox-Netzwerk eingerichtet wurde und auf der lxdAnnahme basiert, dass das Standard-Gateway dasjenige zum Vagrant/Virtualbox-Netzwerk ist. Das müssen wir beheben.

Bei der Ausführung ip rauf dem Host sollten Sie eine Liste mit Routen sehen – etwa so:

default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100 
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.200 
192.168.1.201 dev vethc5cebe03 scope link

Das Problem liegt beim Standardgateway, das den Verkehr in das Vagrant/Virtualbox-Netzwerk leitet, anstatt in unser eigentliches Gateway. Entfernen wir es:

ip route del default via 10.0.2.2

Und fügen wir die Regel hinzu, die Pakete an das eigentliche Gateway unseres lokalen Netzwerks weiterleitet:

ip route add default via 192.168.1.1

(vorausgesetzt, 192.168.1.1 ist die IP unseres lokalen Gateways)

Jetzt wird der Datenverkehr vom Container an das richtige Gateway weitergeleitet und wir sind fertig!

verwandte Informationen