使用 VPN 閘道配置 IPsec-VPN 串連(雙隧道模式)串連 VPC 和本機資料中心,避免單隧道故障導致業務中斷,保障串連高可用。
工作原理
某公司在阿里雲新加坡地區建立 VPC(主網段為 192.168.0.0/16),且在新加坡部署本機資料中心(網段為 172.16.0.0/16)。因業務發展,本機資料中心需要訪問 VPC 中的資源。公司可使用 VPN 閘道建立 VPC 與本機資料中心的 IPsec 串連(雙隧道模式)。
雙隧道模式,即包含一條主隧道和一條備隧道。系統自動檢測主隧道的連通性,當檢測到主隧道中斷後,VPN 閘道會自動將流量切換到備隧道。待主隧道恢複後,流量將自動切回。
VPN 閘道建立時會分配兩個公網 IP 位址,分別用於建立主隧道和備隧道。每條隧道獨立完成 IKE 協商與金鑰交換,並承載資料流量。
以本地網關裝置部署 strongSwan 軟體為例。其他本地網關裝置配置樣本。
適用範圍
本機資料中心的網關裝置:
網關裝置必須配置公網 IP 位址。建議配置 2 個公網 IP 位址或本機資料中心部署 2 個網關裝置,每個網關裝置均配置 1 個公網 IP 位址。
網關裝置必須支援 IKEv1 或 IKEv2 協議。
VPC:以下地區和可用性區域支援雙隧道模式的 IPsec-VPN 串連。
本機資料中心的網段與 VPC 的網段沒有重疊。
操作步驟
第一步:建立 VPN 閘道
前往VPN網關管理主控台。
執行個體名稱、資源群組:可結合使用,統一標識雲資源。
地區:選擇 VPC 所在地區。本文為新加坡。
網關類型:選擇普通型。
網路類型:選擇公網。
隧道:選擇雙隧道。
專用網路:選擇計劃與本機資料中心連通的 VPC。
虛擬交換器1、虛擬交換器2:選擇 VPC 下不同可用性區域的 2 個交換器。
頻寬峰值:使用預設值。
流量:選擇按流量計費。
開啟IPsec-VPN,關閉SSL-VPN。
購買時間長度:使用預設值。
服務關聯角色:確保建立服務關聯角色AliyunServiceRoleForVpn,VPN 閘道使用此角色來訪問其他雲產品中的資源。

返回VPN網關頁面,VPN網關執行個體的初始狀態為準備中,約1~5分鐘左右會轉換為正常。系統會為 VPN 閘道分配兩個公網 IP 位址,分別用於建立主隧道和備隧道。本樣本中,系統分配的兩個公網 IP 位址為:IPsec地址1:
120.XX.XX.152(IPsec地址1 - 主隧道)、120.XX.XX.0(IPsec地址2 - 備隧道)。
第二步:建立使用者網關
前往VPN - 使用者網關頁面,單擊建立使用者網關。
分別建立 2 個使用者網關用於建立 2 個加密隧道。
|
|
第三步:建立 IPsec 串連
前往VPN - 建立IPsec串連頁面,配置完成後單擊確定。
IPsec配置
地區:選擇 VPC 所在地區。本文為新加坡。
綁定VPN網關:選擇第一步建立的 VPN 閘道。
路由模式:選擇目的路由模式,基於目的 IP 位址路由和轉寄流量。
立即生效:選擇是,配置完成後立即進行協商。

隧道配置
啟用BGP:本文選擇不啟用。
Tunnel:分別配置主隧道和備隧道。


