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

瞎吐槽

最近我在我日本大阪服务器上安装并配置 Docker
重启机器后发现公网访问异常,VNC救援 远程登录虽然能用,但外网服务完全不通了。排查了很久,终于定位到是 Docker 网络导致的冲突问题,部分情况会出现服务器重启网络冲突
712552866

问题背景

我之前一直是手动安装docker,之后在这台服务器上使用宝塔Docker,刚装完 Docker 后没太注意网络配置,重启服务器时发现:

  • 公网 IP 无法正常访问(ping 不通,服务端口没响应)
  • 服务器本地网络(VNC 远程桌面)可以连通
  • 排查网络配置,发现没明显变化,但确实外网没通

这种情况让我怀疑是 Docker 安装后默认创建的网络环境影响了宿主机的网络路由和防火墙。但是也不排除是被攻击后拉入了黑洞

994902271

问题分析

一开始联系工程师并排查,是发现了docker导致异常,提供了两条临时命令进行解决

1
2
3
4
5
6
7
8
9
10

ifconfig eth0 你的公网IP netmask 你的子网掩码
route add default gw 你的公网 eth0
ifdown eth0

(eth0换成你实际网卡)

curl www.baidu.com
ping www.baidu.com

大致意思就是
Docker 安装时,会自动创建一些网络桥接(bridge)和虚拟网络接口(如 docker0),并通过 iptables 规则实现容器与宿主机及外网的通信。默认情况下,这些网络配置一般不会影响宿主机的正常网络,但在某些环境下,尤其是服务器已有复杂网络配置或使用了特殊网段,Docker 的默认网络配置就可能冲突。

918142244

具体表现通常有:

  • Docker 的默认 docker0 网桥使用了与宿主机公网或内网冲突的网段(比如 172.17.0.0/16)
  • Docker 自动修改了 iptables NAT 表,导致原有转发规则失效
  • 网络路由表被改变,导致默认路由或策略路由失效

大致排查过程

  1. 查看网络接口和路由

    我先使用 ip addrip route 发现 docker0 网桥接口存在,并且默认路由的优先级有些异常。

  2. 检查 iptables 规则

    之后通过 iptables -t nat -L -n -v 看到 Docker 自动添加的规则占据了很多,且部分规则覆盖了之前配置。

  3. 确认 Docker 网络配置

    使用 docker network lsdocker network inspect bridge 发现默认桥接网段是 172.17.0.0/16,与宿主机某些内网策略冲突。

  4. 测试临时禁用 docker0

    关闭 Docker 服务后,宿主机网络恢复正常,确定是 Docker 的网络配置导致问题。

解决方案

215420191

1. 修改 Docker 默认桥接网段

修改 Docker 配置文件,指定一个不会与宿主机或内网冲突的网段:

1
2
3
{
"bip": "192.168.100.1/24"
}
  • /etc/docker/daemon.json 添加上述配置(没有文件则新建)
  • 重启 Docker 服务:systemctl restart docker

这样 Docker 会使用新的网桥网段,避免冲突。

2. 重新加载并检查 iptables 规则

确认 iptables 规则不会覆盖宿主机重要的 NAT 转发和防火墙规则,必要时手动调整。

3. 固定 Docker 网络配置,避免重启后变动

通过配置文件锁定网络参数,防止服务器重启时 Docker 自动分配产生变动。

4. 如果不需要 Docker 默认桥接网络

可以考虑手动创建自定义网络,关闭默认桥接,减少对宿主机网络影响。

066421873

小涩话

你牛魔的docker!

当然不一定对所有人有用,能给个大致方法就好啦~
885085940