配置 Docker 支持 IPv6 并排查宿主机 IPv6 无法访问容器的问题
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 addrdocker network inspect bridgess -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