Adguard in Docker mit IPv4 und IPv6

shirocko

Cadet 2nd Year
Registriert
Juni 2012
Beiträge
27
Hallo zusammen,

ich versuche aktuell auf meinem Raspi 4 innerhalb einer Docker Installation ein Adguard aufzusetzen.
Soweit klappt auch zunächst alles. Allerdings möchte ich den Container nicht nur mit der IPv4 Adresse ansprechen, sondern auch mit einer IPv6 Adresse, damit ich in meiner FritzBox auch die IPv6 DNS Adresse auf Adguard ändern kann.

Im folgenden kurz, welchen Fortschritt ich bereits erzielt habe und wo es noch hakt.
Ich möchte Adguard gerne als Stack aufsetzen im Portainer, also quasi mittels docker compose Definition.
Der aktuelle Stack dafür sieht derzeit wie folgt aus:

Code:
---
version: "2.1"

services:
  adguard:
    container_name: adguard
    image: adguard/adguardhome
    ports:
      - 53/tcp
      - 53/udp
      - 80/tcp
      - 3000/tcp
      - 67/udp
      - 68/tcp
      - 68/udp
      - 443/tcp
      - 853/tcp
    volumes:
      - adguard_work:/opt/adguardhome/work
      - adguard_conf:/opt/adguardhome/conf
    networks:
      docker_macvlan:
        ipv4_address: 192.168.1.250 # this IP will show as a device on your router
        ipv6_address: fdd3:4ddf:faef::250
      docker_vlan_bridge:
        ipv4_address: 192.168.10.250 # Pick same last numbers as macvlan and use "vlan bridge subnet" (10)
    restart: unless-stopped

# Here we define what networks are available to use by the services above
# Make sure to set the config of both macvlan and vlan_bridge as described in the guide.
networks:
  docker_macvlan:
    name: docker_macvlan
    driver: macvlan
    enable_ipv6: true
    driver_opts:
      parent: eth0
    ipam:
      config:
        - subnet: 192.168.1.0/24 # Set to same subnet as your router and other devices
          ip_range: 192.168.1.224/27 # Available range from 192 to 224.
          gateway: 192.168.1.1 # This is your router IP
        - subnet: fdd3:4ddf:faef::/64
          gateway: fdd3:4ddf:faef::1

  docker_vlan_bridge:
    name: docker_vlan_bridge
    driver: bridge
    enable_ipv6: false
    ipam:
      config:
        - subnet: 192.168.10.0/24 # subnet for all containers
          ip_range: 192.168.10.224/27 # for easier use, set to same range as under macvlan (192 to 224 here)
          gateway: 192.168.10.1 # for easier use, set to same last number as your router

# Here we define where to save the files that live outside the container
# Located under /var/lib/docker/volumes
volumes:
  adguard_work:
    name: adguard_work
  adguard_conf:
    name: adguard_conf

Das IPv6 Subnet fdd3:4ddf:faef::/64 habe ich beliebig gewählt und mir online generieren lassen.
Aus einem Tutorial habe ich das "docker_vlan_bridge" Netz entnommen, welches zur Kommunikation mit dem Host (Raspi) dient.

Auf der OS-Ebene des Raspi habe ich folgendes Skript hinterlegt:
Bash:
#!/bin/bash
sudo ip link add dockerconnector link eth0 type macvlan mode bridge
sudo ip addr add 192.168.1.254/32 dev dockerconnector
sudo ip addr add fdd3:4ddf:faef::254/64 dev dockerconnector
sudo ip link set dockerconnector up
sudo ip route add 192.168.1.224/27 dev dockerconnector
sudo ip route add fdd3:4ddf:faef::/64 dev dockerconnector

Dieses Skript wird mittels systemd automatisch beim Systemstart ausgeführt und erstellt ein Bridge Macvlan Netzwerk für die Kommunikation zwischen Host (Raspi) und dem Docker Container (Adguard).

