Dhcp

阻止 Google Compute 實例配置第二個網路介面

  • September 21, 2020

我正在執行 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 問題跟踪器上送出功能請求

引用自:https://serverfault.com/questions/1007936