
我有 2 個 VPC
- VPC1 - 預設 google 子網
- VPC2 - 不在 VPC1 中的單一附加子網
伺服器(instdual)設置,帶有來自 VPC1 的 nic0 和來自 VPC2 的 nic1
兩個網路卡上的靜態公用 IP
- 從外部 Ping 到公用 IP -> VPC1 工作
- 從外部 Ping 到公用 IP -> VPC2 不工作
另外設定 2 個實例 insta 和 instb,其中一個僅在 VPC1 上,另一個僅在 VPC2 上
- 從外部 Ping 到公共 IP -> VPC1 工作(insta)
從外部 Ping 到公用 IP -> VPC2 工作 (instb)
從 insta 我可以 ping instdual nic0
從 instb 我可以 ping instdual nic1
從 insta 我無法 ping 通 nic1 的私有 IP
- 從 instb 我無法 ping 通 nic0 的私有 IP
VPC 是網路對等互連 - 路由顯示正確
防火牆設定預設允許所有規則來否定防火牆問題。
基本上在instdual上我只能在nic0公共IP上訪問它。不是 nic1 公共 IP。
有任何想法嗎 ?我落後了 12 杯咖啡,現在看到的是兩倍。
答案1
這就是所缺少的(現在 100% 工作):
請依照下列步驟為具有多個介面的基於 Linux 的實例設定策略路由:
- 連接到配置有多個網路介面的實例:
gcloud 計算 ssh multinic-vm
- 使用 ifconfig 為 nic1 設定策略路由。以下範例假設 GCP 已將內部 IP 位址 192.168.0.2 指派給 nic1,閘道為 192.168.0.1。
sudo ifconfig eth1 192.168.0.2 網路遮罩 255.255.255.255 廣播 192.168.0.2 mtu 1430
sudo echo "1 rt1" | sudo tee -a /etc/iproute2/rt_tables # (sudo su - 如果權限被拒絕則首先)
sudo ip route add 192.168.0.1 src 192.168.0.2 dev eth1
sudo ip route src 192.168.0.2 dev eth1
sudo ip route def. add從 192.168.0.2/32 表 rt1
sudo ip 規則加入到 192.168.0.2/32 表 rt1
- 對實例上的其他介面(nic2、nic3...nic7)重複步驟 2 中的指令。
答案2
谷歌雲端有一些關於如何執行此操作的文件:https://cloud.google.com/vpc/docs/create-use-multiple-interfaces 但這缺乏有關如何確保其他介面在重新啟動後也能再次工作的資訊。
為了使其他外部 IP 持久存在,您需要確保在重新啟動後執行啟動策略路由的命令,但僅在啟動其他介面後才執行。這是由 dhcp 客戶端完成的。所以我能找到的最好方法是將腳本放入 /etc/dhcp/dhclient-exit-hooks.d/ 中,其中包含以下內容:
#!/bin/sh
#
if [[ $reason == "REBOOT" || $reason == "BOUND" ]] ; then
sudo ip route add 192.168.0.1 src 192.168.0.2 dev eth1
sudo ip route add default via 192.168.0.1 dev eth1 table rt1
sudo ip rule add from 192.168.0.2/32 table rt1
sudo ip rule add to 192.168.0.2/32 table rt1
fi
(將IP修改為內網IP)
如果您還希望能夠在啟動時將伺服器(例如 nginx 或 httpd)綁定到這些 IP 之一,那麼您會注意到這會失敗,因為伺服器在 dhcp-client 完成其任務之前啟動。克服這個問題的一種方法是允許軟體綁定到實際上尚未啟動的 IP。對於這個放
net.ipv4.ip_nonlocal_bind=1
進入 /etc/sysctl.d/10-policyrouting.conf