如何阻止Docker错误的将端口映射到IPv6上/如何disable IPv6

情景

docker 默认情况下会同时将端口映射于 IPv4 与 IPv6 两者上。
而且有的时候会出现只绑定到了 IPv6,导致服务无法正常访问的情况。

该问题的详细讨论参见这里
Port redirecting binding to IPv6 but not IPv4 interfaces.

image

现在通用的始终还是 IPv4, 因此最简单的做法就是关闭 IPv6.

解决方法 (CentOS / RHEL 7/Debian10.6)

1. 在 /etc/sysctl.conf 上加入以下设置, 此方法不需要重启

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

然后执行 sysctl -p 使其生效

注意:

如果你正在使用 SSH 的 X11 Forwarding 的, 要记得启用下面的配置。
/etc/ssh/sshd_config 中,找到 AddressFamily, 设置为

AddressFamily inet

重启 sshd 服务,systemctl restart sshdhttps://github.com/lanlin/notes/issues/80#issuecomment-589460035)

2. 如果第一种方法无效,那么先删除上面的设置,再修改引导文件

打开 /etc/default/grub
找到 GRUB_CMDLINE_LINUX="..." 或者有的叫做 GRUB_CMDLINE_LINUX_DEFAULT="..."

GRUB_CMDLINE_LINUX="ipv6.disable=1  ..."
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1  ..."

ipv6.disable=1 加入到最前面,注意与后面的其他值空格隔开。

执行 grub2-mkconfig -o /boot/grub2/grub.cfg
该命令会重新生成一个引导文件,覆盖掉现有的文件。

然后重启系统

3. 最后检测是否已关闭 IPv6

现在重新开启 docker 容器等,查看相关端口是否正确绑定到 IPv4 上了

// 查看是否仍有 IPv6 相关地址信息
ip addr show | grep net6

// 查看端口监听是否均为 IPv4
netstat -tapn         

4. 如果上述方法仍然无效,检测 IPv4 的转发

说明:

为了使LVS路由器正确地将网络数据包转发到真实服务器,
每个LVS路由器节点必须在内核中启用IP转发。

执行 /sbin/sysctl net.ipv4.ip_forward,如果得到以下结果,说明需要修改

net.ipv4.ip_forward = 0

打开 /etc/sysctl.conf,添加以下代码

net.ipv4.ip_forward = 1

保存后执行 sysctl -p 使其生效

再次执行 /sbin/sysctl net.ipv4.ip_forward 查看结果,如果由 0 变为 1 则生效了。

最后执行 3 中的方法加以检验。