docker容器网络影响宿主机网络解决方案

docker容器网络影响宿主机网络解决方案
挽歌歌吖瞎吐槽
最近我在我日本大阪服务器上安装并配置 Docker
重启机器后发现公网访问异常,VNC救援 远程登录虽然能用,但外网服务完全不通了。排查了很久,终于定位到是 Docker 网络导致的冲突问题,部分情况会出现服务器重启网络冲突
问题背景
我之前一直是手动安装docker,之后在这台服务器上使用宝塔Docker,刚装完 Docker 后没太注意网络配置,重启服务器时发现:
- 公网 IP 无法正常访问(ping 不通,服务端口没响应)
- 服务器本地网络(VNC 远程桌面)可以连通
- 排查网络配置,发现没明显变化,但确实外网没通
这种情况让我怀疑是 Docker 安装后默认创建的网络环境影响了宿主机的网络路由和防火墙。但是也不排除是被攻击后拉入了黑洞
问题分析
一开始联系工程师并排查,是发现了docker导致异常,提供了两条临时命令进行解决
1 |
|
大致意思就是
Docker 安装时,会自动创建一些网络桥接(bridge)和虚拟网络接口(如 docker0
),并通过 iptables 规则实现容器与宿主机及外网的通信。默认情况下,这些网络配置一般不会影响宿主机的正常网络,但在某些环境下,尤其是服务器已有复杂网络配置或使用了特殊网段,Docker 的默认网络配置就可能冲突。
具体表现通常有:
- Docker 的默认
docker0
网桥使用了与宿主机公网或内网冲突的网段(比如 172.17.0.0/16) - Docker 自动修改了 iptables NAT 表,导致原有转发规则失效
- 网络路由表被改变,导致默认路由或策略路由失效
大致排查过程
查看网络接口和路由
我先使用
ip addr
和ip route
发现docker0
网桥接口存在,并且默认路由的优先级有些异常。检查 iptables 规则
之后通过
iptables -t nat -L -n -v
看到 Docker 自动添加的规则占据了很多,且部分规则覆盖了之前配置。确认 Docker 网络配置
使用
docker network ls
和docker network inspect bridge
发现默认桥接网段是 172.17.0.0/16,与宿主机某些内网策略冲突。测试临时禁用 docker0
关闭 Docker 服务后,宿主机网络恢复正常,确定是 Docker 的网络配置导致问题。
解决方案
1. 修改 Docker 默认桥接网段
修改 Docker 配置文件,指定一个不会与宿主机或内网冲突的网段:
1 | { |
- 在
/etc/docker/daemon.json
添加上述配置(没有文件则新建) - 重启 Docker 服务:
systemctl restart docker
这样 Docker 会使用新的网桥网段,避免冲突。
2. 重新加载并检查 iptables 规则
确认 iptables 规则不会覆盖宿主机重要的 NAT 转发和防火墙规则,必要时手动调整。
3. 固定 Docker 网络配置,避免重启后变动
通过配置文件锁定网络参数,防止服务器重启时 Docker 自动分配产生变动。
4. 如果不需要 Docker 默认桥接网络
可以考虑手动创建自定义网络,关闭默认桥接,减少对宿主机网络影响。
小涩话
你牛魔的docker!
当然不一定对所有人有用,能给个大致方法就好啦~