Назад | Перейти на главную страницу

Подключение IPv6 в Docker на хосте Vultr с ndppd

я нашел другой ответ и просмотрел официальную Документы Docker ipv6, но у меня все еще возникают проблемы с IPv6 и Docker. Если я выставлю публичные порты в контейнерах Docker, я могу подключиться к ним через IPv6. Изнутри контейнера я могу выполнить ping6 на другие хосты IPv6 у других провайдеров. Однако, если я попытаюсь установить TCP-соединение через IPv6 (http, telnet, nc и т. Д.), Произойдет тайм-аут и произойдет сбой.

Вот мой публичный адаптер:

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

В 2001:19f0:6001:1c12:/64 - это тот, который мне небезразличен (Vultr позволяет вам зарезервировать IPv6-адреса, которые переживут перестроения, но по какой-то причине он также дает вам другой адрес). Я настраиваю свой daemon.json для Docker вот так:

{
    "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://"]
}

и мой ndppd conf вот так:

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

Я могу ping6 нормально:

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

.. чего я не мог сделать до запуска ndppd, но я все еще не могу подключиться через исходящий IPv6:

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

Что мне не хватает?

Оказывается, я был на правильном пути, и моя реальная проблема заключалась в брандмауэре. Следующее должно быть установлено в /etc/default/ufw если вы используете UFW для настройки правил iptables:

DEFAULT_FORWARD_POLICY="ACCEPT"

Для полноты изложения Докер daemon.json не нужен ::1 в подсети:

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

..и ndppd.conf должно выглядеть так:

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