配置 Docker 支持 IPv6 并排查宿主机 IPv6 无法访问容器的问题
杂记 10

Docker 配置 IPv6 并排查宿主机无法访问容器的 IPv6 问题

1. 修改 Docker 配置

编辑 Docker 的配置文件 /etc/docker/daemon.json,添加以下内容:

{
  "ipv6": true,                 // 启用IPv6支持
  "fixed-cidr-v6": "fd12::/64", // 指定固定IPv6 CIDR块
  "ip6tables": true,            // 允许 Docker 管理 ip6tables 规则
  "experimental": true          // 启用实验性功能
}

修改后请重启 Docker:
sudo systemctl restart docker


2. 检查宿主机是否启用 IPv6

2.1 检查当前 IPv6 状态

cat /proc/sys/net/ipv6/conf/all/disable_ipv6
  • 返回 1:IPv6 被禁用,需要启用
  • 返回 0:IPv6 已启用

2.2 临时启用 IPv6(重启后失效)

echo 0 | sudo tee /proc/sys/net/ipv6/conf/all/disable_ipv6

验证是否成功:

cat /proc/sys/net/ipv6/conf/all/disable_ipv6

2.3 永久启用 IPv6

方法 1:修改 sysctl.conf(推荐)

sudo nano /etc/sysctl.conf

添加以下内容:

net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0

保存后应用更改:

sudo sysctl -p

方法 2:直接修改内核参数

sudo sed -i 's/net.ipv6.conf.all.disable_ipv6 = 1/net.ipv6.conf.all.disable_ipv6 = 0/g' /etc/sysctl.conf
sudo sed -i 's/net.ipv6.conf.default.disable_ipv6 = 1/net.ipv6.conf.default.disable_ipv6 = 0/g' /etc/sysctl.conf
sudo sysctl -p

2.4 检查网络接口是否获得 IPv6 地址

ip -6 addr show

应看到形如:

  • inet6 fd12::xxxx/64
  • inet6 2a01:xxxx::xxxx/64

如果没有,可尝试重启网络:

# Debian/Ubuntu
sudo systemctl restart networking

# RHEL/CentOS
sudo systemctl restart NetworkManager

2.5 测试 IPv6 网络连通性

方法 1:ping6

ping6 ipv6.google.com
ping6 2001:4860:4860::8888

方法 2:curl

curl -6 http://ipv6.google.com

如果报错 Could not resolve host,可能是 DNS 不支持 IPv6。


3. 配置防火墙允许 IPv6 流量

使用 UFW

sudo ufw allow proto tcp from any to any port 9999

使用 ip6tables

sudo ip6tables -A INPUT -p tcp --dport 35455 -j ACCEPT
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6  # Debian/Ubuntu 持久化规则

4. 验证 socat IPv6 端口转发

启动端口监听并转发:

socat TCP6-LISTEN:9999,reuseaddr,fork TCP4:127.0.0.1:9999 &

检查是否监听:

ss -tulnp | grep 9999

测试访问:

curl -v "http://[::1]:9999"

检查是否运行:

ps aux | grep socat

检查防火墙:

sudo ip6tables -L | grep 9999

5. 常见问题排查

Q1: 启用 IPv6 后网络变慢?

可能是 IPv6 路由质量差。可暂时禁用 IPv6:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1

Q2: ping6 能通,但 curl -6 失败?

可能是 DNS 问题,尝试使用 IP:

curl -6 http://[2a00:1450:4001:824::200e]

Q3: socat 监听失败 “Address already in use”?

可能是旧进程未关闭:

sudo pkill socat

✅ 总结

完成上述配置后,你的宿主机应能正常使用 IPv6 访问容器,并支持 IPv6 转发。若仍有问题,请提供以下信息以进一步排查:

  • ip -6 addr
  • docker network inspect bridge
  • ss -tulnp
  • socat 转发命令与日志输出

配置 Docker 支持 IPv6 并排查宿主机 IPv6 无法访问容器的问题
https://blog.427221.xyz/archives/pei-zhi-docker-zhi-chi-ipv6-bing-pai-cha-su-zhu-ji-ipv6-wu-fa-fang-wen-rong-qi-de-wen-ti
作者
qqq
发布于
更新于
许可