Die Kommunikation mittels IPv4 funktioniert auch wunderbar, nur IPv6 will nicht so recht.
Vom Docker Host aus kann ich die Adresse fdd3:4ddf:faef::250 pingen.
Vom Container aus geht ein Ping auf fdd3:4ddf:faef::1 jedoch nicht.
Von einem anderen Rechner im LAN geht ein Ping auf die fdd3:4ddf:faef::250 auch nicht.

Des Weiteren frage ich mich, ob ich das "docker_vlan_bridge" Netzwerk benötige bzw. ob ich dort nicht auch die 192.168.1.254 als Adresse nutzen kann, wie beim der macvlan Bridge auf Raspi OS Ebene?

Eventuell kann mir hier jemand die Augen öffnen, an welcher Stelle ich gedanklich falsch abgebogen bin.

Vielen Dank im Voraus,
shirocko
 
Wo hast du das denn her? Wenn du schon fragst ob du macvlan benötigst, nein, dann benötigst du es nicht. Vielleicht solltest du dich generell erst einmal etwas in Docker einlesen, gibt da sehr gute Videos auf YouTube zu.
 
Ich hab macvlan auf meinem Unraid mit AdGuard DNS angeschaltet, damit der Docker von Adguard eine eigene Mac bekommt, im Router habe ich ULA (IpV6 Unique Local Adress) an und diese Adresse (!) dann als DNS eingetragen, das läuft (kleiner Workaround weil Speedport keine internen DNS per DHCP kann). Der AdGuard muss halt lokal eine IP vom Router bekommen, da irgendwas zwischen zu setzen, geht nicht., Lass den Docker doch eine echte IP vom Router beziehen oder vergib eine außerhalb des DHCP.
Was sagt denn die AdGuard Einrichtungsseite welche IPs er hat?

Vielleicht kannst bringt dir das was. Hab ich auch erst vor paar Tagen zum Laufen gebracht.
 
Wenn der DNS nur fürs LAN ist würde ich mir IPv6 sparen und einfach die IPv6 DNS Adresse in der FritzBox deaktivieren. Habe ich bei mir auch so gemacht.

Bei mir bereitet Docker zusammen mit IPv6 jedes Mal nur Kopfzerbrechen. Wenns also nicht unbedingt notwendig ist, so wie es für mich in deinem Fall scheint, lass es gut sein.
 
Donnidonis schrieb:
Wo hast du das denn her? Wenn du schon fragst ob du macvlan benötigst, nein, dann benötigst du es nicht. Vielleicht solltest du dich generell erst einmal etwas in Docker einlesen, gibt da sehr gute Videos auf YouTube zu.
Ein macvlan an sich benötige ich schon, zumindest auf Linux OS Ebene, damit der Host (Raspi) auch auf die IP des Adguard im Container zugreifen kann und diesen selbst für die Namensauflösung nutzen kann.
Ich habe temporär das eingerichtete macvlan auf dem Host entfernt und anschließend konnte ich die 192.168.1.250 des Containers nicht mehr pingen. Soweit ja auch logisch.

Ich habe den Stack nun von der zusätzlichen bridge und allen IPv6 Parametern bereinigt, nun sieht er wie folgt aus:
Code:
---
version: "2.1"

services:
  adguard:
    container_name: adguard
    image: adguard/adguardhome
    ports:
      - 53/tcp
      - 53/udp
      - 80/tcp
      - 3000/tcp
      - 67/udp
      - 68/tcp
      - 68/udp
      - 443/tcp
      - 853/tcp
    volumes:
      - adguard_work:/opt/adguardhome/work
      - adguard_conf:/opt/adguardhome/conf
    networks:
      docker_macvlan:
        ipv4_address: 192.168.1.250 # this IP will show as a device on your router
    restart: unless-stopped

