NOTICE: 2022/03/21 以後,GCP Classic VPN 已經 deprecate BGP 了,所以不鼓勵使用 Classic VPN,而 AWS 則是已經沒有 Classic VPN 的選項,都改成 Site-to-site VPN 了
架構
※ IP CIDR 僅供參考
※ 中間的 VPN Connection 是 1 ≥ 條 VPN tunnel(s)
※ AWS VPN Gateway == GCP Cloud VPN
圖中的顏色意義:
• 藍色:預先準備好,包含 VPC Networking、CIDR、VM Instance
• 紅色:本文介紹過程中建立的資源與設定
• 紫色:本文介紹過程中,可能需要修改的,像是 Firewall / Security Groups
預先準備
- GCP 一組 reserved static IP
- 確認 GCP 的 VM 有套用允許 ICMP 或 SSH 連入的 firewall
- 確認 AWS 的 VM 有套用允許 ICMP 或 SSH 連入的 security group,subnet 有套用允許 ICMP 或 SSH 連入得 NACL
GCP 建立 VPN Gateway
Networking > Hybrid Connectivity > VPN > Create VPN gateway (or VPC setup wizard)
選擇 Classic VPN
填寫以下資料,填寫好以後,可以先放著,因為下面的 Tunnels 需要 AWS 那邊的資料才能完成建立 (或是可以先不要建立 tunnel,之後再回頭建立)
- Name:VPN gateway 的名稱
- Network:VPN gateway 要套用的 VPC network
- Region:VPN gateway 要放置的 region
- IP address:一組先建立好的 reserved static IP
填寫以下資料,填寫好以後,可以先放著,因為下面的 Tunnels 需要 AWS 那邊的資料才能完成建立 (或是可以先不要建立 tunnel,之後再回頭建立)
AWS 建立 Customer gateway
customer gateway 是用來指向對象雲 VPC 的 (參考架構圖)
在 VPC > Virtual Private Network (VPN) > Customer Gateways > Create customer gateway
填寫
- Name: customer gateway 的名稱
- IP address: 這個前面在 GCP VPN gateway 中指派的 reserved static IP
(BGP ASN 因為我們要用的是靜態路由,不需要自建 GCP Cloud Router,所以保留預設即可)
AWS 建立 Virtual Private Gateway
這個就是 AWS 的 VPN gateway
填寫
- Name tag:Virtual private gateway 名稱
- ASN: 選擇 Amazon default ASN
附加 VPG 到要套用的 VPC 上
這邊還要啟用此 VPC > Route table 中的 Route propagation
原本的 route table
進入 Edit route propagation
打勾 Enable
AWS 建立 Site-to-site VPN connections
這一步就是要建立 VPN tunnel 了,AWS VPN 一個 connection 單元會至少包含兩個 tunnels
填寫
- Name tag
- Target gateway type: 選擇 virtual private gateway,並選擇剛剛建立好的 virtual private gateway
- Customer gateway: 選擇 Exist,並選擇剛剛建立好的 customer gateway
- Routing options: 因為我們要使用靜態路由,所以選擇 Static
Static IP prefix: 這裡要填寫 GCP 那邊我們建立 VPN gateway 的 network internal IP CIDR [1]
(Local IPv4 network CIDR 和 Remote IPv4 CIDR 可以不用設,設置效果會跟之後在 GCP 要設定的 policy base 一樣,只允許特定網段通過 VPN tunnel)
下載 configuration 檔案以便查看 IKE pre-shared key
※ 在這邊取得同一個 tunnel 的 IKE1 和 IKE2 的 pre-shared key 會是一樣的,差別只在於不同實體 VPN 裝置廠商實作的安全級別差異,比較新的會採用 IKE2
其中一個 tunnel 的 pre-shared key
GCP 完成 tunnel 建立
回到 GCP 這邊剛剛停的步驟,填寫
- Remote peer IP address:這個是 上面其中一組 AWS VPN tunnel 的 Outside IP address
- IKE pre-shared key:上面其中一組 AWS VPN tunnel 的 pre-shared key
- Routing policy:因為我們是要選用 static routing,可以選擇 Route-based 或 Policy-based (建議使用 route-based)
→ 這兩者個差異應該是 policy-based 會把進來的 traffic 如果 target 不是 local subnetwork IP range 指定的網段的話給擋掉[3]
Remote network IP ranges:這邊要填寫 AWS 那邊套用 VPN 的 VPC 或 subnet 的 private IP CIDR (不是填寫 tunnel 的 Inside IPv4 CIDR 喔!) [2]
完成建立
建立好以後等待一下,GCP 這邊的 tunnel 會發送握手封包給 AWS 那邊的 tunnel,大概幾分鐘後,如果 GCP tunnel 的 status 變成綠色 Established,就是打通了
AWS 那邊可能刷新的慢一點,但成功以後 Status 也會呈現綠色 Up
測試
先查看各 instance 的 Private IP
GCP
AWS
從 AWS 的 instance ping GCP 的 instance IP
從 GCP 的 instance ping AWS 的 instance IP
查看 Route table
AWS route table
剛剛因為有啟用 Route propagation,所以 VPN tunnel 通了以後,customer gateway 的網段 (也就是 GCP VPC 的 IP CIDR) 會被加入 route table
這個指的就是此 VPC 中的流量如果 target 是那個 GCP 那個網段,就會送去 Virtual private gateway (等等反之 GCP 那邊查看 Route 也有一筆)
GCP route
在 VPC network > Routes,應該會自動多一條是目的地為 172.31.0.0/16 的路由,也就是 AWS VPC 的網段
這個指的就是此 VPC 中的流量如果 target 是那個 AWS 那個網段,就會送去 VPN gateway
Attachment
[1]
[2]
[3] policy-based 要自己定義 traffic selector [1],比較安全,但是如果要擴展 ip range,tunnel 需要打掉重建。https://cloud.google.com/network-connectivity/docs/vpn/concepts/choosing-networks-routing#ts-tun-routing
結論
本文整理如何用 VPN 串接 GCP / AWS 的 VPC,確認技術的可行性,實際上的應用要考慮的更多。
現在 SaaS 越來越流行,很多人會以為 IaaS 不重要,或者忽略。但是企業整體營運還是要面對 IT 基礎設施 (Infrastructure),而最根本的就是 Network Topology 的問題,這些問題包含了 1) 規劃、2) 可控性、3) 執行政策 三個面向,本質上是沒有改變,不會因此而 NoOps。用生活的例子來說:
1. 規劃:公路要先規劃有哪些主幹線、支線,哪些主幹道中哪一些會交錯?
2. 可控性:這些道路可否管控流量?閘道?紅綠燈?單行道?紅綠燈多遠距離設計一個?
3. 執行政策:哪些車可以上快速道路?假日車流如何疏導?活動如何管制車輛?罰款如何?酒駕怎麼辦?
交通建設的技術,會隨時代改變、進步,但是這三個問題不會隨著技術前進而消失,而是會轉化成其他的形式。
會使用 Hybrid Cloud 通常都是要把服務從既有的 Data Center 搬到 Cloud 的中、大型企業,當把服務搬到 Cloud 時,勢必都需要考慮原本的網路和 Cloud Networking 的整合與串接,串好後就會面臨前面提的三個問題。更多相關的經驗,請參考:Plan and Design Multiple VPCs in Different Regions 的分享,未來有機會再整理 GCP VPC Networking 規劃心得。
延伸閱讀
• Experience GCP
• Compare GCP VPC Network with AWS
• Plan and Design Multiple VPCs in Different Regions
• Ops as Code using Serverless
參考資料
• Automated Network Deployment: Building a VPN Between GCP and AWS
• AWS Managed VPN Connections