IPv6 Addressvergabe an Docker-Container

  • Hallo Leute,


    Ich bin leider noch nicht so gut im Umgang mit IPv6 und neu bei Netcup- darum bitte um Nachsicht, hoffe ich meine Frage ist nicht allzu doof.


    Ich würd gerne den ipv6 /64-Adresspool, der jedem Server zur Verfügung steht, auf folgende Weise nutzen:

    Idealerweise sollte bei Erzeugung eines Containers automatisch eine freie Adresse aus dem Pool dem neuen Container zugewiesen werden.


    Wie wäre das zu konfigurieren? Bisher habe ich es nur geschafft, so wie im Netcup-Wiki beschrieben, eine IPv6-Adresse meinem Host statisch zuzuweisen- alle anderen Versuche, den docker-daemon mittels /etc/docker/daemon.json zu konfigurieren haben nicht funktioniert.


    Hat das schon jemand gemacht? Ich meine das wäre ja eigentlich ideal, wenn man schon zig Adressen zur Verfügung hat, dass sie einfach automatisch einem neuen Container zugewiesen werden oder?


    Ach ja, noch eine kleine Zusatzfrage- was könnte man eigentlich in diese beiden EIngabefelder im SCP (unter Network) eintragen? ipv6 SCP.JPG

  • Ich kenne mich zwar mit Docker nicht aus, aber ich denke man kann damit auch Bridged Lan einrichten, wie bei LXC.

    Suche in dieser Hinsicht mal nach IPv6 neigh proxy.

    Eine andere Möglichkeit: Bei meinem LXC Containern habe ich es so gelöst, dass ich das zugewiesene Subnetz auf das Interface des Hosts (ens3) gelegt habe. Meine Container sind mit der Bridge vmbr0 verbunden, welches eine Adresse aus einem Zusatzsubnetz besitzt und als Gateway für die Container dient.

    Vorteil ist, dass ein Zusatzsubnetz auf dein primäres Subnetz geroutet wird. Damit ist neigh proxy nicht nötig.


    Bei den genannten Eingabefeldern kannst du Reverse IP Adressen eintragen.

  • Hallo,


    hannip hast du es mittlerweile gelöst? Ich bin zwar soweit, dass meine Container alle eine IPv6 Adresse erhalten, von außen jedoch nicht erreichbar sind. Mit dem Einsatz von neigh proxy funktioniert es zwar, ich würde es jedoch gerne so lösen wie oliver.g , klappt jedoch nicht.

    Mein Vorgehen:


    Schritt 1: Wie im netcup Wiki beschrieben IPv4+IPv6 für das Netzwerk Interface ens3 einstellen: https://www.netcup-wiki.de/wik…IP_Adresse_konfigurieren: /etc/network/interfaces


    Schritt 2: https://docs.docker.com/engine…ing/default_network/ipv6/


    Da habe ich mich an dem Absatz "Often servers or virtual machines get a /64 IPv6 subnet assigned [...]" orientiert.

    In /etc/docker/daemon.json folgendes eingetragen:


    Code
    1. {
    2. "ipv6": true,
    3. "fixed-cidr-v6": "2a03:4000:6:****:1::/80"
    4. }


    Folgende Befehle ausgeführt (wobei der erste nicht nötigt scheint, setzt Docker auch von selbst - siehe später ; die letzten 2 Befehle sind mittlerweile in /etc/sysctl.d/50-IPv6.confeingetragen):


    Code
    1. $ ip -6 route add 2a03:4000:6:****:1::/80 dev docker0
    2. $ sysctl net.ipv6.conf.default.forwarding=1
    3. $ sysctl net.ipv6.conf.all.forwarding=1


    Alle Docker Container ohne Netzwerk Angabe erhalten eine IPv6 aus dieser Range, z.B. 2a03:4000:6:****:1::2 (2a03:4000:6:****:1::1 hat docker0 als Gateway).



    Lege ich mit docker-compose ( https://docs.docker.com/compos…ipv4_address-ipv6_address ) weitere Container mit einem Netzwerk mit eigenem Subnetz an...


    Code
    1. networks:
    2. mynetwork:
    3. driver: bridge
    4. enable_ipv6: true
    5. ipam:
    6. driver: default
    7. config:
    8. - subnet: 172.20.0.0/24
    9. - subnet: 2a03:4000:6:****:2::/80

    ... erhalten die Container auch eine IP aus dem Subnetz und Docker richtet eine Route ein.



    Die Container sind aber wie schon geschrieben von extern nicht erreichbar. Firewall (iptables 4/6) ist (noch) nicht konfiguriert, lässt also alles durch. (Die Network ID bzw. bridge br-** und interfaces sind dynamisch generiert.)


    Was übersehe ich bzw. hat jemand einen Tipp? Hab schon das ein oder andere erfolglos versucht. oliver.g wie sieht den deine Netzwerkkonfig. (/etc/network/interfaces) aus?

    Server: RS 2000 SSD G8 a2 + RS X-Mas 2016 | Webhosting: 4000 SE de a1 + 1000 SE 12M
    Debian 64Bit: Docker, Apache2, NGINX, MariaDB, PSQL+PostGIS, ZNC, Prosody ;)

  • hannip hast du es mittlerweile gelöst? Ich bin zwar soweit, dass meine Container alle eine IPv6 Adresse erhalten, von außen jedoch nicht erreichbar sind. Mit dem Einsatz von neigh proxy funktioniert es zwar, ich würde es jedoch gerne so lösen wie oliver.d , klappt jedoch nicht.

    Die Lösung von oliver.d klappt auch nur, wenn das Subnetz an deinen Server geroutet ist. Das erste Subnetz eines jeden Servers ist jedoch geswitcht. Daher wirst du dort einen neighbor proxy nutzen müssen.

    Alle zusätzlichen Subnetze, statisch oder Failover, sind auf eine Adresse aus deinem ersten Subnetz geroutet (Prefix + EUI-64). Diese Adressen kannst du dann auch problemlos auf deinem Server routen.


    VG

    Christian

  • Kannst du die Docker-Container per ping vom Hostsystem aus erreichen?

    Ja, das funktioniert.


    Die Lösung von oliver.d klappt auch nur, wenn das Subnetz an deinen Server geroutet ist. Das erste Subnetz eines jeden Servers ist jedoch geswitcht.

    Danke für die Info. :thumbup: Ein weiteres Subnetz kostet nur 1€/M, lohnt sich aktuell für mich jedoch nicht, dann nutze ich doch erstmal den Proxy.

    Server: RS 2000 SSD G8 a2 + RS X-Mas 2016 | Webhosting: 4000 SE de a1 + 1000 SE 12M
    Debian 64Bit: Docker, Apache2, NGINX, MariaDB, PSQL+PostGIS, ZNC, Prosody ;)

  • Die Lösung von oliver.d klappt auch nur, wenn das Subnetz an deinen Server geroutet ist. Das erste Subnetz eines jeden Servers ist jedoch geswitcht. Daher wirst du dort einen neighbor proxy nutzen müssen.

    Alle zusätzlichen Subnetze, statisch oder Failover, sind auf eine Adresse aus deinem ersten Subnetz geroutet (Prefix + EUI-64). Diese Adressen kannst du dann auch problemlos auf deinem Server routen.


    VG

    Christian

    Wie würde das mit dem neighbor proxy aussehen?

  • Schau mal hier https://docs.docker.com/v17.09…ing/default_network/ipv6/ unter "Using NDP proxying", dort steht es noch, scheint aber in der neuen Doc entfernt worden zu sein. Ich nutzte mittlerweile https://hub.docker.com/r/robbertkl/ipv6nat/ , für meinen Nutzen ist das ausreichend und am Bequemsten....

    Server: RS 2000 SSD G8 a2 + RS X-Mas 2016 | Webhosting: 4000 SE de a1 + 1000 SE 12M
    Debian 64Bit: Docker, Apache2, NGINX, MariaDB, PSQL+PostGIS, ZNC, Prosody ;)

  • Ich hab genau das gemacht, aber irgendwie hat es beim ersten Mal nicht geklappt. Jetzt hat es aber geklappt und es Funktioniert auch so wie ich es wollte. Danke!


    Ich habe mir jetzt auch eine Failover ip aus der aktuellen Aktion gegönnt, die aber auf meinem Hauptserver läuft. Ich denke ich werde später mal auch TobiasH's Variante ausprobieren.

  • Ich will ja keinen Zombie wiederbeleben, aber Dbone , @hannpi habt ihr das Problem lösen können?


    Auf meinem G8 VPS läuft CoreOS, auf diesem Docker.

    Den Tips in diesem thread folgend habe ich mir heute ein zweites ipv6 subnet bestellt und auf den Server gerouted. Nur IPs daraus kann ich nicht anpingen


    1. Screenshot aus dem SCP:

    forum.netcup.de/system/attachment/2650/


    2. ifconfig eth0

    Code
    1. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    2. inet 185.244.192.64 netmask 255.255.252.0 broadcast 185.244.195.255
    3. inet6 2a03:4000:2x:xx::1 prefixlen 64 scopeid 0x0<global> <- ipv6 subnet von anfang dabei
    4. inet6 fe80::e8f2:xxx:xxx:95b7 prefixlen 64 scopeid 0x20<link>
    5. inet6 2a03:4000:2x:xxx::1 prefixlen 64 scopeid 0x0<global> <- ipv6 subnet bestellt
    6. ether ea:f2:xx:xx:xx:b7 txqueuelen 1000 (Ethernet)
    7. RX packets 63039 bytes 26095949 (24.8 MiB)
    8. RX errors 0 dropped 0 overruns 0 frame 0
    9. TX packets 12772 bytes 1762320 (1.6 MiB)
    10. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

    Von einem extern host kann ich die zweite inet6 IP nicht anpingen:

    Code
    1. ping6 2a03:4000:2x:xxx::1
    2. --- 2a03:4000:2x:xxx::1 ping6 statistics ---
    3. 3 packets transmitted, 0 packets received, 100.0% packet loss

    Die originäre jedoch funktioniert:

    Code
    1. ping6 2a03:4000:2x:xx::1
    2. 16 bytes from 2a03:4000:2x:xx::1, icmp_seq=0 hlim=58 time=582.119 ms
    3. 16 bytes from 2a03:4000:2x:xx::1, icmp_seq=1 hlim=58 time=15.719 ms
    4. 16 bytes from 2a03:4000:2x:xx::1, icmp_seq=2 hlim=58 time=19.913 ms


    3. /etc/system/network/static.networking

    4. Folgende sysctl parameter werden beim systemstart übergeben:

    Code
    1. net.ipv6.conf.default.forwarding=1
    2. net.ipv6.conf.all.forwarding=1
    3. net.ipv6.conf.eth0.proxy_ndp=0
    4. net.ipv6.conf.default.accept_ra=0
    5. net.ipv6.conf.default.autoconf=0
    6. net.ipv6.conf.all.accept_ra=0
    7. net.ipv6.conf.all.autoconf=0
    8. net.ipv6.conf.eth0.accept_ra=0
    9. net.ipv6.conf.eth0.autoconf=0


    5. ip -6 r

    Docker startet mit Environment='DOCKER_OPTS=--dns 1.1.1.1 --dns 1.0.0.1 --ipv6 --fixed-cidr-v6="2a03:4000:2x:xxx:1::/80"', einer entsprechende Route habe ich auch angelegt: sudo ip -6 route add  2a03:4000:2x:xxx:1:/80 dev docker0.


    Neue Docker container erhalten Adressen aus dem subnet 2a03:4000:2x:xxx:1:242:ac11:4, aber anpingen kann ich diese hosts auch nicht.
    Habe ich etwas vergessen?

  • Hi, hast du dem primären NIC auch die Routing Adresse zugewiesen (siehe SCP in der Gateway Spalte)? Das ist die Adresse aus deinem ersten Subnet, auf die das zusätzliche Subnet geroutet wird. Die muss natürlich auch konfiguriert sein.

    Ich fummel ja gerne in der Konsole rum und weiß, was ein NIC ist. Aber jetzt habe ich nur Bahnhof verstanden.

    Der primäre NIC bei mir ist wohl eth0 und mit der Routing Adresse meinst du die lange IPV6 Adresse, die das SCP generiert hat? Wie würde diese Konfiguration vornehmen?


    EDIT:

    Meinst du so?

    Code
    1. Address=2a03:4000:2x:xxx::1/64
    2. #Gateway=fe80::1
    3. Gateway=2a03:4000:xx:xx:xxx:xxx:xxx:95b7 <- Adresse aus dem SCP in der Gateway Spalte
    4. DNS=2606:4700:4700::1111
  • NIC = Network Interface Controller, also kurz für Netzwerkkarte.

    Nein, diese Adresse ist nicht Gateway, sondern die Zieladresse, an die die Pakete geroutet werden, die an Adressen aus deinem Zusatzsubnetz gesendet werden. Diese wird also als zweite IP deinem Netzwerkadapter zugewiesen. Das Gateway fe80::1 bleibt so.

  • NIC = Network Interface Controller, also kurz für Netzwerkkarte.

    Nein, diese Adresse ist nicht Gateway, sondern die Zieladresse, an die die Pakete geroutet werden, die an Adressen aus deinem Zusatzsubnetz gesendet werden. Diese wird also als zweite IP deinem Netzwerkadapter zugewiesen. Das Gateway fe80::1 bleibt so.

    Merci für die Erklärung, ich habe es so probiert:

    sudo ip address add 2a03:4000:2x:xxx::/64 dev eth0

    aber noch keine änderung


    Es schaut gerade so aus:

  • Wieso haben die IPs in den Dockern die netmask 80? Hast du auf deinem Host IPv6 Forwarding aktiviert (Stichwort sysctl)?

    Ja, ich habe mir die Info aus dem Web zusammen geklaubt, siehe meinen ersten post:

    Code
    1. net.ipv6.conf.default.forwarding=1
    2. net.ipv6.conf.all.forwarding=1
    3. net.ipv6.conf.eth0.proxy_ndp=0
    4. net.ipv6.conf.default.accept_ra=0
    5. net.ipv6.conf.default.autoconf=0
    6. net.ipv6.conf.all.accept_ra=0
    7. net.ipv6.conf.all.autoconf=0
    8. net.ipv6.conf.eth0.accept_ra=0
    9. net.ipv6.conf.eth0.autoconf=0

    Von ipv6 verstehe ich noch sehr wenig, muss ich zugeben.

  • Bei mir sieht das auschnittsweise so aus.

    Host (Proxmox):

    sysctl.conf

    Code
    1. net.ipv6.conf.all.forwarding=1


    Gast (LXC):

    Code
    1. iface eth0 inet6 static
    2. address 2a03:4000:yy:yy::101:1
    3. netmask 64
    4. gateway 2a03:4000:yy:yy::1:1

    xx:xx --> 1. IPv6

    yy:yy --> Zusatz IPv6


    Läuft wunderbar!