AWS Site-to-Site VPN 介紹與部署經驗

前言

基本上兩個 VPC 互連會建議使用 VPC Peering、Transit Gateway,而 AWS Site-to-Site VPN(S2S VPN) 主要是用來給地端 ↔ 雲端的連線,採用 IPSec 協定

不過為了建置介紹方便起見,我將採用 VPC ↔ VPC 方式示範 S2S VPN 並採用靜態路由連線,一邊稱為遠端(雲端)、一邊稱為地端(客戶端)。

基本概念

Tunnel 特性

一個 S2S VPN 連線支援兩條通道,強烈建議客戶端同時要有兩條連線以確保高可用性,如果客戶只有建立一條通道連線,會收到警告通知信,但不影響使用。如果 AWS 偵測到硬體異常、軟體需要更新,便會讓其中一條通道進入到維護模式,此時間將不可用,這也是為何建議客戶使用雙通道。

以下為 AWS 端、客戶端對通道的看法:

  • 當兩條通道都 UP 時,AWS 端會挑選其中一條通道送流量
    • 客戶端沒辦法指定要求 AWS 該從哪條送流量
    • 客戶端沒辦法透過 API、console 得知 AWS 目前使用哪條通道送
    • 客戶端僅能透過觀察流量都從哪個通道來,以得知目前 AWS 使用哪個通道(可透過 CloudWatch metric 知道)
    • AWS 可能會隨時改變由另一條通道送流量
  • 當兩條通道都 UP 時,客戶端可以挑選其中一條通道送流量
    • (限 BGP 用戶)如果 AWS 端對其中一個通道發出較低的 multi-exit discriminator (MED) 資訊,那麼建議就改用這個通道,因為另一個通道可能即將要進行維護

由上述資訊可知,如果 AWS 與客戶端挑選了不同通道進行傳輸,便會有非對稱路由(asymmetric routing)產生,如果客戶端閘道(CGW)不支援非對稱路由,那麼便會產生連線問題。AWS 強烈建議使用支援非對稱路由的裝置!

路由種類

AWS S2S VPN 支援兩種路由:

  1. BGP 動態路由
    1. 客戶端可自行廣播路由到 AWS 端
    2. 支援 multi-exit discriminator (MED),當 AWS 要對其中一條通道進行維護時,會在另一條通道發出較低的 MED 值,也就是請對端(客戶端)使用這個沒有要維護的通道
  2. 靜態路由
    1. 用戶得手動設定靜態路由到 S2S VPN 連線上,讓 AWS 知道哪些 CIDR 需路由到地端

一般來說會建議使用 BGP 動態路由方式,而不是使用靜態路由,因為 AWS 端若有維護的話使用 BGP 客戶可以提早切換通道,使用靜態路由客戶可能得等 Dead peer detection (DPD) 逾期才會有動作(客戶端要自行設定)。

S2S VPN 基本元件

  • 建立 Customer Gateway (CGW)
  • 建立 Virtual Private Gateway (VGW)
    • 此為設定 VPC 側的閘道,在 AWS VPN 接入 VPC 時都會需要它
  • 建立 Site-to-Site VPN 連線
    • 將 CGW、VGW 關聯起來
    • 可以選擇動態 BGP 路由、靜態路由
    • 可以設定兩個通道各自的 Pre-shared key、Phase 1 與 Phase 2 的各種參數
    • 建立完成後,可依照 CGW 種類下載不同設定檔

設定部署

以下採用靜態路由方式設定,地端為另一個 VPC,CGW 為 EC2 instance。

雲端

基本上 S2S VPN 連線弄好後,再把 VPC Route Table 開啟 Route Propagation,選擇對應的 VGW 即可,這樣 VPC 就知道地端的 CIDR 是多少。

必須至少要有一個通道為 UP 時,地端的路由(不管是靜態或動態)才會被 propagate 到雲端哦!

設定 CGW

此範例也就是設定客戶端的 EC2 instance。您真實的 CGW 可能是硬體設備,我這邊方便起見採用 OpenSwan,不過只能建立一條通道。

