MacVLAN auf Synology DiskStation richtig konfigurieren

Ich lasse auf meiner Synology Diskstation eine ganze Menge verschiedener Apps und Tools in Docker-Containern laufen. In der Standard-Konfiguration laufen diese alle in einem Bridge-Netzwerk und sind unter der IP-Adresse der Diskstation auf freigegebenen Ports erreichbar. Z.B. wäre ein Webserver-Container dann unter http://<IP-DISKSTATION>:9000 erreichbar und eine weitere Applikation dann http://<IP-DISKSTATION>:9001.

Das wird schnell sehr unübersichtlich. Ich hätte gerne z.B. https://webserver.mein-homelab.com und https://app.mein-homelab.com. Dazu müssen natürlich Ports verwendet werden, die bereits von der Diskstation verwendet werden (wie z.B. 443 in diesem Beispiel).

Um das zu ermöglichen muss jeder Container seine eigene IP-Adresse bekommen. Der MacVLAN-Treiber in Docker erstellt für jeden Container eine virtuelle Netzwerkschnittstelle mit einer eigenen MAC-Adresse auf dem Netzwerk-Interface des Hosts und somit erscheint jeder Container wie ein physisches Gerät im Netzwerk und erhält seine eigene IP.

1 .Vorbereitungen am Gateway/Netzwerk

Ich zeige es hier am Beispiel eines Unifi-Netzwerks wie wir ein eigenes VLAN für unsere Docker-Container erstellen um es anschliessend auf der Diskstation verfügbar zu machen.

Unter «Einstellungen -> Netzwerk» erstellen wir ein neues VLAN mit der VLAN-ID 200.

Übersicht der Netzwerkeinstellungen in der UniFi-Verwaltung, einschließlich des neuen VLANs für Docker-Container.
Einstellung des VLAN im Detail

Im Unteren Bereich der Seite stellen wir sicher, dass Jumbo-Frames aktiviert ist.

Aktivierung von Jumbo-Frames in den globalen Switch-Einstellungen für optimale Netzwerkleistung beim Einsatz von Docker-Containern.

2. Netzwerkschnittstelle(n) in der Diskstation konfigurieren

Nachdem die VLANs im Netzwerk erstellt wurden, können wir nun die Einstellungen im DSM vornehmen. Hat man noch ein freies Interface, kann man dieses jetzt unter «Systemsteuerung -> Netzwerk -> Netzwerkschnittstelle» so konfigurieren:

In meinen Fall habe ich zwar zwei Interfaces, diese sind aber per Link-Aggregation zu einem Bond zusammengefasst. Deshalb müssen wir das getaggte VLAN Interface selbst erstellen. Dies ist leider nicht im UI möglich. Aber die Konfiguration lässt sich ganz einfach direkt in der SSH-Konsole erstellen:

Dazu verbinden wir uns mit per SSH mit der Diskstation und wechseln mit «sudo su -» zum root-Benutzer (ACHTUNG!!! Ab jetzt können wir wirklich etwas kaputt machen. Also vorsichtig sein!)

Die Netzwerk-Konfiguration liegt im Verzeichnis «/etc/sysconfig/network-scripts/»

Da meine Diskstation bereits so konfiguriert ist, das sie im VLAN 250 läuft, sind die beiden Dateien «ifcfg-bond0» und «ifcfg-bond0.250» bereits vorhanden.

  • ifcfg-bond0: ist die Konfiguration des Bond-Interface, das eth0 und eth1 zu einem Interface zusammenfasst.
  • ifcfg-bond0.250: ist die Konfiguration eines getaggten Interfaces mit dem VLAN 250

Wir müssen jetzt eine weitere Konfiguration für VLAN 200 erstellen: dazu kopieren wir einfach die Konfiguration vom bond0.250 mit: cp ifcfg-bond0.250 ifcfg-bond0.200

Anschliessend editieren wir die Datei (z.B. mit vi ifcfg-bond0.200) und ersetzen entsprechend die Werte bei DEVICE, VLAN_ID und IPADDR für unser neues VLAN 200:

DEVICE=bond0.200
VLAN_ROW_DEVICE=bond0
VLAN_ID=200
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.200.10
NETMASK=255.255.255.0
MTU=9000
IPV6INIT=off

Nach den wir die Datei gespeichert haben, starten wir das Netzwerk einmal neu indem wir einmal die Diskstation über das Webinterface rebooten (oder mit «systemctl restart rc-network«).

Anschliessend ergänzen wir im Web-UI die Konfiguration der neuen Schnittstelle:

Die ist notwendig, da einige Felder vom DSM überschrieben werden und sich nicht in der Konfiguration einstellen lassen (war zumindest bei mir so).

