现象:
在浪潮云安装docker,隔几天就会无法访问,程序是正常运行的,尤其是集群部署时,甚至无法访问其他机器。
原因:
Docker daemon服务在启动过程中会检查系统的IP_FORWARD配置项,如果当前系统的IP_FORWARD功能处于停用状态,会帮我们临时启用IP_FORWARD功能,然而临时启用的IP_FORWARD功能会因为其他各种各样的原因失效。
Docker daemon启用IP_FORWARD功能是因为Docker容器默认的网络模式(bridge/网桥模式)会给每个容器分配一个私有IP,如果容器需要和外部通信,就需要使用到NAT。NAT需要IP_FORWARD功能支持,否则无法使用。
这也解释了为什么会出现在IP_FORWARD功能停用的情况下,使用bridge模式的容器内外均无法访问的情况。
只是在Linux下,出于安全考虑,默认是停用IP_FORWARD功能的,Docker daemon服务在启动时会检查IP_FORWARD功能是否已经启用,如果没有启用的话,Docker daemon会悄无声息的临时启用此功能,然而临时启用的IP_FORWARD功能并不能持久化,会因为其他命令的干扰导致失效。
比如三鹿零安全服务器优化这个恶心的工具
解决办法:
麻烦运维人员从服务器上卸载三鹿零这玩意~~~
sysctl net.ipv4.ip_forward
0表示未开启
echo 'net.ipv4.ip_forward = 1' >> /usr/lib/sysctl.d/50-default.conf
sysctl -p /usr/lib/sysctl.d/50-default.conf
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/99-sysctl.conf
sysctl -p /etc/sysctl.d/99-sysctl.conf
**修改network启动脚本,启动时手动设置ip_forward
**vi /etc/init.d/network
**找到start代码段,在apply_sysctl下方加入以下代码:
**sysctl -w net.ipv4.ip_forward=1 > /dev/null 2>&1
**重启network,检查是否生效
**systemctl daemon-reload
systemctl restart network
sysctl net.ipv4.ip_forward
再不行上终极武器crontab -e
0/1 * * * * sysctl -w net.ipv4.ip_forward=1