Macvlan in Docker - Container direkt im Heimnetz mit eigener IP

Macvlan in Docker - Container direkt im Heimnetz mit eigener IP

Manchmal soll ein Container nicht hinter einem Port-Mapping versteckt sein, sondern wie ein normales Gerät im Netzwerk erscheinen — mit eigener IP-Adresse, die andere Geräte direkt ansprechen können. Dafür gibt es Macvlan.

Was Macvlan macht

Bei Standard-Bridge-Netzwerken hat der Container eine interne IP (z. B. 172.17.0.2) und ist von außen nur über Port-Mappings erreichbar. Mit Macvlan bekommt der Container eine eigene MAC-Adresse und eine IP aus dem physischen Netzwerk — für den Router sieht er aus wie ein eigenständiges Gerät.

Typische Anwendungsfälle: Container, der als NAS, DNS-Server (Pi-hole), DLNA-Server oder andere Dienste im Heimnetz fungiert, die direkt über ihre IP erreichbar sein müssen.

Macvlan-Netzwerk erstellen

Voraussetzung: Die physische Netzwerkschnittstelle des Hosts kennen (ip a zeigt sie — oft eth0 oder enp3s0).

docker network create \
  -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  --ip-range=192.168.1.240/28 \
  -o parent=eth0 \
  heimnetz
  • --subnet: das Subnetz des Heimnetzes
  • --gateway: der Router
  • --ip-range: der IP-Bereich, aus dem Docker IPs vergibt (sollte sich nicht mit DHCP überschneiden)
  • parent: die physische Netzwerkschnittstelle

Container mit eigener IP starten

docker run -d \
  --name pihole \
  --network heimnetz \
  --ip 192.168.1.240 \
  -e TZ=Europe/Berlin \
  pihole/pihole:latest

Pi-hole ist jetzt unter 192.168.1.240 im Heimnetz erreichbar — kein Port-Mapping nötig.

Die wichtige Einschränkung: Host kann Macvlan-Container nicht erreichen

Das ist die häufigste Verwunderung beim ersten Macvlan-Setup: Der Host selbst kann die Container im Macvlan-Netzwerk nicht direkt ansprechen. Das ist kein Bug, sondern eine technische Eigenheit von Macvlan.

Workaround: Ein Macvlan-Interface auf dem Host erstellen, das in dasselbe Netzwerk zeigt:

# Host-seitige Macvlan-Schnittstelle
sudo ip link add macvlan0 link eth0 type macvlan mode bridge
sudo ip addr add 192.168.1.241/32 dev macvlan0
sudo ip link set macvlan0 up

# Route zu den Container-IPs über diese Schnittstelle
sudo ip route add 192.168.1.240/28 dev macvlan0

Danach kann der Host die Container erreichen.

Promiscuous Mode

Für Macvlan muss die Netzwerkkarte des Hosts im Promiscuous Mode laufen — sie muss Pakete für MAC-Adressen empfangen, die nicht die eigene sind. Auf physischer Hardware ist das problemlos. Auf VMs oder manchen Cloud-Instanzen muss Promiscuous Mode explizit in den Hypervisor-Einstellungen erlaubt werden (bei VMware, Proxmox, VirtualBox als Option verfügbar).

# Prüfen ob Promiscuous Mode aktiv ist
ip link show eth0 | grep PROMISC

Docker aktiviert Promiscuous Mode für Macvlan automatisch — aber der Hypervisor muss es erlauben.