Alle sprechen von Virtualisierung, Containern, IPv6,… nur auf einer kleinen Insel der Glückseligen will man davon nichts wissen…
Es hat lange gedauert bis Docker IPv6 unterstützt hat. Nun geht es aber so olala aber die Hostingplattform meiner Wahl (QNAP) will immer noch nichts davon wissen. Mit jedem update der Container Station ist ungewiss ob diese gerade mal wieder mehr oder weniger unterstützt.
Nach langem hin und her habe ich für mich eine Lösung gefunden die erstmal die wichtigsten Punkte abdeckt:
- IPv4 & IPv6 können gleich verwendet werden (Ports können auf dem Hostsystem freigegeben werden)
- Die Container stehen nicht komplett im Internet, da Docker Container nicht immer für ihre Sicherheit bekannt sind
Die Lösung besteht aus einem Container namens docker-ipv6nat.
IPv6 und NAT? WTF!? werdet ihr jetzt sagen, aber Docker ist aktuell nach diesem Konzept ausgerichtet und solange man IPv4 & IPv6 konsistent nutzen will muss man sich eben Gegebenheiten anpassen.
Schritt 1:
Kernel Module für ip6tables NAT installieren. Leider bringt QNAP diese Module nicht von Haus aus mit, daher muss man sich diese selbst bauen.
Dankenswerter weise hast das bereits jemand getan und auf github veröffentlicht. https://github.com/mammo0/qnap-ip6tables_nat-module. Unter Release könnt Ihr hier die aktuellen gebauten Module bereits runterladen. Ich habe sie in das application Verzeichnis des Docker Containers mit abgelegt:
share/CACHEDEV1_DATA/Container/container-station-data/application/ipv6nat/kernel_mods/
Dann muss man dafür sorgen, dass diese Module beim starten auch geladen werden. Dazu müssen die folgenden Zeilen in eure autorun.sh eingetragen werden.
# ipv6-tables /sbin/modprobe ip6_tables /sbin/modprobe nf_nat /sbin/modprobe xt_MASQUERADE insmod /share/CACHEDEV1_DATA/Container/container-station-data/application/ipv6nat/kernel_mods/ip6t_NPT.ko insmod /share/CACHEDEV1_DATA/Container/container-station-data/application/ipv6nat/kernel_mods/nf_reject_ipv6.ko insmod /share/CACHEDEV1_DATA/Container/container-station-data/application/ipv6nat/kernel_mods/ip6t_REJECT.ko insmod /share/CACHEDEV1_DATA/Container/container-station-data/application/ipv6nat/kernel_mods/ip6table_nat.ko
Wie ihr diese Datei auf eurem QNAP Modell editieren könnt findet ihr im QNAP Wiki: https://wiki.qnap.com/wiki/Running_Your_Own_Application_at_Startup
Nach dem Ihr die Module hinzugefügt habt müsst Ihr euer NAS neustarten.
Schritt 2:
Um den docker-ipv6nat Container einzurichten habe ich ein docker-compose File vorbereitet. dass ihr in der ContainerStation einfach via Create einfügen könnt:
version: '3' services: ipv6nat: container_name: ipv6nat restart: always image: robbertkl/ipv6nat privileged: true network_mode: host volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /lib/modules:/lib/modules:ro
Der Container sollte ohne Ausgaben auf dem Terminal hochlaufen. Unspektakulär… und jetzt? Ist beim Anlegen von Containern die auch per IPv& erreichbar sein sollen noch etwas Handarbeit gefragt. Zumindest habe ich noch keinen einfacheren weg über die QNAP Oberfläche gefunden.
Ihr müsst euch zumindest ein wenn ihr wollt natürlich auch für jeden Container ein eigenes Netz mit IPv6 support erzeugen.
Dazu loggt ihr euch per SSH auf dem QNAP ein und erstellt ein neues Docker Netzwerk:
docker network create --ipv6 --subnet fd00:dead:beef::/48 ipv6net-1
Ihr könnt natürlich auch jeden anderen ULA Bereich (fc00::/7) nehmen.
Nun einfach bei euren Containern ipv6net-1 als externes Netzwerk verwenden. Hier ein kleines Beispiel:
version: "3" services: alp1: image: yeasy/simple-web:latest ports: - 80:80 networks: - ipv6net-1 networks: ipv6net-1: external: true
Nun sind eure Container Ports von per IPv4:
nmap <ipv4 ip> -p 80 PORT STATE SERVICE 80/tcp open http
und auch per IPv6 zu erreichen:
nmap <ipv6 ip> -6 -p 80 PORT STATE SERVICE 80/tcp open http
Viel Spaß beim hosten eurer Dienste per IPv4 & IPv6!
Docker kann seit einiger Zeit auch selbst NAT mit IPv6:
https://github.com/moby/moby/pull/41622
Ja das ist richtig. Docker bietet seit einer Weile bereits IPv6 Unterstützung.
Leider ist das aber bei QNAP bisher noch nicht wahrgenommen worden.
Zumindest in QTS sind die IPv6 Features in Docker noch nicht aktiviert.
Hallo,
ist die Herangehensweise noch aktuell?
Ich würde gerne einen dedicated server in docker laufen lassen, der als Multiplayer nat eigentlich ipv4 nutzt.
Und dann über ipv6 anbinden da mein Internet zugang lediglich ds lite benutzt…
Zu dem lässt sich die autorun.sh nicht speichern bzw wenn ich in vi Editor nach dem einfügen über a, einfügemodus.
Und dan esc drücke, weder über q noch wq speichern da keine eingabe aktzeptiert wirt unten links im window
Wenn der Server nur IPv4 unterstützt dürfte das schwer werden, denn ich vermute, dass die Clients dann auch nur IPv4 unterstützen. Damit werden sie wohl schon an der Auflösung der Serveradresse scheitern.
Was dir hier mehr hilft ein Tunnel der eine IPv4 Adresse im Internet mit einem Server verbindet. Such mal nach dem Stichwort Cloudflare Tunnel. Das könnte dein Problem lösen.
Viele Grüße
Steve