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
    {
      "ipv6": true,
      "fixed-cidr-v6": "2a03:4000:6:****:1::/80"
    }


    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
    $ ip -6 route add 2a03:4000:6:****:1::/80 dev docker0
    $ sysctl net.ipv6.conf.default.forwarding=1
    $ 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
    networks:
      mynetwork:
        driver: bridge
        enable_ipv6: true
        ipam:
          driver: default
          config:
            - subnet: 172.20.0.0/24
            - 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?

  • 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

  • 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?

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

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

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

    Die originäre jedoch funktioniert:

    Code
    ping6 2a03:4000:2x:xx::1
    16 bytes from 2a03:4000:2x:xx::1, icmp_seq=0 hlim=58 time=582.119 ms
    16 bytes from 2a03:4000:2x:xx::1, icmp_seq=1 hlim=58 time=15.719 ms
    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
    net.ipv6.conf.default.forwarding=1
    net.ipv6.conf.all.forwarding=1
    net.ipv6.conf.eth0.proxy_ndp=0
    net.ipv6.conf.default.accept_ra=0
    net.ipv6.conf.default.autoconf=0
    net.ipv6.conf.all.accept_ra=0
    net.ipv6.conf.all.autoconf=0
    net.ipv6.conf.eth0.accept_ra=0
    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.

  • 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
    Address=2a03:4000:2x:xxx::1/64
    #Gateway=fe80::1
    Gateway=2a03:4000:xx:xx:xxx:xxx:xxx:95b7 <- Adresse aus dem SCP in der Gateway Spalte
    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
    net.ipv6.conf.default.forwarding=1
    net.ipv6.conf.all.forwarding=1
    net.ipv6.conf.eth0.proxy_ndp=0
    net.ipv6.conf.default.accept_ra=0
    net.ipv6.conf.default.autoconf=0
    net.ipv6.conf.all.accept_ra=0
    net.ipv6.conf.all.autoconf=0
    net.ipv6.conf.eth0.accept_ra=0
    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
    net.ipv6.conf.all.forwarding=1


    Gast (LXC):

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

    xx:xx --> 1. IPv6

    yy:yy --> Zusatz IPv6


    Läuft wunderbar!