# Here we define what networks are available to use by the services above
# Make sure to set the config of both macvlan and vlan_bridge as described in the guide.
networks:
  docker_macvlan:
    name: docker_macvlan
    driver: macvlan

    driver_opts:
      parent: eth0
    ipam:
      config:
        - subnet: 192.168.1.0/24 # Set to same subnet as your router and other devices
          ip_range: 192.168.1.224/27 # Available range from 192 to 224.
          gateway: 192.168.1.1 # This is your router IP

# Here we define where to save the files that live outside the container
# Located under /var/lib/docker/volumes
volumes:
  adguard_work:
    name: adguard_work
  adguard_conf:
    name: adguard_conf

Das Problem dabei ist nun, dass der Container gar keine IPv6 Adresse mehr bezieht.
Wenn ich den Parameter "enable_ipv6: true" einfüge, dann startet der Stack nicht mit dem Fehler:
failed to deploy a stack: Network docker_macvlan Creating Network docker_macvlan Error failed to create network docker_macvlan: Error response from daemon: could not find an available, non-overlapping IPv6 address pool among the defaults to assign to the network
Ich möchte IPv6 grundsätzlich verwenden, da ich es für den richtigen Weg in die Zukunft halte und ich habe auch einen IPv6 fähigen Anschluss. Nur weil es bequemer ist mit IPv4 zu fahren, muss man ja nicht zwangsläufig immer den einfachsten Weg gehen :-)
Ich bin ja auch hier, um mein Wissen auszubauen und dazu gehört auch das Thema IPv6.

arvan schrieb:
Ich hab macvlan auf meinem Unraid mit AdGuard DNS angeschaltet, damit der Docker von Adguard eine eigene Mac bekommt, im Router habe ich ULA (IpV6 Unique Local Adress) an und diese Adresse (!) dann als DNS eingetragen, das läuft (kleiner Workaround weil Speedport keine internen DNS per DHCP kann). Der AdGuard muss halt lokal eine IP vom Router bekommen, da irgendwas zwischen zu setzen, geht nicht., Lass den Docker doch eine echte IP vom Router beziehen oder vergib eine außerhalb des DHCP.
Genau so stelle ich es mir auch vor. Siehst du im Unraid, wie konkret die Config bzw. der Docker Befehl aussieht zum Ausführen des Containers inkl. der Erstellung des IPv6 macvlan Netzes?

Vielen Dank
shirocko
 
shirocko schrieb:
Ein macvlan an sich benötige ich schon, zumindest auf Linux OS Ebene, damit der Host (Raspi) auch auf die IP des Adguard im Container zugreifen kann und diesen selbst für die Namensauflösung nutzen kann.
Wieso benötigst du dafür ein macvlan? Der Raspi kann einfach localhost nutzen und fertig. Dann kannst du auch auf AdGuard zugreifen. Wieso möchtest du dem AdGuard eine eigene IP verpassen und nicht die vom Raspi nehmen?
 
Weil auf dem Raspi noch mehr Docker Container laufen und diverse Ports sonst im Konflikt stehen.
Wenn der Container eine eigene IP Adresse hat, habe ich auch keine Portkonflikte und damit auch einen sicher ansprechbaren DNS Server unter einer festen IP.
 
Ich hab einfach mal versuchsweise das Setup 1:1 wie im Link angegeben durchgeführt und sogar die IP Adresse identisch gewählt.
Wenn ich nun nach der Einrichtung auf Port 3000, wo alle IP Adressen angezeigt werden, die normale Oberfläche aufrufen möchte, so ist sie nur über IPv4 vom meinem Rechner erreichbar.
Das Netz fd59:c039:d3b8::/64 wird ja vermutlich nicht ohne weiteres von jedem Rechner im LAN erkannt werden. Wo muss ich dann ggf. noch ein Routing hinzufügen, damit das Netz zumindest einmal bekannt ist?

Auch eine statische Route in der FritzBox ändert nichts daran:
1704660450843.png
 
