In dieser kurzen Anleitung erkläre ich dir, wie du IPv6 mit Docker auf der Tech4Hosting Infrastruktur funktionsfähig einrichtest. Ein typischer Anwendungsfall, bei dem diese Anleitung weiterhilft ist, wenn du deine Docker Anwendung mit einem Tech4Hosting Platform-as-a-Service Dienst (IPv6) verbinden möchtest.
Die zusätzlichen Einstellungen sind notwendig, weil der Docker-Deamon das Containernetzwerk standardmäßig nur für IPv4 konfiguriert. Den Schritten der Anleitung kannst du unter den Linux Distros Ubuntu und Debian folgen.
Damit die IPv6 Unterstützung unter Docker funktioniert, muss dies explizit im Docker Netzwerkinterface angegeben werden. Hierzu wird zunächst ein neues IPv6 fähiges Docker Netzwerkinterface angelegt. Danach bleibt der Traffic jedoch im neu erstellten Netzwerkinterface “gefangen”, so dass zwei kleine iptables Regeln angewendet werden müssen.
Diese bewirken, dass der Traffic auf die korrekten Interfaces weitergeleitet wird. Darüber hinaus ist es möglich, dass default Docker bridge Netzwerk IPv6-fähig zu konfigurieren. Bei dieser Variante (s. Abschnitt Variante 2) muss kein zusätzliches Netzwerkinterface angelegt werden, jedoch funktioniert dies nicht bei Verwendung von docker-compose.
So wird’s gemacht:
Mit dem Befehl
ip a
auf deiner Tech4Hosting VM kannst du dir den aktuellen Zustand anzeigen lassen.
Die Tech4Hosting Netzwerkinterfaces schauen im Standard so aus:
ens16 -> ist das Public Network ens17 -> ist das PaaS Network
1. Docker IPv6 Netzwerkinterface erstellen
Anschließend legst du mit folgendem Befehl das neue IPv6 fähige Docker Netzwerkinterface an (IPv4/6 Range kann angepasst werden):
docker network create --ipv6 --driver=bridge --subnet=172.20.0.0/16 --subnet=2001:db8:1::/64 -o "com.docker.network.bridge.name"="docker-br0" br0
2. Systemd Service
In einem weiteren Schritt legst du dann einen Systemd Service an, der die nötigen ip6table Regeln konfiguriert und dafür sorgt, dass der Traffic zwischen Public und PaaS getrennt wird. Erstelle den Service unter dem unten stehenden Pfad mit deinem bevorzugten Editor.
vim /etc/systemd/system/docker_ipv6.service
[Unit] Description=docker ip6tables rules After=docker.service [Service] Type=oneshot ExecStart=/usr/local/bin/docker_ipv6.sh [Install] WantedBy=multi-user.target
3. Bash Skript mit Routing Regeln
Entsprechend dazu wird ein Bash Skript angelegt das die routing Regeln beinhaltet:
vim /usr/local/bin/docker_ipv6.sh
#!/bin/bash ip6tables -t nat -I POSTROUTING -s 2001:db8:1::/64 -o ens16 -j MASQUERADE # public network ip6tables -t nat -A POSTROUTING -s 2001:db8:1::/64 -d fcfc::1/32 -o ens17 -j MASQUERADE # paas network
Wichtig: Unter Debian muss zusätzlich accept_ra mit dem folgenden Befehl auf 2 gesetzt werden (in das Bash Skript einfügen). Andernfalls führt eine IPv6-fähige Weiterleitung zur Ablehnung von Router-Werbungen.
sysctl net.ipv6.conf.ens16.accept_ra=2 # Overrule forwarding behaviour. Accept Router Advertisements even if forwarding is enabled.
Anschließend machst du das Skript ausführbar, aktivierst und startest den Dienst:
chmod +x /usr/local/bin/docker_ipv6.sh systemctl enable docker_ipv6.service systemctl start docker_ipv6.service
Überprüfe in einem weiteren Schritt, ob die Regeln gesetzt wurden:
ip6tables -t nat -vnL
4. Verwendung mit docker-compose
Wer docker-compose verwendet, kann das br0 Interface wie folgt in der docker-compose YAML Datei integrieren:
[...] networks: default: external: name: br0
5. IPv6 Funktion überprüfen
Zur einfachen Überprüfung der IPv6 Funktion kann ein Docker-Container mit Netzwerk Tool Image interaktiv gestartet werden.
docker run -it --network=br0 nicolaka/netshoot
Überprüfe nun, ob ein ping6 zur Außenwelt und zum Tech4Hosting PaaS-Dienst möglich ist:
root @ / [3] ? → ping6 heise.de PING heise.de(redirector.heise.de (2a02:2e0:3fe:1001:302::)) 56 data bytes 64 bytes from redirector.heise.de (2a02:2e0:3fe:1001:302::): icmp_seq=8 ttl=57 time=1.00 ms 64 bytes from redirector.heise.de (2a02:2e0:3fe:1001:302::): icmp_seq=9 ttl=57 time=4.70 ms root @ / [5] ? → ping6 fcfc::1:8ec:7bff:fe7c:af03 PING fcfc::1:8ec:7bff:fe7c:af03(fcfc::1:8ec:7bff:fe7c:af03) 56 data bytes 64 bytes from fcfc::1:8ec:7bff:fe7c:af03: icmp_seq=1 ttl=63 time=0.907 ms 64 bytes from fcfc::1:8ec:7bff:fe7c:af03: icmp_seq=2 ttl=63 time=0.603 ms
Variante 2
Bei Variante 2 wird das default Docker bridge Netzwerk IPv4/IPv6 dualstack fähig konfiguriert. Hierzu muss die Datei daemon.json mit folgendem Inhalt angelegt werden:
vim /etc/docker/daemon.json
{ "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64" }
Als nächstes müssen die Schritte 2-3 von der ersten Variante durchgeführt werden, sowie Schritt 5 um die Funktion zu testen. Wichtig: Diese Variante unterstützt kein docker-compose.