Um meinen Containern eine IP Adresse aus dem DHCP Bereich des LANs zuzuweisen, kann man die Netzwerkkonfiguration auf MacVLan stellen. Das hat aber zur Folge, dass man keine Netzwerkverbindung zwischen Host und Container mehr herstellen kann.
In diesem Artikel erkläre ich, wie man dieses Problem mit einem zweiten Interface umgehen kann.
LXD Profil erstellen
Als Erstes erstellt man ein neues LXD Profil oder kopiert eine bestehende Vorlage.
lxc profile create macvlanbridge
# oder
lxc profile copy macvlan macvlanbridge
In diesem Profil erstellen wir zwei Interfaces. ETH0 und ETH10. Ich habe das zweite ETH10 genannt, da das Interface in den Containern standardmäßig ETH1 heißt, auch wenn es an ETH0 des Hosts gekoppelt wird.
Sollte man doch ETH0 und ETH1 nutzen wollen, muss man in der Configuration jedes Container prüfen ob die Zuordnung richtig ist.
lxc config edit <container>
#falsch
volatile.eth0.name: eth1
volatile.eth1.name: eth1
#richtig
volatile.eth0.name: eth0
volatile.eth10.name: eth1
Die Brücke LXBR0 wird standardmäßig bei der Installation von LXD erstellt.
Das fertige Profil sieht dann wie folgt aus.
config: {}
description: ""
devices:
eth0:
nictype: macvlan
parent: eth0
type: nic
eth10:
nictype: bridged
parent: lxbr0
type: nic
root:
path: /
pool: default
type: disk
name: macvlanbridge
Profil zuweisen
Nun müssen wir das Profil zuweisen. Entweder bei der Erstellung eines Containers
lxc launch ubuntu:20.04 -p macvlanbridge c1
oder bei einem bestehenden Container
lxc profile apply c1 macvlanbridge
DHCP aktivieren
Bei Ubuntu ist standardmäßig nur auf einem Interface DHCP aktiviert. Dadurch bekommt unser Bridge-Interface keine IP Adresse. Dies ändern wir in der Netplan Config. Diese liegt unter /etc/netplan/
und heißt z.B. 50-cloud-init.yaml
. Wenn die Config anders heißt ist das nicht schlimm.
network:
version: 2
ethernets:
eth0:
dhcp4: true
eth1:
dhcp4: true
Natürlich können statt DHCP Adressen auch statisch Adressen vergeben werden.
Danach müssen die Änderungen angewendet werden.
sudo netplan apply
Nun sollten beide Interfaces eine IP bekommen. Das erste eine IP aus dem DHCP des LANs und das zweite aus dem Bereich der LXBR0.
Das kann wie folgt überprüft werden.
ip a
Host Route
Nun müssen wir den Host noch anweisen, für die Container das Bridgeinterface zu nutzen. Dafür ist es wichtig, dass alle Container im gleichen Subnetz liegen. In diesem Subnetz sollten auch nur die Container sein, andernfalls muss für jeden Container eine eigene Route angegeben werden.
# Alle Container im Bereich 10.0.0.1-10.0.0.255
ip route add 10.0.0.0/24 dev lxbr0
# optional
# Einzelen Route für Container 10.0.0.16
ip route add 10.0.0.16/32 dev lxbr0
Dadurch wird jeglicher Traffic mit dem entsprechenden Zielsubnet an dem Interface LXBR0 ausgegeben.
Die Container sind nun über die DHCP-Adresse des LANs erreichbar.
Testen
Nun sollte alles funktionieren. Zum testen kann ein ping an die LAN-IP-Adresse gesendet werden. Alternativ kann auch im Container ein Webserver (Apache2 oder NGINX) installiert werden und die Website mit CURL vom Host aufgerufen werden. Bekommt man eine Antwort, hat alles funktioniert.