QNAP + DOCKER + IPV6 = DESATER?

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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.