可使用開源的 strongSwan 軟體,快速地與阿里雲傳統型 VPN 閘道建立 IPsec-VPN 串連,實現雲上雲下私網互連。
情境說明
某公司在華東1(杭州)地區建立了 VPC,現需通過傳統型 VPN 閘道對接 strongSwan,實現雲上 VPC 與本地 IDC 的網路互連。
本情境中,IDC 側僅有一個公網出口 IP,與阿里雲 VPN 閘道建立雙隧道模式的 IPsec 串連:
資源規劃
雲上:VPC 網段 10.0.0.0/16,地區為華東1(杭州)
交換器 1:可用性區域 I,網段 10.0.0.0/24
交換器 2:可用性區域 J,網段 10.0.1.0/24
ECS 執行個體:位於交換器 1,IP 位址 10.0.0.1
VPN 閘道:建立後系統自動分配 2 個公網地址:
IPsec 地址 1(用於主隧道):XX.XX.1.1
IPsec 地址 2(用於備隧道):XX.XX.2.2
雲下:本地 IDC 網段 172.16.0.0/16
strongSwan 裝置:私網 IP 172.16.0.1
公網出口 IP:XX.XX.3.3
密碼編譯演算法:使用控制台預設值(AES128 / SHA1 / DH Group 2)。雲上與雲下的密碼編譯演算法、認證演算法和 DH 分組需保持一致。
路由方式:使用靜態路由-感興趣流模式。感興趣流模式指定"哪些流量需要走 VPN 隧道"——您只需定義兩端的網段,匹配這兩個網段之間的流量即為"感興趣流"。系統會自動將其通過隧道傳輸,並產生對應路由。
本文僅描述單公網出口且使用靜態路由的情境。針對雙公網出口或BGP動態路由情境,詳見strongSwan配置樣本。
前提條件
雲上 VPC 網段與雲下 IDC 網段不能衝突。
已按照資源規劃建立 VPC,並在兩個不同可用性區域各建立了一個交換器。VPC 內至少有一台 ECS 執行個體用於驗證連通性。
本地 IDC 已部署一台 Linux 伺服器(本文以 CentOS Stream 9 為例),具備 1 個公網出口,後續將在該伺服器上安裝 strongSwan 作為本地網關。
第一步:建立傳統型 VPN 閘道
前往控制台 VPN網關頁面,單擊建立VPN網關,配置以下關鍵參數:
執行個體名稱:建議輸入有意義的執行個體名稱,例如
vpn-gw-docdev。地區和可用性區域:選擇 VPC 所在地區,本文選擇華東1(杭州)。
網關類型:選擇普通型。
網路類型:選擇公網。
VPC:選擇要連通的目標 VPC。
虛擬交換器1:選擇可用性區域 I 的交換器。
虛擬交換器2:選擇可用性區域 J 的交換器。與虛擬交換器1分屬不同可用性區域,以確保跨可用性區域高可用。若無交換器可選,請先建立。
頻寬規格:根據業務需求選擇頻寬,本文使用預設值。
IPsec-VPN:開啟。
SSL-VPN:關閉。
計費周期:使用預設值。
關聯角色建立:確保建立服務關聯角色,VPN 閘道使用此角色來訪問其他雲產品中的資源。
單擊立即購買並完成支付。VPN 閘道執行個體初始化約需 1~5 分鐘。系統會為 VPN 閘道分配兩個公網 IP 位址,分別用於建立主隧道和備隧道。
第二步:建立使用者網關
使用者網關用於將本地網關裝置的公網 IP 記錄到阿里雲。本情境中 IDC 只有 1 個公網出口,因此只需建立 1 個使用者網關。
在 VPN 閘道控制台左側導覽列,單擊使用者網關。
單擊建立使用者網關,配置:
名稱:輸入使用者網關名稱,例如
cgw-idc-docdev。IP地址:輸入本地 IDC 的公網出口 IP(XX.XX.3.3)。
第三步:建立 IPsec 串連
在 VPN 閘道控制台左側導覽列,單擊IPsec串連,然後單擊綁定VPN網關。
配置 IPsec 串連基本參數:
IPsec串連名稱:填寫有意義的資源名稱,例如
ipsec-docdev。地區:選擇華東1(杭州)。
綁定VPN網關:選擇第一步建立的 VPN 閘道。
路由模式:選擇目的路由模式。此模式需定義兩端網段,系統自動將匹配流量通過隧道傳輸並產生路由。
本端網段:輸入 VPC 網段
10.0.0.0/16。對端網段:輸入 IDC 網段
172.16.0.0/16。立即生效:選擇是,阿里雲側會主動和對端發起協商,後續對端配置完成後可以快速建立串連。
啟用BGP:本文不啟用。
配置隧道參數:
隧道 1(主):
使用者網關:選擇第二步建立的使用者網關。
預先共用金鑰:IPsec 隧道協商時用於身份認證的共用密鑰。本端與對端配置的預先共用金鑰必須一致,否則隧道無法正常建立。建議使用高強度密碼,包含大小寫字母、數字和特殊字元。
加密配置:保持預設即可。本文使用預設的密碼編譯演算法(AES128)、認證演算法(SHA1)和 DH 分組(group2)。
隧道 2(備):
使用者網關:選擇與主隧道相同的使用者網關(本情境 IDC 只有 1 個公網出口)。
預先共用金鑰:本文使用與主隧道相同的密鑰。
加密配置:與主隧道保持一致,保持預設。
單擊確定後,系統會提示是否去發布路由,先單擊取消。
IPsec 串連資源初始化約需 5 分鐘(狀態為準備中),此時還無法配置路由。您可以先進行第四步配置 strongSwan 裝置,路由配置將在第五步完成。
記錄雲上 2 條隧道的公網 IP,後續配置 strongSwan 時需使用:
回到IPsec串連列表頁,找到剛剛建立的 IPsec 串連。
在網關IP列,記錄 IPsec 地址 1 和 IPsec 地址 2。本文以 XX.XX.1.1 和 XX.XX.2.2 為例。
第四步:配置 strongSwan 裝置
以下內容包含的第三方產品資訊僅供參考。阿里雲對第三方產品的效能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。
下面以 CentOS Stream 9 64位作業系統為例配置 strongSwan,其他動作系統請參考 strongSwan 官方文檔。
1. 放通防火牆策略
在 strongSwan 裝置上放通 ESP 協議(IP 協議號 50)、UDP 500 連接埠和 UDP 4500 連接埠,允許雲上的 2 個 IPsec 地址訪問。
以 iptables 為例,請根據實際使用的防火牆工具調整命令:
iptables -I INPUT -s XX.XX.1.1,XX.XX.2.2 -p esp -j ACCEPT
iptables -I INPUT -s XX.XX.1.1,XX.XX.2.2 -p udp --dport 500 -j ACCEPT
iptables -I INPUT -s XX.XX.1.1,XX.XX.2.2 -p udp --dport 4500 -j ACCEPT2. 開啟路由轉寄
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sudo sysctl -p3. 安裝 strongSwan
dnf install epel-release -y
dnf install strongswan -y4. 配置 strongSwan
備份原始設定檔:
mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak建立設定檔:
vi /etc/strongswan/swanctl/swanctl.conf添加並儲存以下配置。請將樣本中的 IP 位址和預先共用金鑰替換為您的實際地址:
# strongSwan 雙隧道 IPsec-VPN 配置,適用於:阿里雲傳統型VPN網關+本地公網單出口+感興趣流 # # 只有帶"請修改"標記的參數需要根據實際環境修改,其餘參數保持預設即可。 # 演算法說明:aes128-sha1-modp1024 = AES-128 / SHA-1 / DH Group 2(控制台預設值) # 主備邏輯:vco1 (priority=1) 為主隧道,vco2 (priority=2) 為備隧道,主隧道故障時自動切換。 connections { # === 隧道1(主) === vco1 { version = 2 dpd_delay = 10 rekey_time = 84600 over_time = 1800 proposals = aes128-sha1-modp1024 encap = yes local_addrs = 172.16.0.1 # strongSwan本機網卡IP(請修改:NAT環境填私網IP;網卡直接綁公網出口IP則填公網IP) local { auth = psk id = XX.XX.3.3 # 本地側公網出口IP(請修改) } remote_addrs = XX.XX.1.1 # 阿里雲側隧道1的公網IP(請修改) remote { auth = psk id = XX.XX.1.1 # 阿里雲側隧道1的公網IP,與上方 remote_addrs 一致(請修改) } children { vco_child1 { local_ts = 172.16.0.0/16 # 本地側感興趣流網段(請修改) remote_ts = 10.0.0.0/16 # 阿里雲側感興趣流網段(請修改) mode = tunnel rekey_time = 85500 life_time = 86400 dpd_action = restart start_action = start close_action = start esp_proposals = aes128-sha1-modp1024 priority = 1 # 指定為主隧道,不建議修改 } } } # === 隧道2(備) === vco2 { version = 2 dpd_delay = 10 rekey_time = 84600 over_time = 1800 proposals = aes128-sha1-modp1024 encap = yes local_addrs = 172.16.0.1 # strongSwan本機網卡IP,與隧道1的local_addrs相同(請修改) local { auth = psk id = XX.XX.3.3 # 本地側公網出口IP,與隧道1相同(請修改) } remote_addrs = XX.XX.2.2 # 阿里雲側隧道2的公網IP(請修改) remote { auth = psk id = XX.XX.2.2 # 阿里雲側隧道2的公網IP,與上方 remote_addrs 一致(請修改) } children { vco_child2 { local_ts = 172.16.0.0/16 # 本地側感興趣流網段,與隧道1的local_ts相同(請修改) remote_ts = 10.0.0.0/16 # 阿里雲側感興趣流網段,與隧道1的remote_ts相同(請修改) mode = tunnel rekey_time = 85500 life_time = 86400 dpd_action = restart start_action = start close_action = start esp_proposals = aes128-sha1-modp1024 priority = 2 # 指定為備隧道,不建議修改 } } } } secrets { ike-vco1 { id = XX.XX.1.1 # 阿里雲側隧道1的公網IP(請修改) secret = your-psk-here # 隧道1的預先共用金鑰,需與阿里雲側一致(請修改) } ike-vco2 { id = XX.XX.2.2 # 阿里雲側隧道2的公網IP(請修改) secret = your-psk-here # 隧道2的預先共用金鑰,需與阿里雲側一致(請修改) } }
5. 啟動並確認隧道狀態
sudo systemctl restart strongswan
swanctl --load-all
watch swanctl --list-sas如果兩條隧道均顯示 ESTABLISHED 且 CHILD_SA 為 INSTALLED 狀態,則表示 strongSwan 裝置和阿里雲 VPN 閘道之間已成功建立 IPsec-VPN 串連。
第五步:配置雲上路由
因本文使用感興趣流模式,系統會自動在 VPN 閘道策略路由表中產生路由條目。
您可將此路由一鍵發布到 VPC 路由表,使 VPC 內 ECS 執行個體訪問 IDC 網段的流量路由到 VPN 閘道:
回到 VPN 閘道列表頁,單擊第一步建立的 VPN 閘道的執行個體 ID,進入詳情頁。
切換到策略路由表頁簽,您可以看到 IPsec 串連使用感興趣流模式後,系統已自動產生的目的路由條目(目標網段 172.16.0.0/16,下一跳為 IPsec 串連)。
在目標路由條目的操作列,單擊發布,將路由發布到 VPC 路由表。
發布路由後,VPC 路由表中會新增一條目標網段為 172.16.0.0/16、下一跳為 VPN 閘道的路由,VPC 內的 ECS 訪問 IDC 網段的流量將自動通過 VPN 隧道傳輸。
驗證測試
驗證連通性
先確保 ECS 的安全性群組規則已放通ICMP協議,再登入 strongSwan 裝置,執行以下命令 ping 雲上 ECS:
ping 10.0.0.1若能收到回複報文,說明雲上 VPC 和雲下 IDC 之間已成功互連。
先確保本地防火牆已放通 ICMP 協議,再登入 VPC 中的 ECS 執行個體(10.0.0.1),ping strongSwan 裝置的內網地址:
ping 172.16.0.1若能收到回複報文,說明反向連通也正常。
驗證高可用
保持 ECS 持續 ping IDC 伺服器:
ping 172.16.0.1 -c 10000中斷主隧道:在阿里雲控制台修改 IPsec 串連主隧道的預先共用金鑰(使兩端密鑰不一致),主隧道將中斷。
觀察 ping 結果:流量在短暫中斷後重新恢複通訊,說明流量已自動切換到備隧道。
恢複主隧道:將主隧道的預先共用金鑰改回正確值,主隧道恢複後流量將自動切回。
故障排查
常見問題與解決方案:
問題現象 | 可能原因 | 解決方案 |
控制台隧道狀態顯示協商失敗 | 網路不通 | 檢查 strongSwan 裝置能否 ping 通阿里雲的 IPsec 地址;確認本地 IDC 的防火牆已放通 UDP 500/4500 連接埠。 |
預先共用金鑰不匹配 | 核對兩端的預先共用金鑰是否完全一致(包括大小寫和特殊字元)。 | |
IKE 參數不一致 | 檢查 IKE 版本、密碼編譯演算法、認證演算法、DH 分組等參數是否在兩端匹配。傳統型 VPN 閘道不支援多演算法相容,兩端參數必須完全一致。 | |
隧道已建立但無法 ping 通 | 路由未配置 | 檢查 VPC 路由表中是否發行 VPN 閘道的目的路由。 |
安全性群組限制 | 檢查 ECS 安全性群組是否允許來自 IDC 網段(172.16.0.0/16)的 ICMP 流量。 | |
本地防火牆限制 | 檢查 IDC 防火牆是否允許來自 VPC 網段(10.0.0.0/16)的流量。 | |
strongSwan 側路由缺失 | 確認 strongSwan 裝置已開啟 IP 轉寄,且 IDC 內其他伺服器配置了到 VPC 網段的路由(下一跳為 strongSwan 裝置)。 |