阻止 Google Compute 實例配置第二個網路介面
我正在執行 Debian Buster 的 Google Compute Engine 中啟動一個 VM,並使用兩個網路介面對其進行配置。
第一個使用臨時 IP 配置,並分配給通過 DHCP 配置的公共可路由網路。我想保持原樣。
第二個介面使用靜態 IP 配置,並分配給專用網路。我想阻止 GCE 使用 DHCP 來配置這個介面,而是使用 systemd-networkd 自己來配置它,以便輕鬆添加一些自定義路由。
雖然 systemd-networkd 配置確實成功,但問題是當機器重新啟動時,GCE 的 DHCP 設置在 systemd-networkd 設置之後執行,並覆蓋了我的自定義配置。
到目前為止,我已經嘗試了很多方法來解決這個問題,包括:
- 禁用 /etc/network/interfaces 中 /var/run/interfaces.d 的條目
- 添加自定義 systemd 服務以在 GCE 的網路服務之後執行
到目前為止唯一有效的是一個可怕的腳本黑客在啟動後等待 30 秒,然後再次啟動 systemd-networkd 以覆蓋 GCE 配置。
我可以在作業系統級別進行一些更清晰的配置更改,或者在網路/伺服器設置期間進行配置設置,以防止 GCE 自動配置第二個網路介面?
編輯#1:
這是我更喜歡使用的 systemd-networkd 配置範例:
[Match] Name=ens5 [Network] Address=10.1.3.30/32 LinkLocalAddressing=no [Route] Destination=10.1.3.1/32 Scope=link [Route] Gateway=10.1.3.1 Destination=10.1.3.0/24 GatewayOnlink=yes [Route] Gateway=10.1.3.1 Destination=10.1.1.0/24 GatewayOnlink=yes [Route] Gateway=10.1.3.1 Destination=10.1.2.0/24 GatewayOnlink=yes [Route] Gateway=10.1.3.1 Destination=10.10.0.0/24 GatewayOnlink=yes
使用此配置,我可以在介面上設置其他路由到其他子網。請注意,這些其他子網可能在也可能不在 GCP 上。
上述配置有效,即使我必須將 10.1.3.30 靜態 IP 地址聲明為我的 GCE 伺服器設置的一部分。問題只是我不能讓 GCE 停止對介面進行自己的配置,這會覆蓋上面的配置。在 Azure 上,我可以簡單地註釋掉對in的
source
引用。/var/run/network/interfaces.d``/etc/network/interfaces
至於為什麼我更喜歡這種設置,這是一種通過伺服器配置管理軟體設置內部網路的優雅方法——我只需將上述配置放入
/etc/systemd/network/
並發出systemctl enable systemd-networkd && systemctl restart systemd-networkd
,它會處理配置介面並將配置設置為也在啟動時發生。更新#1:
我已經在 GCP 的問題跟踪器中送出了https://issuetracker.google.com/issues/153513472,希望他們能解決。當他們這樣做時,我會相應地更新問題。
更新#2:
經過一輪付費 GCP 支持後,他們向我指出了另一個持續存在的問題:https ://issuetracker.google.com/issues/167371074
支持代理還建議其他使用者只需放置 cron 腳本以定期重新啟動網路。
我已經根據我的特定網路需求調整了這個建議,並使用了以下 crontab 條目:
* * * * * /usr/bin/test -z "$(/sbin/ip route | /bin/grep "10.1.1.0/24")" && /bin/systemctl restart systemd-networkd
其中 ‘10.1.1.0/24’ 是一個子網,我知道在我的路由配置中不應失去。
更新#3:
最後,一個乾淨而令人滿意的答案!Google工程師告訴我,
google-guest-agent.service
作為他們在 Debian 系統上的來賓環境的一部分執行的它有一個網路守護程序,當它重新配置任何介面時,它會dhclient
直接呼叫。看起來dhclient
這種方式會消除現有的路線。鑑於此,一個簡單的解決方法是通過在/etc/dhcp/dhclient-exit-hooks.d/
.就我而言,我在以下位置添加了以下腳本
/etc/dhcp/dhclient-exit-hooks.d/systemd-networkd
:case $reason in BOUND|RENEW|REBIND|REBOOT) systemctl restart systemd-networkd.service ;; esac
這似乎解決了問題,包括重新啟動。
不幸的是,您目前無法在 GCP 上實現這種情況。您可以使用所描述的方法來管理內部 IP,方法是遵循將靜態內部 IP 地址用於輔助網路介面之類的文件。
作為一種可能的解決方法,您可以在此組件下的Google 問題跟踪器上送出功能請求。