Nach einem abschliessenden Reboot überprüfen wir, ob alle Schnittstellen korrekt konfiguriert sind:

Hurra! Beide Interfaces kommen nach einem Neustart direkt mit den korrekten Einstellungen.

3. Docker Netzwerk erstellen

Jetzt können wir das Netzwerk für unsere Container erstellen. Über den eingebauten «Container Manager» geht das leider nicht direkt. Aber das ist kein Problem. Ich installiere es z.B. immer mit dem ersten Container zusammen, den ich grundsätzlich auf meinem NAS laufen lasse. Dazu erstelle ich eine «docker-compose.yaml» für den Container (in meinem Fall ist das Portainer):

name: portainer

networks:
  default_network:
    name: unifi_container_network
    driver: macvlan
    driver_opts:
      parent: bond0.200
      com.docker.network.driver.mtu: 9000
    ipam:
      config:
        - subnet: 192.168.200.0/24
          gateway: 192.168.200.1
          ip_range: 192.168.200.100/24

services:
  portainer-ee:
    ports:
      - 8000:8000
      - 9443:9443
    container_name: portainer
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /volume1/docker-data/portainer/portainer_data:/data
    image: portainer/portainer-ee:2.37.0
    labels:
      - wud.tag.include=^\d+\.\d+\.\d+$$
      - "wud.link.template=https://github.com/portainer/portainer/releases/tag/$${raw}"
      - "wud.display.name=Portainer"
      - "wud.display.icon=sh:portainer-pink"
    networks:
      default_network:
        ipv4_address: 192.168.200.11

In der networks Sektion erstellen wir das MacVLAN Netzwerk. In diesem compose-file ist es später unter «default_network» ansprechbar. Wir geben dem Docker-Netzwerk den Namen «unifi_container_network» (darunter können wir es später für andere Container benutzen).

Für unseren Service wählen wir unter «networks» das default_network aus und geben dem Container mit «ipv4_address» eine feste IP-Adresse.

Wenn wir jetzt das Projekt (so nennt es der DSM Container Manager) starten, sehen wir, das der Container sowohl eine eigene MAC-Adresse hat und auch die zugewiesene IP-Adresse:

4. Container-Netzwerk für weitere Anwendungen verwenden

Bis jetzt haben wir noch nicht so richtig von dem ganzen Aufwand profitiert. Aber warum wir das alles gemacht haben wird im nächsten Beispiel klarer:

services:
  traefik:
    container_name: traefik-reverse-proxy
    # The official v3 Traefik docker image
    image: traefik:v3.6.6
    restart: always
    # Enables the web UI and tells Traefik to listen to docker
    command: 
      - --providers.docker
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /volume1/docker-data/traefik/traefik.yaml:/etc/traefik/traefik.yaml:ro
      - /volume1/docker-data/traefik/conf:/etc/traefik/conf/
      - /volume1/docker-data/traefik/certs:/etc/traefik/certs/
      - /volume1/docker-data/traefik/logs:/var/log/traefik/
    environment:
      - GOMAXPROCS=2
      - CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}
      - CF_API_TOKEN=${CF_API_TOKEN}
    labels:
      # WUD Labels für Traefik Version 3.x Updates
      - "wud.watch=true"
      - "wud.tag.include=^3\\.(\\d+)(\\.(\\d+))?$$"
      - "wud.tag.exclude=.*-rc.*|.*-beta.*|.*-alpha.*"
      - "wud.link.template=https://github.com/traefik/traefik/releases/tag/v$${tag}"
      # Optional: Display-Name für bessere Übersicht
      - "wud.display.name=Traefik Reverse Proxy"
      - "wud.display.icon=sh:traefik"
    networks:
      traefik-network:
        ipv4_address: 192.168.200.250

networks:
  traefik-network:
    name: unifi_container_network
    external: true
  traefik-proxy:
    name: traefik-proxy

Um Traefik optimal verwenden zu können benötigen wir die Ports 80 und 443. Diese sind in der Regel schon von Diensten auf der Diskstation belegt und können nur schwierig bis gar nicht freigeben werden.

Wir verden für Traefik wieder unser bereits erstelltes «unifi_container_network». Der Parameter «external: true» weist an ein bestehendes Docker-Netzwerk zu verwenden. In der Service-Konfiguration weisen wir dieses dem Container zu geben ihm die feste IP-Adresse «192.168.200.250». Jetzt kann Traefik Anfragen direkt über HTTP oder HTTPS entgegen nehmen und wir können alle weiteren Dienste über «schöne» Hostnamen erreichbar machen.

Wie das geht erkläre ich in einem folgenden Artikel.

1 thought on “MacVLAN auf Synology DiskStation richtig konfigurieren”

Leave a Comment