Workaround: Docker mit IPv6, öffentliche IPv6-Adresse
(Meine Wortwahl mag da und dort fachlich nicht 100% richtig sein, da ich kein wirklicher IT-Experte bzw. kein Docker-Experte bin…)
QNAP TS-473 mit QTS 5.0.0 1853
aktuelle Containerstation, die mit einer Dockerversion 20.10.7-qnap läuft
Ziel ist es die Dockercontainer mit IPv6 auszustatten, damit über DS-Lite Internetanschlüsse ein Zugriff vom Internet auf einen Dockercontainer möglich wird.
Z.B. nextcloud, Portainer hier auch als Beispiel verwendet, oder, oder…
- der Internet-Provider liefert an den Router das Subnet: „2a01:c23:814f:d00::/56“
- das Docker Configfile: /share/CACHEDEV1_DATA/.qpkg/container-station/etc/docker.json um
"ipv6": true,
"fixed-cidr-v6": "2a01:c23:814f:d00:d::/80",
ergänzt.
--> ein File unter /etc/docker mit daemon.json bringt nichts, da QNAP den dockerd mit eben einer eigenen Config-Angabe startet.
Die von mir verwendete IPv6 Adresse ist eine öffentliche IPv6 Adresse, die vom Internet-Provider dem Router zugewiesen wurde.
In dem Beispiel hier ist es das „2a01:c23:814f:d00::/56“.
von diesem zugewiesenen Subnet nehme ich den nächsten kleineren Bereich mit "2a01:c23:814f:d00:d::/80"
Vorsicht, diese Adresse ändert sich bei den meisten Providern täglich!!!
Dies fange ich damit ab, dass ich mit einem Script regelmäßig die IPv6 Adresse vom Router kommend mit der hier in Docker eingetragenen, vergleiche.
Sollte sich das IPv6 Subnetz geändert haben, dann ändert ein Script das docker.json file (bzw. das File "/opt/etc/ndppd.conf" siehe weiter unten) und startet die Containerstation neu.
--> /etc/init.d/container-station.sh restart
Damit das Docker-Subnet im lokalen Netz bzw. beim Defaultgateway (bei mir der Internet-Router) bekannt wird, habe ich den "ndppd" auf der QNAP installiert:
- NDP - Neighbor Discovery Protokoll
- zuvor das Packet „Entware-std“ installiert, was den "opkg" Paketmanager mitbringt
- darin konnte ich dann wiederum mit "opkg install ndppd" diesen Neighbor Discovery Daemon Proxy installieren
- der wiederum die Config braucht:
proxy qvs0 {
rule 2a01:c23:814f:d00::/56 {
static
}
}
- qvs0 ist Interface das NDP hört und rausgibt
- die „rule“ ist das IPv6 Subnetz, was der Internet-Provider dem Internetrouter gibt.
- obwohl es eine Option „auto“ gibt, die laut Beschreibung eher zu verwenden sei:
- hat „auto“ bei mir nicht funktioniert
- mit „static“ kommt zwar eine Warnung, aber funktioniert
die Container mit IPv6 anlegen:
Dazu muss anscheinend die Option -p wie folgt verwendet werden.
Hier ein Beispiel mit dem Portainer:
docker run -d -p '[::]:8000:8000/tcp' -p '[::]:9000:9000/tcp' --name=portainer-ce-gk-1 --restart=always --pull=always -v /var/run/docker.sock:/var/run/docker.sock -v /share/GK/Portainer:/data portainer/portainer-ce:2.9.2
Damit ist nun der Portainer-Container über eine IPv6 Adresse erreichbar.
Die Portfreigabe am Router ist halt routerspezifisch.
Aber klar, die IPv6 Adressen mit diesen Ports (hier eben 8000 und 9000) müssen noch am Router freigegeben werden, damit ein Zugriff aus dem Internet funktionieren kann.
Ich hoffe, dass ich vielleicht ein bisschen helfen kann.
Klar, dieser Workaround ist etwas rustikal oder wie auch immer man es nennen kann.
Aber läuft bei mir seit zwei Tagen und auch zwei IPv6 Subnet-Änderungen problemlos überlebt.
Grüße
Gerhard
P.S. da sich die IPv6 Adresse sich täglich ändert, habe ich sie aus Gründen dem besseren Verständnis sichtbar stehen lassen...
Und meine Scripts sind sicherlich verbesserungswürdig, bzw. meine sind recht hemdsärmlig entstanden...