情景
docker 默认情况下会同时将端口映射于 IPv4 与 IPv6 两者上。
而且有的时候会出现只绑定到了 IPv6,导致服务无法正常访问的情况。
该问题的详细讨论参见这里
Port redirecting binding to IPv6 but not IPv4 interfaces.
现在通用的始终还是 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 sshd
https://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 中的方法加以检验。