1 votes

Connectivité IPv6 dans Docker sur un hôte Vultr avec ndppd

J'ai trouvé une autre réponse et a regardé les documents officiels Documentation Docker ipv6 mais j'ai toujours des problèmes avec IPv6 et Docker. Si j'expose des ports publics sur les conteneurs Docker, je peux m'y connecter via IPv6. Depuis l'intérieur du conteneur, je peux envoyer des ping6 vers d'autres hôtes IPv6 sur d'autres fournisseurs. Cependant, si j'essaie d'établir une connexion TCP sur IPv6 (http, telnet, nc, etc.), elle est interrompue et échoue.

Voici mon adaptateur public :

2: ens3: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 56:00:01:46:4e:fe brd ff:ff:ff:ff:ff:ff
    inet 45.32.64.134/23 brd 45.32.65.255 scope global ens3
       valid_lft forever preferred_lft forever
    inet6 2001:19f0:6001:1c12:5400:1ff:fe46:4efe/64 scope global mngtmpaddr dynamic 
       valid_lft 2591898sec preferred_lft 604698sec
    inet6 2001:19f0:6001:1e43:5400:1ff:fe46:4efe/64 scope global mngtmpaddr dynamic 
       valid_lft 2591898sec preferred_lft 604698sec
    inet6 fe80::5400:1ff:fe46:4efe/64 scope link 
       valid_lft forever preferred_lft forever

El 2001:19f0:6001:1c12:/64 est celle qui m'intéresse (Vultr vous permet de réserver des adresses IPv6 qui survivront aux reconstructions, mais il vous donne aussi une autre adresse pour une raison quelconque). Je configure mon daemon.json pour Docker comme ceci :

{
    "tls": true,
    "tlsverify": true,
    "tlscacert": "/etc/docker/ca.pem",
    "tlscert": "/etc/docker/server.crt",
    "tlskey": "/etc/docker/server-key.pem",
    "ipv6": true,
    "fixed-cidr-v6": "2001:19f0:6001:1c12::1/80",
    "hosts": ["127.0.0.1:2376", "10.10.6.10:2376", "fd://"]
}

et mon conf ndppd comme ceci :

route-ttl 30000
proxy ens3 {
  router yes
  timeout 500
  ttl 30000
  rule 2001:19f0:6001:1c12::/64 {
    static
  }
}

Je peux ping6 bien :

docker exec -it mycontainer ping6 google.com
PING google.com (2607:f8b0:4007:80b::200e): 56 data bytes
64 bytes from 2607:f8b0:4007:80b::200e: seq=0 ttl=56 time=1.166 ms
64 bytes from 2607:f8b0:4007:80b::200e: seq=1 ttl=56 time=0.575 ms
64 bytes from 2607:f8b0:4007:80b::200e: seq=2 ttl=56 time=0.475 ms
^C
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.475/0.738/1.166 ms

ce que je ne pouvais pas faire avant l'exécution de ndppd, mais je ne peux toujours pas me connecter via IPv6 outbound :

docker run -it alpine ash -c "ip -6 addr show dev eth0; ip -6 route show"
191: eth0@if192: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 state UP 
    inet6 2001:19f0:6001:1c12::242:ac11:7/80 scope global flags 02 
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:7/64 scope link tentative 
       valid_lft forever preferred_lft forever
2001:19f0:6001:1c12::/80 dev eth0  metric 256 
fe80::/64 dev eth0  metric 256 
default via 2001:19f0:6001:1c12::1 dev eth0  metric 1024 
unreachable default dev lo  metric -1  error -101
ff00::/8 dev eth0  metric 256 
unreachable default dev lo  metric -1  error -101

Qu'est-ce que je rate ?

1 votes

Vous ne devriez pas utiliser /80 réseaux avec IPv6. Certaines choses posent problème si vos réseaux ne sont pas /64 . Voir cette réponse pour des liens sur les problèmes liés à l'utilisation de réseaux de tailles différentes de celles de l'UE. /64 .

0 votes

Alors, que dois-je utiliser pour mon argument Docker IPv6 fixed-cidr ? Si j'essaie 2001:19f0:6001:1c12::/64 o 2001:19f0:6001:1c12::1/64 Je reçois un failure to add ip to bridge: file exists erreur. Si j'essaie d'utiliser /128 Je reçois un failed to allocate gateway. No available addresses on this pool . Quelle est la bonne façon de subdiviser ce sous-réseau IPv6 ?

0 votes

Vous attribuez une adresse de la même manière que pour l'IPv4. Par exemple, vous pouvez attribuer une adresse IPv4 comme suit 10.11.12.13/24 ou, avec IPv6, vous pourriez assigner 2001:19f0:6001:1c12::242:ac11:7/64 plutôt que 2001:19f0:6001:1c12::242:ac11:7/80 .

2voto

djsumdog Points 1030

Il s'est avéré que j'étais sur la bonne voie et que mon vrai problème était le pare-feu. Les éléments suivants doivent être définis dans /etc/default/ufw si vous utilisez UFW pour configurer vos règles iptables :

DEFAULT_FORWARD_POLICY="ACCEPT"

Par souci d'exhaustivité, l'interface Docker daemon.json n'a pas besoin de la ::1 dans le sous-réseau :

"fixed-cidr-v6": "2001:19f0:6001:1c12::/80"

..et le ndppd.conf devrait ressembler à ce qui suit :

proxy ens3 {
  timeout 500
  ttl 30000
  rule 2001:19f0:6001:1c12::/80 {
    static
  }
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X