Wie in der Anleitung auf der Seite https://aschmid-it.com/en/adguard-home-on-docker-with-ipv6/ schon schön beschrieben hat es ja seine Gründe, warum man für PiHole oder Adguard ein MACVLAN anlegt.
Ich zitiere mal:
The simplest way to run a docker container is to use the host network. For AdGuardHome this is sometimes not desired as it uses default ports, like port 53, that might already be used by the host system. Especially on Ubuntu port 53 is per default used by the DNS Stubresolver and in order to get AdGuard Home working this needs to be disabled.

To avoid all this problem I am creating a own docker network using the macvlan driver so the host is visible as a host on the local network.

Im Container erhalte ich neben der IPv6, die ich selbst angegeben habe noch eine fd00:: Adresse und eine 2a02:: Adresse, scheinbar direkt vom Router.
Unter diesen beiden Adressen bekomme ich Adguard auch mit IPv6 aufgerufen.
Grundsätzlich könnte ich jetzt auch diese nehmen, aber die 2a02:: Adresse dürfte die global erreichbare Adresse sein. Diese möchte ich nicht verwenden, da sie der Prefix zum einen regelmäßig ändern wird und zum anderen soll Adguard ja lokal angesprochen werden und nicht "von außen".
Bei der zweiten Adresse aus dem Bereich fd00::/64 bin ich mir unsicher, ob diese Adresse sich auch dynamisch ändert, oder ob diese fix vom Router immer vergeben werden wird.

Daher ist es mir auch nicht ganz klar, warum ich nicht durch die vergabe einer statischen IPv6 Adresse über ein MACVLAN Netz in Docker diese am Ende auch erreichen kann.
Ich meine natürlich sind alle anderen Rechner im fd00::/64 Netz und der Container im fd59:c039:d3b8::/64, aber die statische Route in der FritzBox sollte dann doch eigentlich die Netze verbinden bzw. mich dort hin leiten.
 
shirocko schrieb:
Wenn ich nun nach der Einrichtung auf Port 3000, wo alle IP Adressen angezeigt werden, die normale Oberfläche aufrufen möchte, so ist sie nur über IPv4 vom meinem Rechner erreichbar.
Und wie hast du das für IPv4 gemacht? Gibt es da auch eine statische Route?

shirocko schrieb:
Bei der zweiten Adresse aus dem Bereich fd00::/64 bin ich mir unsicher, ob diese Adresse sich auch dynamisch ändert, oder ob diese fix vom Router immer vergeben werden wird.
Die bleibt statisch. Die ist exakt für deinen Anwendungsfall gedacht. Du musst nur dafür sorgen, dass die Fritzbox das Prefix dauerhaft verteilt. Das kann man deaktivieren.
 
riversource schrieb:
Und wie hast du das für IPv4 gemacht? Gibt es da auch eine statische Route?
Ich habe einen Netzbereich 192.168.1.224/27 für Docker Container reserviert, welcher nicht im DHCP Bereich des Routers liegt. Die .250 habe ich statisch dem Container zugewiesen. Ein Routing ist hier nicht notwendig, da es im gleichen Netz wie die FritzBox selbst liegt.
riversource schrieb:
Die bleibt statisch. Die ist exakt für deinen Anwendungsfall gedacht. Du musst nur dafür sorgen, dass die Fritzbox das Prefix dauerhaft verteilt. Das kann man deaktivieren.
Okay danke für die Info. Wird die Interface ID bei IPv6 nicht aus der MAC Adresse der Netzwerkkarte gebildet?
Diese müsste sich doch ggf. bei Containern ändern, wenn ich z.B. einen Container lösche und mit einer neuen Version von Adguard neu anlege? Liege ich falsch mit der Annahme?

Der ULA wird bereits jetzt immer vergeben in der FritzBox:
1704720014834.png


