Tech4Hosting und Docker IPv6


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.

Zurück zur Tutorial Übersicht Back to Tutorial Overview

© 2002-2023 Phox inc. all rights reserved.

© 2002-2023 Phox inc. all rights reserved.