Networking

本地和 GCP 之間的 VPN:路由共享但 ping 不通過

  • January 15, 2020

一個多星期以來,我一直在為本地和 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,我可以 ping 10.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,我可以確認我可以 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

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無法再 ping OP_VM。至少在我看來,VPN 已建立並且 IP 已正確發布。但從實際網路的角度來看,這看起來並不正確。

問題

我認為 GCP 方面沒有更多工作要做,而且問題似乎純粹是在本地。

是否有任何設置問題或可能導致 VPN、BGP、ARP 等行為不端的問題?什麼會導致這種路由似乎是共享的,但實際上無法訪問它們的情況?


其他注意事項

  • 我已確認Router包含的 ARP 表10.100.0.200
  • 我可以看到在 GCP 中傳播的路由
  • 我已經使用 GCP VPC 的防火牆設置進行了測試,以允許169.254.0.0/3010.100.0.0/24
  • 我最終需要從 GKE 訪問,但我已經確認 GKE 的行為與GCP_VM
  • Router來自雅馬哈
  • 嘗試了 TCPdump(在 Yamaha 路由器中),但在日誌packetdump中沒有看到10.0.0.25
  • TCPdump 確實顯示了10.0.0.25nmap -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_VMRouter(從 的日誌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

RouterGCP_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.2fromGCP_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 日)

在將其源地址設置為 後,來自 的 PingRouter成功10.100.0.50,因為它預設嘗試使用169.254.0.2

ping 仍然沒有到達OP_VM,我仍然面臨 NAT 配置問題,以確保翻譯正確。

更新(12 月 31 日)

連接終於建立起來了。我將在單獨的答案中總結為整理問題所採取的步驟。

經過大量的測試和調試,我已經解決了 GCP 和本地之間的連接問題。以下是所採取的步驟,以及在查明問題時所做的考慮。

分析來自兩個方向的流量

我缺乏從兩個方向剖析交通的考慮。這意味著分解每個數據包從/到源/目的地的傳輸方式,這樣可以清楚地了解根本原因可能在哪裡。

從 GCP 到本地的數據包

  1. GCP_VM( 10.0.0.25)發送到HA_VPN( 169.254.0.1/30)的數據包
  2. GCP_VM( 10.0.0.25)發送到Router (AS65002)( 10.100.0.50)的數據包
  3. GCP_VM( 10.0.0.25)發送到DC Router Gateway( 10.100.0.80)的數據包
  4. GCP_VM( 10.0.0.25)發送到OP_VM( 10.100.0.200)的數據包
  5. Router (AS65002)( 10.100.0.50)發送到OP_VM( 10.100.0.200)的數據包

從本地到 GCP 的數據包(返迴路徑)

  1. OP_VM( 10.100.0.200)發送到Router (AS65002)( 10.100.0.50)的數據包
  2. OP_VM( 10.100.0.200)發送到GCP_VM( 10.0.0.25)的數據包
  3. Router (AS65002)( 10.100.0.50)發送到GCP_VM( 10.0.0.25)的數據包

鑑於上述檢查點,以下是狀態:

  1. 這未經測試,因為 Cloud VPN 端點 ( 169.254.0.1/30) 不是 VPC 中路由的一部分
  2. 我可以確認ping點擊Router (AS65002)( 10.100.0.50),並且還返回了響應(這意味著相應的 #9 也被確認了)
  3. 我無法確認點擊ping( DC Router Gateway) 10.100.0.80,因為 ping 沒有收到響應
  4. 我無法確認點擊ping( OP_VM) 10.100.0.200,因為 ping 沒有收到響應
  5. 我可以確認ping點擊OP_VM( 10.100.0.200),並且還返回了響應(這意味著相應的 #7 也被確認了)
  6. 如前所述,#6 也確認了此流量
  7. 沒有流量匹配這種情況
  8. 如前所述,#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_VM10.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

您應該能夠 pingGCP_VMOP_VMfromRouter以及RouterfromOP_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 Gateway10.0.0.0/24上面提到的路由並且無法回复,您必須將靜態路由設置OP_VM10.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 Gateway10.100.0.0/24解決它。

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