ip route show 顯示的是虛擬機上的路由表,這些路由表決定了不同的 IP 地址範圍應該通過哪些網路介面來傳送。
1 2 3
$ ip route show 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 172.21.0.0/16 dev br-914aac2c12e6 proto kernel scope link src 172.21.0.1
這一行輸出的 ip route show 顯示了兩個路由,涉及到 Docker 虛擬網路接口 docker0 和 br-914aac2c12e6。以下是說明:
docker0
dev docker0:表示這條路由是通過 docker0 網卡來實現的。docker0 是 Docker 預設的虛擬網橋接口,它通常用來連接 Docker 容器和宿主機的網路。
proto kernel:這表示該路由是由內核自動添加的,通常這是 Docker 或其他系統設置所創建的路由。
$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 link/ether 08:00:27:e8:bf:7a brd ff:ff:ff:ff:ff:ff 4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:b7:3a:7d:af brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever 128: br-914aac2c12e6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:0c:39:6d:54 brd ff:ff:ff:ff:ff:ff inet 172.21.0.1/16 brd 172.21.255.255 scope global br-914aac2c12e6 valid_lft forever preferred_lft forever inet6 fe80::42:cff:fe39:6d54/64 scope link valid_lft forever preferred_lft forever 140: vethade60a8@if139: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-914aac2c12e6 state UP group default link/ether f6:db:b7:05:ca:8d brd ff:ff:ff:ff:ff:ff link-netnsid 2 inet6 fe80::f4db:b7ff:fe05:ca8d/64 scope link valid_lft forever preferred_lft forever 166: vethb5ffc04@if165: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-914aac2c12e6 state UP group default link/ether 6a:84:4c:21:62:70 brd ff:ff:ff:ff:ff:ff link-netnsid 6 inet6 fe80::6884:4cff:fe21:6270/64 scope link valid_lft forever preferred_lft forever 168: veth30b3934@if167: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-914aac2c12e6 state UP group default link/ether fa:26:38:79:8b:2c brd ff:ff:ff:ff:ff:ff link-netnsid 7 inet6 fe80::f826:38ff:fe79:8b2c/64 scope link valid_lft forever preferred_lft forever
解決的步驟
(1) 啟用網路介面
首先,手動啟用 enp0s3 介面:
1
$ sudo ip linkset enp0s3 up
再次確認介面狀態,確保其已變為 UP:
1 2 3 4 5 6 7
$ ip addr show enp0s3 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:e8:bf:7a brd ff:ff:ff:ff:ff:ff inet6 fd00::a00:27ff:fee8:bf7a/64 scope global dynamic mngtmpaddr valid_lft 86394sec preferred_lft 14394sec inet6 fe80::a00:27ff:fee8:bf7a/64 scope link valid_lft forever preferred_lft forever
(2) 透過 DHCP 重新獲取 IP 位址
由於介面 enp0s3 仍然沒有正確的 IPv4 位址,因此執行 DHCP 客戶端來請求 IP 位址:
1 2 3 4 5 6 7 8 9 10
$ sudo dhclient enp0s3 $ ip addr show enp0s3 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:e8:bf:7a brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3 valid_lft 86386sec preferred_lft 86386sec inet6 fd00::a00:27ff:fee8:bf7a/64 scope global dynamic mngtmpaddr valid_lft 86350sec preferred_lft 14350sec inet6 fe80::a00:27ff:fee8:bf7a/64 scope link valid_lft forever preferred_lft forever
執行 ip addr show enp0s3,此時可見 inet 欄位獲得了動態 IPv4 位址 10.0.2.15/24:
1
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
(3) 確認並修正路由設定
檢查路由表:
1
ip route show
結果顯示如下。其中 default 表示默認路由,表示如果目標 IP 地址不在其他路由條目中,則會使用這條路由。via 10.0.2.2 表示所有未知的 IP 地址將通過 IP 地址為 10.0.2.2 的路由器轉發。dev enp0s3 則說明這條路由會通過網路介面 enp0s3 來達成。
1 2
default via 10.0.2.2 dev enp0s3 10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15
這表示 enp0s3 已經有一個預設 Gateway 10.0.2.2,應該可以正常連線。
(4) 測試網路連線
測試是否可以連線到外部網路 External IP,這邊以 Google’s DNS server (8.8.8.8) 為例 :
1
ping -c 4 8.8.8.8
如果 ping 成功,則表示網際網路連線正常,但若 ping google.com 失敗,則可能是 DNS 設定問題。
(5) 修正 DNS 設定(如有需要)
如果 ping google.com 失敗,可能是 /etc/resolv.conf 缺少 DNS 伺服器。可手動添加 Google DNS: