在 AWS 上的 WMS 主機僅提供內網服務,所有外部連線都統一經由 TPM1 (172.17.10.10) 這台主機進行 NAT 轉址。
但實際運行一段時間後,發現主機的預設路由 (default gateway) 會不定期被系統自動改回 172.17.10.1,導致外部通訊中斷。
問題現象
執行 route -n 或 ip route 觀察到如下狀況:
root@wms:~# route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.10.10 0.0.0.0 UG 0 0 0 ens5
0.0.0.0 172.17.10.1 0.0.0.0 UG 100 0 0 ens5
...
手動設定的 gateway (172.17.10.10) 經常在系統重新啟動或 DHCP 更新租約後消失。
問題原因
檢視系統日誌 (journalctl -u systemd-networkd -b) 後,發現關鍵訊息:
ens5: DHCPv4 address 172.17.10.20/24, gateway 172.17.10.1 acquired from 172.17.10.1
👉 原因是:
systemd-networkd 透過 DHCP 自動取得 IP 時,也同時套用了 DHCP 伺服器提供的 gateway(172.17.10.1)。
因此,每當 DHCP 重新租約,就會覆蓋掉手動設定的路由。
解決思路
我們要達成兩個目標:
- 保留 DHCP 取得 IP 的功能(方便 IP 自動管理)
- 拒絕 DHCP 自動下發的路由(避免 gateway 被改回 172.17.10.1)
- 手動指定正確的 default route(172.17.10.10)
Ubuntu 20.04 之後的版本使用 Netplan + systemd-networkd,所以最佳做法是直接在 Netplan 設定中控制 DHCP 行為。
Netplan 設定修改
原始設定(/etc/netplan/50-cloud-init.yaml)如下:
network:
version: 2
ethernets:
ens5:
match:
macaddress: "06:43:c1:61:32:c4"
dhcp4: true
dhcp6: false
set-name: "ens5"
這樣會讓 DHCP 同時下發 IP 與路由。
我們要改成「保留 DHCP IP,但不接受 DHCP 路由」,並明確指定正確的 gateway。
✅ 修改後設定
# /etc/netplan/50-cloud-init.yaml
network:
version: 2
renderer: networkd
ethernets:
ens5:
match:
macaddress: "06:43:c1:61:32:c4"
set-name: "ens5"
dhcp4: true
dhcp6: false
dhcp4-overrides:
use-routes: false # 不接受 DHCP 傳來的預設路由
routes:
- to: 0.0.0.0/0
via: 172.17.10.10 # 主要路由(TPM1 NAT)
metric: 10
- to: 0.0.0.0/0
via: 172.17.10.1 # 備援路由
metric: 100
套用設定(安全操作)
建議使用 netplan try(會提供 120 秒倒數確認,防止 SSH 斷線):
sudo cp /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak.$(date +%F-%H%M%S)
sudo netplan generate
sudo netplan try
若連線正常,按 Enter 以確認永久套用。
之後可以再用以下指令確認結果:
ip route show default
期望輸出:
default via 172.17.10.10 dev ens5 proto static metric 10
default via 172.17.10.1 dev ens5 proto static metric 100
補充:系統行為說明
dhcp4-overrides.use-routes: false
→ 告訴systemd-networkd不要安裝 DHCP 提供的路由。routes:
→ 手動指定 default gateway(支援多條,透過 metric 決定優先順序)。renderer: networkd
→ 確保使用 systemd-networkd 作為後端管理(AWS Ubuntu 預設如此)。
結論
這樣設定後,主機仍能透過 DHCP 自動取得 IP,但預設路由將固定為:
主要:172.17.10.10(TPM1 NAT)
備援:172.17.10.1(DHCP 原始 gateway)
即使 DHCP 重新租約、或 networkd 重新啟動,也不會再改動 default route。
✅ 問題永久解決。
延伸建議
若你的環境存在不穩定的 DHCP 伺服器,仍可搭配一個「自我修復腳本」:
- 每分鐘檢查路由是否存在;
- 若被移除,自動補回。
這樣可作為暫時的保險機制,但在本案例中已不再需要。
實際環境摘要
| 項目 | 值 |
|---|---|
| 主機類型 | AWS EC2(內網服務) |
| 作業系統 | Ubuntu 24.04 LTS |
| 網路服務 | systemd-networkd + Netplan |
| 問題 | DHCP 導致 gateway 重設為 172.17.10.1 |
| 解法 | use-routes: false + 明確指定路由 |