Docker 导致阿里云 ECS 内网互通失败

Docker/容器
390
0
0
2022-11-05
标签   Docker

我的阿里云账号下有三台服务器:

深圳 可用区 D

A:Ubuntu 服务器,内网:172.28.119.31

B:Windows 服务器,内网:172.28.119.32

深圳 可用区 E

C:Ubuntu 服务器,内网:172.17.230.3

三台服务器在同一个 VPC 专有网络下,也在同一个安全组下。按照 阿里云官方说明,三台服务器是默认内网互通的。

问题

A 和 C 之间内网无法 ping 通,但是 A 和 C 内网都能 ping 通 B。

检查

查看 A 服务器路由表:

root@ubuntu-20220304:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.28.127.253  0.0.0.0         UG    100    0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.21.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-72f5d0a4f9cd
172.22.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-bf5ce375897e
172.28.112.0    0.0.0.0         255.255.240.0   U     0      0        0 eth0
172.28.127.253  0.0.0.0         255.255.255.255 UH    100    0        0 eth0

查看 C 服务器路由表:

root@ubuntu-20220616:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.239.253  0.0.0.0         UG    100    0        0 eth0
172.17.224.0    0.0.0.0         255.255.240.0   U     0      0        0 eth0
172.17.239.253  0.0.0.0         255.255.255.255 UH    100    0        0 eth0

发现 A 服务器路由表里 172.17.0.0 被 docker 占用,而 C 服务器 IP 正好是 172.17.230.3

查看 docker bridge 网络配置:

{ 
    "Name": "bridge", 
    "Id": "fdd7ac1fee6e82486d42e53d8a3cce1164411b65de6a963bf5342aab019f7f7e", 
    "Created": "2022-06-16T13:22:29.147640187+08:00", 
    "Scope": "local", 
    "Driver": "bridge", 
    "EnableIPv6": false, 
    "IPAM": { 
        "Driver": "default", 
        "Options": null, 
        "Config": [ 
            { 
                "Subnet": "172.17.0.0/16", 
                "Gateway": "172.17.0.1" 
            } 
        ] 
    }, 
    "Internal": false, 
    "Attachable": false, 
    "Ingress": false, 
    "ConfigFrom": { 
        "Network": "" 
    }, 
    "ConfigOnly": false, 
    "Containers": {}, 
    "Options": { 
        "com.docker.network.bridge.default_bridge": "true", 
        "com.docker.network.bridge.enable_icc": "true", 
        "com.docker.network.bridge.enable_ip_masquerade": "true", 
        "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", 
        "com.docker.network.bridge.name": "docker0", 
        "com.docker.network.driver.mtu": "1500" 
    }, 
    "Labels": {}, 
    "CreatedTime": 1655356949147
}

解决

方案一

添加 A 服务器路由:

$ route add -net 172.17.230.0/24 gw 172.28.127.253 dev eth0

这是临时方案,重启服务器会失效。

方案二

更换 C 服务器虚拟交换机,使用其他内网网段

方案三

更换 A 服务器 docker 的默认网段

编辑 /etc/docker/daemon.json(不存在则创建一个)

$ vim /etc/docker/daemon.json

添加以下代码:

{ 
    "bip": "172.20.0.1/16"
}

重启 docker 服务:

$ systemctl restart docker

参考:Configure the default bridge network