LXD Container mit MACVLAN vom Host erreichen

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
lxc config edit <container>

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
lxc profile edit 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.

Kommentare anzeigen

Wir nutzen Cookies

Um die Nutzung der Website zu verbessern, nutzen wir Cookies.
Desweiteren werden Google-Dienste für das schalten von Werbung verwendet. Mit der Nutzung der Website geben Sie ihr Einverständnis.
Sollte die Nutzung von Cookies abgelehnt werden, kann dies Auswirkung auf die Nutzung der Website haben.