在建立成功對話方塊,單擊取消。單擊建立的 IPsec 串連操作列的產生對端配置。複製配置並儲存在本地,用於後續配置本地網關裝置。
第四步:配置本地網關裝置
本文以本地網關裝置部署 strongSwan 軟體(下文簡稱為“ strongSwan 裝置”)為例。
其他本地網關裝置配置樣本。
以下內容包含的第三方產品資訊僅供參考。阿里雲對第三方產品的效能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。
以下步驟以運行CentOS Stream 9 64位作業系統的strongSwan裝置為例。其他動作系統,請參考strongSwan官方文檔。放通防火牆策略:在 strongSwan 裝置上放通 ESP 協議( IP 協議號 50)、UDP 500連接埠、UDP 4500連接埠。
iptables -I INPUT -p 50 -j ACCEPT iptables -I INPUT -p udp --dport 500 -j ACCEPT iptables -I INPUT -p udp --dport 4500 -j ACCEPT執行
echo 1 > /proc/sys/net/ipv4/ip_forward開啟流量轉寄。執行
dnf install epel-release -y和dnf install strongswan -y安裝 strongSwan 軟體。配置雙隧道:
雙出口基於 XFRM 虛擬網路介面實現,使用XFRM虛擬網路介面需要安裝strongSwan 5.8.0或以上版本,同時要求Linux核心版本為4.19及以上、iproute2版本為5.1.0及以上,且核心支援xfrm模組(
lsmod | grep xfrm無顯示則不支援)。更多資訊,請參見XFRM Interfaces on Linux。添加指向阿里雲側2個 IPsec 地址的路由,使 IPsec 地址1通過 eth0 出口訪問,IPsec 地址2通過 eth1 出口訪問,確保 IPsec 地址可 ping 通。
ip route add 120.XX.XX.152 via 172.16.1.253 dev eth0 #172.16.1.253是eth0私網網關地址 ip route add 120.XX.XX.0 via 172.16.2.253 dev eth1 #172.16.2.253是eth1私網網關地址建立2個虛擬網路介面,分別用於建立 IPsec-VPN 主備隧道。
ip link add ipsec0 type xfrm dev eth0 if_id 42 # 建立隧道1 XFRM虛擬網路介面,介面ID為42,底層介面為公網介面eth0。 ip link add ipsec1 type xfrm dev eth1 if_id 43 # 建立隧道2 XFRM虛擬網路介面,介面ID為43,底層介面為公網介面eth1。 ip link set ipsec0 up # 啟動隧道1 XFRM虛擬網路介面。 ip link set ipsec1 up # 啟動隧道2 XFRM虛擬網路介面。修改 strongSwan 設定檔。
執行
mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak備份原始設定檔。執行
vi /etc/strongswan/swanctl/swanctl.conf,按照 IPsec 串連的配置,添加、修改並儲存如下配置。connections { vco1 { # 添加IPsec-VPN隧道1的VPN配置 version = 2 # 指定IKE版本,需與阿里雲隧道1的IKE版本保持一致,2表示IKEv2。 local_addrs = 172.16.0.93 # 第1個本地網卡的ip地址 remote_addrs = 120.XX.XX.152 # 指定隧道1對端的IP地址為阿里雲隧道1的網關IP地址,即IPsec地址1。 dpd_delay = 10 rekey_time = 84600 # 指定隧道1的SA生存周期,需與阿里雲隧道1 IKE配置中的SA生存周期保持一致。 over_time = 1800 proposals = aes-sha1-modp1024 # 指定隧道1的密碼編譯演算法、認證演算法、DH分組,需與阿里雲隧道1 IKE配置保持一致,group2對應的是modp1024。 encap = yes local { auth = psk # 本段認證方式選擇PSK模式,即預先共用金鑰方式。 id = 47.XX.XX.198 # 第1個本地公網出口IP,需與阿里雲隧道1的RemoteId保持一致。 } remote { auth = psk # 對端認證方式選擇PSK方式,即阿里雲使用預先共用金鑰方式。 id = 120.XX.XX.152 # 阿里雲側IPsec地址1,需與阿里雲隧道1的LocalId保持一致。 } children { vco_child1 { local_ts = 0.0.0.0/0 remote_ts = 0.0.0.0/0 mode = tunnel rekey_time = 85500 life_time = 86400 # 指定隧道1的SA生存周期,需與阿里雲隧道1 IPsec配置中的SA生存周期保持一致。 dpd_action = restart start_action = start close_action = start esp_proposals = aes-sha1-modp1024 # 指定隧道1的密碼編譯演算法、認證演算法、DH分組,需與阿里雲隧道1 IPsec配置保持一致,group2對應的是modp1024。 if_id_out = 42 # 指定隧道1的出介面和入介面為隧道1 XFRM虛擬網路介面。 if_id_in = 42 updown = /root/connect_1.sh # 根據隧道1的UP和DOWN狀態執行/root/connect_1.sh指令碼,以配置路由。 } } } vco2 { # 添加IPsec-VPN隧道2的VPN配置 version = 2 # 指定IKE版本,需與阿里雲隧道2的IKE版本保持一致,2表示IKEv2。 local_addrs = 172.16.2.57 # 第2個本地網卡的ip地址。 remote_addrs = 120.XX.XX.0 # 指定隧道2對端的IP地址為阿里雲隧道2的網關IP地址,即IPsec地址2。 dpd_delay = 10 rekey_time = 84600 # 指定隧道2的SA生存周期,需與阿里雲隧道2 IKE配置中的SA生存周期保持一致。 over_time = 1800 proposals = aes-sha1-modp1024 # 指定隧道2的密碼編譯演算法、認證演算法、DH分組,需與阿里雲隧道2 IKE配置保持一致,group2對應的是modp1024。 encap = yes local { auth = psk # 本端認證方式選擇PSK方式,即預先共用金鑰方式。 id = 47.XX.XX.181 # 第2個本地公網出口IP,,需與阿里雲隧道2的RemoteId保持一致。 } remote { auth = psk # 對端認證方式選擇PSK方式,即阿里雲使用預先共用金鑰方式。 id = 120.XX.XX.0 # 阿里雲側IPsec地址2,需與阿里雲隧道2的LocalId保持一致。 } children { vco_child2 { local_ts = 0.0.0.0/0 remote_ts = 0.0.0.0/0 mode = tunnel rekey_time = 85500 life_time = 86400 # 指定隧道2的SA生存周期,需與阿里雲隧道1 IPsec配置中的SA生存周期保持一致。 dpd_action = restart start_action = start close_action = start esp_proposals = aes-sha1-modp1024 # 指定隧道2的密碼編譯演算法、認證演算法、DH分組,需與阿里雲隧道2 IPsec配置保持一致,group2對應的是modp1024。 if_id_out = 43 # 指定隧道2的出介面和入介面為隧道2 XFRM虛擬網路介面。 if_id_in = 43 updown = /root/connect_2.sh # 根據隧道2的UP和DOWN狀態執行/root/connect_2.sh指令碼,以配置路由。 } } } } # 此處的密鑰配置不指定id,所有隧道共用。不指定id時,請確保兩個密鑰的內容相同,否則可能協商失敗。 secrets { ike-vco1 { secret = <指定隧道1的預先共用金鑰> # 與阿里雲隧道1的預先共用金鑰保持一致。 } ike-vco2 { secret = <指定隧道2的預先共用金鑰> # 與阿里雲隧道2的預先共用金鑰保持一致。 } }
重啟 strongSwan 進程,重新載入 strongSwan 配置,查看隧道狀態。
sudo systemctl restart strongswan swanctl --load-all watch swanctl --list-sas如下圖所示,strongSwan裝置和 VPN 閘道之間已經成功建立 IPsec-VPN 串連。

配置路由:
執行
vi /root/connect_1.sh,添加並儲存以下配置。# 如果隧道1的狀態是UP,則添加路由使本機資料中心去往阿里雲VPC(192.168.0.0/16)的流量通過隧道1 XFRM虛擬網路介面傳輸 # 同時指定該路由的metric值為100,使該路由的優先順序高於指向隧道2 XFRM虛擬網路介面的路由。 # 如果隧道1的狀態是DOWN,則撤銷該路由。 #!/usr/bin/env bash if [ x"$PLUTO_VERB" == "xup-client" ]; then echo "ip route add 192.168.0.0/16 dev ipsec0" >> /root/vpn_route.log;ip route add 192.168.0.0/16 dev ipsec0 metric 100 elif [ x"$PLUTO_VERB" == "xdown-client" ]; then echo "ip route del 192.168.0.0/16 dev ipsec0" >> /root/vpn_route.log;ip route del 192.168.0.0/16 dev ipsec0 metric 100 fi執行
vi /root/connect_2.sh,添加並儲存以下配置。# 如果隧道2的狀態是UP,則添加路由使本機資料中心去往阿里雲VPC(192.168.0.0/16)的流量通過隧道2 XFRM虛擬網路介面傳輸 # 同時指定該路由的metric值為101,使該路由的優先順序低於指向隧道1 XFRM虛擬網路介面的路由。 # 如果隧道2的狀態是DOWN,則撤銷該路由。 #!/usr/bin/env bash if [ x"$PLUTO_VERB" == "xup-client" ]; then echo "ip route add 192.168.0.0/16 dev ipsec1" >> /root/vpn_route.log;ip route add 192.168.0.0/16 dev ipsec1 metric 101 elif [ x"$PLUTO_VERB" == "xdown-client" ]; then echo "ip route del 192.168.0.0/16 dev ipsec1" >> /root/vpn_route.log;ip route del 192.168.0.0/16 dev ipsec1 metric 101 fi執行
sudo chmod +x /root/connect_1.sh和sudo chmod +x /root/connect_2.sh賦予可執行許可權。執行
sudo systemctl restart strongswan重啟 strongSwan 進程。執行
route -n確認路由是否配置成功。
為本機資料中心內、計劃與 VPC 連通的伺服器配置目標網段為 VPC 網段、下一跳為 strongSwan 裝置的路由。
執行以下命令關閉 rp_filter,避免因非對稱路由導致無法連通。
sudo sysctl -w net.ipv4.conf.all.rp_filter=0 sudo sysctl -w net.ipv4.conf.eth0.rp_filter=0 sudo sysctl -w net.ipv4.conf.eth1.rp_filter=0
第五步:配置 VPN 閘道路由
前往VPN - VPN 閘道頁面,單擊第一步建立的 VPN 閘道 ID。
單擊目的路由表頁簽,選擇添加路由條目。
|
|
驗證測試
測試本機資料中心和 VPC 的連通性:登入 VPC 中的 ECS 執行個體,執行
ping <本機資料中心伺服器私網IP地址>,收到本機資料中心伺服器的回複報文,即可正常通訊。測試 IPsec-VPN 串連的高可用性。
登入 VPC 中的 ECS 執行個體,執行
ping <本機資料中心伺服器私網IP地址> -c 10000連續向本機資料中心發送訪問報文。中斷 IPsec-VPN 串連的主隧道:可通過修改 IPsec 串連主隧道的預先共用金鑰,主隧道因兩端的預先共用金鑰不一致而中斷。
中斷主隧道後,觀察 VPC 中 ECS 執行個體的通訊情況:流量在短暫中斷後,又重新恢複通訊,則表示在主隧道中斷後,流量自動通過備隧道進行通訊。



