Docker 導致阿里雲 ECS 內網互通失敗

huzhuolei發表於2022-07-02

我的阿里雲賬號下有三臺伺服器:

深圳 可用區 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

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章