Zum Inhalt

Docker

IPv6

Docker muss seine IPv6-Fähigkeiten verbessern. Meine Gäste benötigen IPv6-Konnektivität, z. B. um externe Datenbankserver zu erreichen, die nur über IPv6 erreichbar sind. In der Standardkonfiguration haben Container keine IPv6-Adresse und können daher überhaupt keine Verbindung zur Datenbank herstellen.

Deshalb erstelle ich eine Bridge mit einem RFC1918-Bereich und einem ULA-IPv6-Bereich. Dann verwende ich nftables für IPv4-Masquerading, während IPv6 nativ geroutet werden kann.

  • Docker-Netzwerk mit gegebenem Bridge-Namen erstellen:
    docker network create --ipv6 --subnet 10.39.10.0/24 --gateway 10.39.10.1 --subnet 2001:1234:1234:7008::/64 --gateway 2001:1234:1234:7008::1 brdocker -o com.docker.network
    .bridge.name=brdocker
    

Das erstellt eine persistente Dual-Stack-Bridge. Routing und Masquerading werden durch diese Ansible-nftables-Role verwaltet.

Eine Docker-Compose-YAML könnte so aussehen. Für jeden Container einen Netzwerknamen vergeben, aber auf das brdocker-Netzwerk referenzieren.

version: "3.5"
services:
  busy:
    image: busybox
    #command: ping6 -c 4 google.com
    #command: top
    #command: ip a s
    #command: ping6 2a02:2e0:3fe:1001:7777:772e:2:85
    command: ping 8.8.8.8 -c 6
    networks:
      - busyboxnet
networks:
  busyboxnet:
    external:
      name: brdocker

Dies ist die Ansible-Konfiguration:

nftablesmode: "firewall"
nftables_masks:
  - downif: "brdocker"
    upif: "eth0"
nftablesopenhost:
  - dport: 8096
    family: 6
    proto: "tcp"
    comment: "Emby"
  - dport: 8097
    family: 6
    proto: "tcp"
    comment: "Jellyfin"
  - dport: 8098
    family: 6
    proto: "tcp"
    comment: "Piwigo"