Eine feste IPv6 Adresse direkt am Container definiert hätte natürlich den Charme, dass ich nicht von eventuellen Änderungen der IP seitens Router abhängig wäre.

Danke bereits für die Antworten bis hierhin.
 
shirocko schrieb:
Ich habe einen Netzbereich 192.168.1.224/27 für Docker Container reserviert, welcher nicht im DHCP Bereich des Routers liegt.
Ok, also für IPv4 machst du das, was du für IPv6 nicht willst. Gut, dann muss man für IPv6 vorsorgen.

shirocko schrieb:
Wird die Interface ID bei IPv6 nicht aus der MAC Adresse der Netzwerkkarte gebildet?
Kommt drauf an. MAC (=> EUI-64) ist eine Möglichkeit. Es gibt andere, z.B. zufällige Host-IDs.

shirocko schrieb:
Diese müsste sich doch ggf. bei Containern ändern, wenn ich z.B. einen Container lösche und mit einer neuen Version von Adguard neu anlege? Liege ich falsch mit der Annahme?
Ja, ein bekanntes Problem bei Docker. Ggf. kann man die MAC statisch vergeben. Aber dann musst du bei Updates aufpassen, da könnte die Einstellung wieder weg sein.
 
riversource schrieb:
Ok, also für IPv4 machst du das, was du für IPv6 nicht willst. Gut, dann muss man für IPv6 vorsorgen.
Das stimmt so nicht ganz.
Bei IPv4 kann ich die Adresse sowohl über den Router, als auch über die vergabe der festen IP im Container fixieren. Mit IPv6 scheint das ja über die automatische Vergabe und Generierung nicht 100% sicher zu sein und ich kann die IP auch im Router nicht dauerhaft so vergeben.

riversource schrieb:
Ja, ein bekanntes Problem bei Docker. Ggf. kann man die MAC statisch vergeben. Aber dann musst du bei Updates aufpassen, da könnte die Einstellung wieder weg sein.
Was wäre denn tatsächlich ein funktionaler und gangbarer Weg, um für einen Docker Container dauerhaft die gleiche IPv6 Adresse zu erhalten und auch nach einem Update diese beizubehalten?
 
Ich habe nun folgendes gemacht, um die IPv6 Adresse innerhalb der FritzBox gleich zu halten und dem Container immer die gleiche IPv6 Adresse zuzuweisen.

Zunächst habe ich auf dem Host System (Raspi Bookworm) die Privacy Extension deaktiviert und die dann entstehende Interface ID auch in der FritzBox hinterlegt.

Danach habe ich für den Docker Daemon folgende Einstellungen vorgenommen in der Datei /etc/docker/daemon.json
JSON:
{
        "ipv6":true,
        "fixed-cidr-v6": "fd00:1::/80",
        "experimental": true,
        "ip6tables": true
}

Hier das Subnetz "fd00:1::/80", da es sich ja nicht mit dem der FritzBox überschneiden darf.

Um nun dem Container die identische IPv6 ULA zuzuweisen, wie in der FritzBox hinterlegt, habe ich den Stack wie folgt angepasst:
Code:
---
version: "2.1"

services:
  adguard:
    container_name: adguard
    image: adguard/adguardhome
    ports:
      - 53/tcp
      - 53/udp
      - 80/tcp
      - 3000/tcp
      - 67/udp
      - 68/tcp
      - 68/udp
      - 443/tcp
      - 853/tcp
    volumes:
      - adguard_work:/opt/adguardhome/work
      - adguard_conf:/opt/adguardhome/conf
    networks:
      docker_macvlan:
        ipv4_address: 192.168.1.250 # this IP will show as a device on your router
        ipv6_address: fd00::42:c0ff:fea8:1fa
    restart: unless-stopped

