本地和 GCP 之間的 VPN:路由共享但 ping 不通過
一個多星期以來,我一直在為本地和 GCP 之間的 VPN 設置苦苦掙扎。在這一點上,我完全沒有想法,很想得到網路專家的幫助。
目標
最終目標很簡單:讓 GCP 上的 VM 實例與本地 VM 無縫通信——但需要 2 個路由器。
設置如下所示:
GCP_VM OP_VM 10.0.0.25 10.100.0.200 | | | (DC Router Gateway) | 10.100.0.80 | | └-- HA_VPN (AS65001) <==========> Router (AS65002) --┘ Public IP: xx.xx.xx.xx yy.yy.yy.yy Advertise: 10.0.0.0/24 BGP 10.100.0.0/24 BGP VPN IP Range: 169.254.0.1/30 169.254.0.2 (as Peer) Private IP: NA 10.100.0.50
這裡的複雜之處在於,
Router
這裡沒有直接連接到OP_VM
. 這是我們無法控制的本地設置。從其他路由器OP_VM
獲取它的 IP ,然後我們被放到同一個 LAN 上。我們只在數據中心獲得一個機架,並且需要到達由另一方託管的(在其他機架中)。我們的機架與.10.100.0.200``Router``OP_VM``10.100.0.50
有了這個,我希望能夠完成以下工作:
me@GCP_VM:10.0.0.25:~$ ping 10.100.0.200
目前狀態
通過上述設置,從雙方的日誌來看,VPN 和 BGP 看起來都很健康。
從
GCP_VM
,我可以 ping10.100.0.50
(Router
) 成功。me@GCP_VM:10.0.0.25:~$ ping 10.100.0.50 PING 10.100.0.50 (10.100.0.50) 56(84) bytes of data. 64 bytes from 10.100.0.50: icmp_seq=1 ttl=254 time=24.9 ms ...
另外,從
Router
,我可以確認我可以 ping10.100.0.200
(OP_VM
)。# With the Router setup of something like # # ip route 10.100.0.0/24 gateway 10.100.0.80 root@Router:10.100.0.50:~$ ping 10.100.0.200 ping 10.100.0.200 received from 10.100.0.200: icmp_seq=0 ttl=63 time=0.583ms received from 10.100.0.200: icmp_seq=1 ttl=63 time=0.571ms 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max = 0.571/0.577/0.583 ms
GCP_VM
但是,從ping 到10.100.0.200
(OP_VM
)失去了。# With the Router setup of something like # # ip route 10.100.0.0/24 gateway 10.100.0.80 me@GCP_VM:10.0.0.25:~$ ping 10.100.0.200 PING 10.100.0.200 (10.100.0.200) 56(84) bytes of data. ^C --- 10.100.0.200 ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 3051ms
我可能誤解了網關設置,但是像下面這樣更改路由會給我帶來不同的結果:
# With the Router setup of something like # # ip route 10.100.0.0/24 gateway 10.100.0.50 # ~~ <- Router itself me@GCP_VM:10.0.0.25:~$ ping 10.100.0.200 PING 10.100.0.200 (10.100.0.200) 56(84) bytes of data. From 169.254.0.2 icmp_seq=7 Destination Host Unreachable From 169.254.0.2 icmp_seq=6 Destination Host Unreachable From 169.254.0.2 icmp_seq=5 Destination Host Unreachable From 169.254.0.2 icmp_seq=4 Destination Host Unreachable From 169.254.0.2 icmp_seq=3 Destination Host Unreachable From 169.254.0.2 icmp_seq=2 Destination Host Unreachable From 169.254.0.2 icmp_seq=1 Destination Host Unreachable ^C --- 10.100.0.200 ping statistics --- 9 packets transmitted, 0 received, +7 errors, 100% packet loss, time 8141ms pipe 7
使用此網關設置,
Router
無法再 pingOP_VM
。至少在我看來,VPN 已建立並且 IP 已正確發布。但從實際網路的角度來看,這看起來並不正確。問題
我認為 GCP 方面沒有更多工作要做,而且問題似乎純粹是在本地。
是否有任何設置問題或可能導致 VPN、BGP、ARP 等行為不端的問題?什麼會導致這種路由似乎是共享的,但實際上無法訪問它們的情況?
其他注意事項
- 我已確認
Router
包含的 ARP 表10.100.0.200
- 我可以看到在 GCP 中傳播的路由
- 我已經使用 GCP VPC 的防火牆設置進行了測試,以允許
169.254.0.0/30
和10.100.0.0/24
- 我最終需要從 GKE 訪問,但我已經確認 GKE 的行為與
GCP_VM
Router
來自雅馬哈- 嘗試了 TCPdump(在 Yamaha 路由器中),但在日誌
packetdump
中沒有看到10.0.0.25
- TCPdump 確實顯示了
10.0.0.25
我nmap -Pn 10.100.0.200
從執行時的痕跡GCP_VM
,但單行如下:2019/12/21 16:35:40: LAN1 OUT:IP TCP 10.100.0.227:50516 > 10.103.24.1:80
更新(12 月 24 日)
我已經完成了和
tcpdump
之間的簡單 ping操作。GCP_VM``Router
從
GCP_VM
到Router
(從 的日誌GCP_VM
)$ ping 10.100.0.50 > /dev/null & $ sudo tcpdump -i eth0 | grep 10.100 ... 18:49:18.696178 IP GCP_VM.(snip) > 10.100.0.50: ICMP echo request , id 32396, seq 0, length 64 18:49:18.700395 IP 10.100.0.50 > GCP_VM.(snip): ICMP echo reply, id 32396, seq 0, length 64
從
Router
到GCP_VM
(從 的日誌GCP_VM
)# ping from Router, with `ping 10.0.0.25` $ sudo tcpdump -i eth0 | grep 169.254 ... 18:40:18.554555 IP 169.254.0.2 > GCP_VM.(snip): ICMP echo request, id 3369, seq 0, length 72 18:40:18.554586 IP GCP_VM.(snip) > 169.254.0.2: ICMP echo reply, i d 3369, seq 0, length 72
雖然
tcpdump
顯示回復正在這裡發送,但它從未被Router
.此外,ping to
169.254.0.2
fromGCP_VM
也沒有回复。$ ping 169.254.0.2 > /dev/null & $ sudo tcpdump -i eth0 | grep 169.254 ... 18:59:07.113101 IP GCP_VM.(snip) > 169.254.0.2: ICMP echo request, i d 32531, seq 0, length 64 18:59:08.137103 IP GCP_VM.(snip) > 169.254.0.2: ICMP echo request, i d 32531, seq 1, length 64 ...
更新(12 月 27 日)
在將其源地址設置為 後,來自 的 Ping
Router
成功10.100.0.50
,因為它預設嘗試使用169.254.0.2
。ping 仍然沒有到達
OP_VM
,我仍然面臨 NAT 配置問題,以確保翻譯正確。更新(12 月 31 日)
連接終於建立起來了。我將在單獨的答案中總結為整理問題所採取的步驟。
經過大量的測試和調試,我已經解決了 GCP 和本地之間的連接問題。以下是所採取的步驟,以及在查明問題時所做的考慮。
分析來自兩個方向的流量
我缺乏從兩個方向剖析交通的考慮。這意味著分解每個數據包從/到源/目的地的傳輸方式,這樣可以清楚地了解根本原因可能在哪裡。
從 GCP 到本地的數據包
- 從
GCP_VM
(10.0.0.25
)發送到HA_VPN
(169.254.0.1/30
)的數據包- 從
GCP_VM
(10.0.0.25
)發送到Router (AS65002)
(10.100.0.50
)的數據包- 從
GCP_VM
(10.0.0.25
)發送到DC Router Gateway
(10.100.0.80
)的數據包- 從
GCP_VM
(10.0.0.25
)發送到OP_VM
(10.100.0.200
)的數據包- 從
Router (AS65002)
(10.100.0.50
)發送到OP_VM
(10.100.0.200
)的數據包從本地到 GCP 的數據包(返迴路徑)
- 從
OP_VM
(10.100.0.200
)發送到Router (AS65002)
(10.100.0.50
)的數據包- 從
OP_VM
(10.100.0.200
)發送到GCP_VM
(10.0.0.25
)的數據包- 從
Router (AS65002)
(10.100.0.50
)發送到GCP_VM
(10.0.0.25
)的數據包鑑於上述檢查點,以下是狀態:
- 這未經測試,因為 Cloud VPN 端點 (
169.254.0.1/30
) 不是 VPC 中路由的一部分- 我可以確認
ping
點擊Router (AS65002)
(10.100.0.50
),並且還返回了響應(這意味著相應的 #9 也被確認了)- 我無法確認點擊
ping
(DC Router Gateway
)10.100.0.80
,因為 ping 沒有收到響應- 我無法確認點擊
ping
(OP_VM
)10.100.0.200
,因為 ping 沒有收到響應- 我可以確認
ping
點擊OP_VM
(10.100.0.200
),並且還返回了響應(這意味著相應的 #7 也被確認了)- 如前所述,#6 也確認了此流量
- 沒有流量匹配這種情況
- 如前所述,#2 也確認了此流量
下面是描述情況的圖表
GCP_VM HA_VPN (AS65001) Router (AS65002) (DC Router Gateway) OP_VM 10.0.0.25 10.100.0.50 10.100.0.80 10.100.0.200 1. NA 2. +--------------------------------> OK (response returned) 3. +----------------------------------------------------x NG? 4. +---------------------------------------------------------------------------x NG? 5. +-----------------------------------------> OK (response returned) 6. OK <-----------------------------------------+ 7. No matching traffic 8. OK <--------------------------------+
這澄清了任何發起的流量都
GCP_VM
可能存在兩個問題:
- 可能性A。數據包未到達
OP_VM
(10.100.0.200
)- 可能性B。數據包到達
OP_VM
(10.100.0.200
),但響應未返回Router (AS65002)
(10.100.0.50
)我可以用上面的#5 和#6 確認數據包在 ( ) 處啟動時確實到達(
OP_VM
) 。這意味著,可能性 A不太可能。路由本身正在正常工作。10.100.0.200``Router (AS65002)``10.100.0.50
這意味著很有可能
ping
會失去響應,並且永遠不會回擊Router (AS65002)
(10.100.0.50
)。對於我這裡的具體情況,這種可能性 B是問題的根本原因。我可以通過創建一個模擬與上述相同設置的模擬網路並使用 Wireshark 在每個點進行監聽來確認這種情況。這意味著下圖是實際情況。
GCP_VM HA_VPN (AS65001) Router (AS65002) (DC Router Gateway) OP_VM 10.0.0.25 10.100.0.50 10.100.0.80 10.100.0.200 1. NA 2. +--------------------------------> OK (response returned) 3. +----------------------------------------------------> OK 4. +---------------------------------------------------------------------------> OK 5. +-----------------------------------------> OK (response returned) 6. OK <-----------------------------------------+ 7. Where should I sent packet to?? LOST ---------------------------+ 8. OK <--------------------------------+
解決方案
就我而言,當流量在 開始時
GCP_VM
,源 IP 設置為10.0.0.25
。這意味著,當OP_VM
嘗試將流量發送回來時,它找不到哪裡10.0.0.25
,並且封包遺失了。我必須添加一個靜態 NAT 條目,以便在數據包離開時將
Router (AS65002)
源 IP 映射10.0.0.25
到,以便可以正確地將流量路由回。收到響應後,NAT 再次生效,然後替換為,並將數據包發送回。10.100.0.50``Router (AS65002)``OP_VM``Router (AS65002)``Router (AS65002)``10.100.0.50``10.0.0.25``GCP_VM
它看起來像本地路由問題。我認為,
OP_VM
沒有路由,10.0.0.0/24
因此將其發送到預設網關DC Router Gateway
並在那裡被丟棄,因為DC Router Gateway (10.100.0.80)
也沒有路由10.0.0.0/24
(因為你有對等Router
)。要解決它,您應該將靜態路由設置
OP_VM
為10.0.0.0/24
通過Router
並保留DC Router Gateway
為預設網關。
ip route 10.100.0.0/24 gateway 10.100.0.50
您必須從中刪除路由Router
- 網路10.100.0.0/24
直接連接到他。編輯
從 GCP_VM,我可以成功 ping 10.100.0.50(路由器)。
此時,您似乎已經正確配置了 和 之間的對等
Router
互連HA_VPN
。您應該能夠 ping
GCP_VM
和OP_VM
fromRouter
以及Router
fromOP_VM
以走上正確的道路。使用類似的路由器設置
ip route 10.100.0.0/24 gateway 10.100.0.80
使用類似的路由器設置
ip route 10.100.0.0/24 gateway 10.100.0.80
您不需要這些路由,因為
Router
直接連接到子網10.100.0.0/24
並且有 IP10.100.0.50
但是,從 GCP_VM 到 10.100.0.200 (OP_VM) 的 ping 操作失去了。
這是預期的,因為
OP_VM
沒有DC Router Gateway
我10.0.0.0/24
上面提到的路由並且無法回复,您必須將靜態路由設置OP_VM
為10.0.0.0/24
通過Router
並保留DC Router Gateway
為預設網關。EDIT 2
OP_VM
發送回復是DC Router Gateway
因為它沒有到 10.100.0.0/24 的路由,並且它嘗試通過預設網關到達它,並且DC Router Gateway
因為也沒有路由而被丟棄。
OP_VM
您應該在 at或 at添加靜態路由DC Router Gateway
來10.100.0.0/24
解決它。