網路方面

  • 務必開啟 UDP 500、UDP 4500
  • 關閉 Source/Destination check(也就是俗稱的開啟混雜模式)
  • 設定地端 VPC (或 subnet) 所關聯的 Route Table,將遠端 VPC CIDR 指向到這台 CGW instance 的 ENI,這樣地端的其他機器才能使用 S2S VPN 連線
  • 如果同 VPC 內其他機器要透過這 CGW 台去連遠端,請開啟對應的 port
    • 例如要連到遠端機器的 80 port,那麼這台 CGW 就要開 80 port

接著照著從 S2S VPN 連線下載的 configuration 設定,好了後就可以在 VPC console S2S VPN 中看到其中一條通道顯示為 UP。如果沒成功,可以看一下 IPSec 的訊息。

以下為 OpenSwan 建立起的網路狀態:

  • 通道 1 公網 IP 地址為 18.177.1.5、私網 IP 地址為 169.254.190.76/30
  • 遠端 CIDR:172.31.0.0/16
  • 地端 CIDR:10.66.0.0/16
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 0e:64:3f:2a:96:5b brd ff:ff:ff:ff:ff:ff
    inet 10.66.4.189/24 brd 10.66.4.255 scope global dynamic eth0
       valid_lft 3499sec preferred_lft 3499sec
    inet6 fe80::c64:3fff:fe2a:965b/64 scope link
       valid_lft forever preferred_lft forever
3: ip_vti0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
$ ip route
default via 10.66.4.1 dev eth0
10.66.4.0/24 dev eth0 proto kernel scope link src 10.66.4.189
169.254.169.254 dev eth0
$ ip tunnel
ip_vti0: ip/ip remote any local any ttl inherit nopmtudisc key 0
$ sudo ip xfrm state
src 18.177.1.5 dst 10.66.4.189
	proto esp spi 0x268f3a07 reqid 16389 mode tunnel
	replay-window 32 flag af-unspec
	auth-trunc hmac(sha1) 0x01d62483113fd5ae90c94632696f200f02d0f8aa 96
	enc cbc(aes) 0xf2986afc161326f7f30c372e2c54f379
	encap type espinudp sport 4500 dport 4500 addr 0.0.0.0
	anti-replay context: seq 0x2, oseq 0x0, bitmap 0x00000003
src 10.66.4.189 dst 18.177.1.5
	proto esp spi 0xcaa5c310 reqid 16389 mode tunnel
	replay-window 32 flag af-unspec
	auth-trunc hmac(sha1) 0xdce4e69da5c281ab470b38b0756ff208dece8014 96
	enc cbc(aes) 0x922ec74c670938f650874281769cd53b
	encap type espinudp sport 4500 dport 4500 addr 0.0.0.0
	anti-replay context: seq 0x0, oseq 0x4, bitmap 0x00000000
$ sudo ip xfrm policy
src 10.66.0.0/16 dst 172.31.0.0/16
	dir out priority 1044463 ptype main
	tmpl src 10.66.4.189 dst 18.177.1.5
		proto esp reqid 16389 mode tunnel
src 172.31.0.0/16 dst 10.66.0.0/16
	dir fwd priority 1044463 ptype main
	tmpl src 18.177.1.5 dst 10.66.4.189
		proto esp reqid 16389 mode tunnel
src 172.31.0.0/16 dst 10.66.0.0/16
	dir in priority 1044463 ptype main
	tmpl src 18.177.1.5 dst 10.66.4.189
		proto esp reqid 16389 mode tunnel
...

常見問題

  • 客戶裝置使用「靜態路由」且不支援「非對稱連線」
    • 那麼有機會連線不通,建議升級設備以獲得更好的連線品質
  • (靜態且不支援非對稱路由)收到通道維護通知時,來不及切換路由
    • 建議升級設備以支援非對稱路由、改用 BGP 連線
  • 設定 本機 IPv4 網路 CIDR遠端 IPv4 網路 CIDR 似乎沒什麼作用
    • 這是 traffic selector,Phase 2 時會校驗
    • 建議設定 0.0.0.0/0 就好,如果安全需求請另行架設防火牆,不要依賴此設定,因 CGW 可能不遵守

參考資料


comments powered by Disqus