# Here we define what networks are available to use by the services above
# Make sure to set the config of both macvlan and vlan_bridge as described in the guide.
networks:
  docker_macvlan:
    name: docker_macvlan
    driver: macvlan
    enable_ipv6: true
    driver_opts:
      parent: eth0
    ipam:
      config:
        - subnet: 192.168.1.0/24 # Set to same subnet as your router and other devices
          ip_range: 192.168.1.224/27 # Available range from 224 to 255.
          gateway: 192.168.1.1 # This is your router IP
        - subnet: fd00::/64
          gateway: fd00::1

# Here we define where to save the files that live outside the container
# Located under /var/lib/docker/volumes
volumes:
  adguard_work:
    name: adguard_work
  adguard_conf:
    name: adguard_conf

Hier habe ich also nun im MACVLAN das fd00::/64 Netz angegeben, wie in der FritzBox, und als Adresse fd00:: + die Interface ID des Containers.

Ich glaube das ist nicht die sauberste Lösung, aber sie funktioniert aktuell.

Wie kann ich denn den Container die IPv6 Adresse von der FritzBox direkt beziehen lassen, ohne ein MACVLAN dafür zu nutzen bzw. das gleiche Netz dort nutzen zu müssen.
Sobald ich alle IPv6 Parameter aus dem MACVLAN Teil entferne und auch den Parameter "enable_ipv6: true", dann bezieht der Container auch keine IPv6 mehr.
Und das fd00:1::/80 Netz kann ich im MACVLAN auch nicht nutzen, da es bereits von der Docker Bridge selbst genutzt wird.

Ich hoffe auch konstruktive Vorschläge.

Vielen Dank
shirocko
 
Wenn ich das Compose File wie folgt schreibe:
Code:
---
version: "2.1"

services:
  adguard:
    container_name: adguard
    image: adguard/adguardhome
    ports:
      - 53/tcp
      - 53/udp
      - 80/tcp
      - 3000/tcp
      - 67/udp
      - 68/tcp
      - 68/udp
      - 443/tcp
      - 853/tcp
    volumes:
      - adguard_work:/opt/adguardhome/work
      - adguard_conf:/opt/adguardhome/conf
    networks:
      docker_macvlan:
        ipv4_address: 192.168.1.250 # this IP will show as a device on your router
    restart: unless-stopped

# Here we define what networks are available to use by the services above
# Make sure to set the config of both macvlan and vlan_bridge as described in the guide.
networks:
  docker_macvlan:
    name: docker_macvlan
    driver: macvlan
    driver_opts:
      parent: eth0
    ipam:
      config:
        - subnet: 192.168.1.0/24 # Set to same subnet as your router and other devices
          ip_range: 192.168.1.224/27 # Available range from 224 to 255.
          gateway: 192.168.1.1 # This is your router IP

# Here we define where to save the files that live outside the container
# Located under /var/lib/docker/volumes
volumes:
  adguard_work:
    name: adguard_work
  adguard_conf:
    name: adguard_conf

Dann bekommt er gar keine IPv6 Adresse.
Ich habe oben das Subnet, Gateway, IPv6 true und die feste IPv6 weg gelassen.
 
Also der Docker Host bekommt eine IPv6 Adresse von Router.
Ich habe nun die explizite Vergabe der IPv6 im Compose File weg gelassen, aber das Subnet und Gateway musste definiert bleiben.
Jetzt zieht sich der Container 2 ULA Adressen

Code:
eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:c0:a8:01:fa brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.250/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fd00::42:c0ff:fea8:1fa/64 scope global dynamic flags 100
       valid_lft 7140sec preferred_lft 3540sec
....
    inet6 fd00::2/64 scope global flags 02
       valid_lft forever preferred_lft forever
...

Die erste fd00::42... ist direkt vom Router und bei der zweiten fd00::2 bin ich mir nicht sicher, woher er sich diese zieht. Eventuell durch die Angabe des Subnetzes und des Gateway mit fd00::/64 bzw. fd00::1
 
Zurück
Oben