
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 addr
in 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 addr
in 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 r
in 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 r
in 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:
Überprüfen Sie die Weiterleitung an den Hostschnittstellen:
ip -4 netconf show dev vetha8400046
undip -4 netconf show dev eth0
. Sie sollten die aktivierte Weiterleitung in der Ausgabe sehen. Andernfalls aktivieren Sie sie mit demsysctl -w net.ipv4.conf.<iface>.forwarding=1
Befehl. Fügen Sie die entsprechenden Zeichenfolgen in die/etc/sysctl.conf
Datei ein, um sie dauerhaft zu machen.Ü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 demip -4 route get 192.168.33.11 from 8.8.8.8 iif eth0
.Pingen Sie den Container vom Host aus an und umgekehrt.
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 Regeliptables-save -c
sollten ungleich Null sein.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=1
in /etc/sysctl.conf
und sysctl durch Ausführen neu starten systemctl restart systemd-sysctl
.
Vorausgesetzt, dass Sie die Installation und Einrichtung LXD
auf dem Host korrekt durchgeführt haben, können Sie die Initialisierung lxd
mit 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 lxd
Annahme basiert, dass das Standard-Gateway dasjenige zum Vagrant/Virtualbox-Netzwerk ist. Das müssen wir beheben.
Bei der Ausführung ip r
auf 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!