可使用開源的 strongSwan 軟體,快速地與阿里雲建立 IPsec-VPN 串連(IPsec 串連綁定轉寄路由器),實現雲上 VPC 與本地 IDC 的網路互連。
情境說明
某公司在華東1(杭州)地區建立了 VPC,現需通過 IPsec-VPN 將本地 IDC 與雲上 VPC 網路互連。與直接綁定 VPN 閘道不同,本情境中 IPsec 串連綁定轉寄路由器——通過雲企業網(CEN)的轉寄路由器統一管理雲上網路,後續可靈活擴充更多 VPC 或跨地區互連。
本情境中,IDC 側僅有一個公網出口 IP,與阿里雲建立雙隧道模式的 IPsec 串連:
資源規劃
雲上:VPC 網段 10.0.0.0/16,地區為華東1(杭州)
交換器 1:可用性區域 H,網段 10.0.0.0/24
交換器 2:可用性區域 J,網段 10.0.2.0/24
ECS 執行個體:位於交換器中,IP 位址 10.0.0.1(用於驗證連通性)
CEN 執行個體:用於承載轉寄路由器
轉寄路由器:在華東1(杭州)地區建立,TR 位址區段 10.10.10.0/24(不可與 VPC / IDC 網段衝突)
雲下:本地 IDC 網段 172.16.0.0/16
strongSwan 裝置:私網 IP 172.16.0.1
公網出口 IP:XX.XX.3.3
密碼編譯演算法:IKEv2 / AES-128-CBC / SHA-1 / DH Group 2。隧道兩端需配置相同的加密參數。
路由方式:使用目的路由模式(Destination Routing)。通過在轉寄路由器路由表中添加靜態路由,將去往 IDC 網段的流量指向 VPN 串連。
前提條件
第一步:建立使用者網關
使用者網關用於將本地網關裝置的公網 IP 記錄到阿里雲。本情境中 IDC 只有 1 個公網出口,因此只需建立 1 個使用者網關。
前往 VPN網關頁面, 在左側導覽列單擊使用者網關。
在頂部功能表列選擇華東1(杭州)地區。
單擊建立使用者網關,配置:
名稱:輸入使用者網關名稱,例如 cgw-idc。
IP地址:輸入本地 IDC 的公網出口 IP(XX.XX.3.3)。
第二步:建立 IPsec 串連
在 VPN 閘道控制台左側導覽列,單擊IPsec串連。
單擊綁定Cloud Enterprise Network,配置 IPsec 串連基本參數:
IPsec串連名稱:填寫資源名稱,例如 ipsec-demo。
地區:選擇華東1(杭州)。
網關類型:選擇公網。
綁定Cloud Enterprise Network:選擇本帳號綁定
綁定資源:選擇轉寄路由器。
Cloud Enterprise Network執行個體ID:選擇前提條件中已經建立的雲企業網CEN執行個體。
路由模式:選擇目的路由模式,後續通過在轉寄路由器路由表中添加靜態路由來控制流程量轉寄。
立即生效:選擇是,配置完成後立即進行協商,阿里雲側會主動向對端發起協商。
高級配置(包含自動關聯路由表、配置轉寄路由等配置):全部勾選,包括自動發布路由、自動關聯至轉寄路由器的預設路由表、自動傳播系統路由至轉寄路由器的預設路由表。
配置隧道參數:
隧道 1(主):
使用者網關:選擇第一步建立的使用者網關。
預先共用金鑰:兩端約定好的密碼,用於建立隧道時互相驗證身份。建議使用複雜密碼,雲上雲下填寫必須完全一致。
隧道 2(備):
使用者網關:選擇與隧道 1 相同的使用者網關(本情境 IDC 只有 1 個公網出口)。
預先共用金鑰:本文使用與隧道 1 相同的密鑰。
加密配置中的其餘參數保持預設值即可。如需手動指定演算法,可展開加密配置進行修改。
單擊確定。建立成功後系統提示是否去發布路由,先單擊取消。
IPsec 串連資源初始化約需 5 分鐘(狀態為準備中),此時還無法配置路由。您可以先記錄雲上公網IP地址,後續再前往第三步配置路由。
記錄雲上 2 條隧道的公網 IP,後續配置 strongSwan 時需使用:
回到IPsec串連列表頁,找到剛建立的 IPsec 串連。在網關IP列,記錄IPsec地址1:和IPsec地址2:。本文以 XX.XX.1.1 和 XX.XX.2.2 為例。
第三步:TR添加靜態路由
由於使用目的路由模式,需手動在TR路由表中添加去往 IDC 網段的路由。
前往雲企業網控制台,單擊雲企業網執行個體 ID。
在转发路由器頁簽中,找到華東1(杭州)的轉寄路由器,單擊其 ID 進入詳情頁。
切換到转发路由器路由表頁簽,介面預設展示系統路由表。
在系統路由表的路由条目頁簽,單擊创建路由条目。
目的地址CIDR:輸入 IDC 網段 172.16.0.0/16。
是否为黑洞路由:選擇否。
下一跳连接:選擇 VPN 串連對應的網路執行個體串連(IPsec 串連綁定轉寄路由器後自動建立的串連)。
單擊確定。
添加完成後,在路由表中可看到一條靜態路由:目標網段 172.16.0.0/16,下一跳為 VPN 串連。
此路由的作用是:將轉寄路由器收到的去往 IDC 網段的流量,轉寄到 IPsec 隧道中。VPC 側的路由已通過TR的路由同步功能自動設定,無需手動設定。
第四步:配置 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
sudo dnf install epel-release -y
sudo dnf install strongswan -y4. 建立 XFRM 隧道介面和 updown 指令碼
由於雙隧道情境下需要區分每條隧道的流量,需要建立 XFRM 虛擬介面來避免核心路由策略衝突。
# 建立 XFRM 隧道介面(分別對應隧道 1 和隧道 2)
sudo ip link add xfrm1 type xfrm dev eth0 if_id 1
sudo ip link add xfrm2 type xfrm dev eth0 if_id 2
sudo ip link set xfrm1 up
sudo ip link set xfrm2 up
# 添加 ECMP 等價路由:去往雲上網段的流量在兩條隧道間負載平衡
sudo ip route add 10.0.0.0/16 nexthop dev xfrm1 weight 1 nexthop dev xfrm2 weight 1建立 updown 指令碼,實現隧道中斷時自動將對應 XFRM 介面設為 DOWN,使 Linux 核心將流量收斂到存活的隧道:
sudo tee /usr/local/bin/xfrm-updown.sh > /dev/null << 'EOF'
#!/bin/bash
XFRM_IF="xfrm${PLUTO_IF_ID_IN}"
case "${PLUTO_VERB}" in
up-client)
ip link set "${XFRM_IF}" up 2>/dev/null
;;
down-client)
ip link set "${XFRM_IF}" down 2>/dev/null
;;
esac
EOF
sudo chmod +x /usr/local/bin/xfrm-updown.sh如需在裝置重啟後自動生效,可將 XFRM 介面和路由命令寫入啟動指令碼。
5. 配置 strongSwan
備份原始設定檔:
mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak建立設定檔:
vi /etc/strongswan/swanctl/swanctl.conf添加並儲存以下配置。請將樣本中的 IP 位址和密鑰替換為您的實際值:
# strongSwan 雙隧道 IPsec-VPN 配置 # 適用於:阿里雲轉寄路由器綁定的 IPsec 串連 + 本地公網單出口 + 目的路由 # # 只有帶"請修改"標記的參數需要根據實際環境修改,其餘參數保持預設即可。 # 使用 XFRM 介面(if_id)區分兩條隧道的流量,通過 ECMP 實現負載平衡。 connections { # === 隧道1 === tunnel1 { version = 2 dpd_delay = 10s rekey_time = 86400s proposals = aes128-sha1-modp1024 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 { tunnel1-child { local_ts = 0.0.0.0/0 remote_ts = 0.0.0.0/0 mode = tunnel esp_proposals = aes128-sha1-modp1024 dpd_action = restart start_action = start close_action = start updown = /usr/local/bin/xfrm-updown.sh if_id_in = 1 # 對應 xfrm1 介面 if_id_out = 1 } } if_id_in = 1 if_id_out = 1 } # === 隧道2 === tunnel2 { version = 2 dpd_delay = 10s rekey_time = 86400s proposals = aes128-sha1-modp1024 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 { tunnel2-child { local_ts = 0.0.0.0/0 remote_ts = 0.0.0.0/0 mode = tunnel esp_proposals = aes128-sha1-modp1024 dpd_action = restart start_action = start close_action = start updown = /usr/local/bin/xfrm-updown.sh if_id_in = 2 # 對應 xfrm2 介面 if_id_out = 2 } } if_id_in = 2 if_id_out = 2 } } secrets { ike-tunnel1 { id-1 = XX.XX.3.3 # 本地側公網出口 IP(請修改) id-2 = XX.XX.1.1 # 阿里雲側隧道 1 的公網 IP(請修改) secret = "your-psk-here" # 隧道 1 的預先共用金鑰,需與阿里雲側一致(請修改) } ike-tunnel2 { id-1 = XX.XX.3.3 # 本地側公網出口 IP(請修改) id-2 = XX.XX.2.2 # 阿里雲側隧道 2 的公網 IP(請修改) secret = "your-psk-here" # 隧道 2 的預先共用金鑰,需與阿里雲側一致(請修改) } }重要if_id_in和if_id_out將每條隧道綁定到對應的 XFRM 介面(xfrm1 / xfrm2),確保兩條隧道的流量互不干擾。local_ts和remote_ts設定為0.0.0.0/0,由 XFRM 介面的路由表決定哪些流量進入隧道。目的路由模式下,雲上側的流量選取器也為0.0.0.0/0。
6. 啟動並確認隧道狀態
sudo systemctl enable strongswan
sudo systemctl restart strongswan
sudo swanctl --load-all
sudo swanctl --list-sas如果兩條隧道均顯示 ESTABLISHED 且 CHILD_SA 為 INSTALLED 狀態,則表示 strongSwan 裝置和阿里雲之間已成功建立 IPsec-VPN 串連。
# 期望輸出樣本(已省略部分內容)
tunnel1: #1, ESTABLISHED, IKEv2
tunnel1-child: #1, reqid 1, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-128/HMAC_SHA1_96
tunnel2: #2, ESTABLISHED, IKEv2
tunnel2-child: #2, reqid 2, INSTALLED, TUNNEL-in-UDP, ESP:AES_CBC-128/HMAC_SHA1_96驗證測試
驗證連通性
先確保 ECS 的安全性群組規則已放通 ICMP 協議,再登入 strongSwan 裝置,執行以下命令 ping 雲上 ECS:
ping 10.0.0.1若能收到回複報文,說明雲上 VPC 和雲下 IDC 之間已成功互連。
先確保strongSwan或內網伺服器已放通 ICMP 協議,再登入 VPC 中的 ECS 執行個體(10.0.0.1),ping strongSwan 裝置的內網地址:
ping 172.16.0.1若能收到回複報文,說明反向連通也正常。
驗證高可用
綁定轉寄路由器的 IPsec 串連預設以 ECMP(等價多重路徑)方式同時使用兩條隧道,流量在雙隧道間負載平衡。當一條隧道中斷時,流量會自動收斂到另一條隧道,無需手動切換。
保持 ECS 持續 ping IDC 伺服器:
ping 172.16.0.1 -c 10000中斷其中一條隧道:在阿里雲控制台修改 IPsec 串連隧道 1 的預先共用金鑰(使兩端密鑰不一致),該隧道將中斷。
觀察 ping 結果:流量在短暫中斷後重新恢複通訊,說明流量已自動收斂到隧道 2。
恢複隧道:將隧道 1 的預先共用金鑰改回正確值,隧道恢複後流量將重新在兩條隧道間負載平衡。
故障排查
常見問題與解決方案:
問題現象 | 可能原因 | 解決方案 |
控制台隧道狀態顯示協商失敗 | 網路不通 | 檢查 strongSwan 裝置能否 ping 通阿里雲的 IPsec 地址;確認本地 IDC 的防火牆已放通 UDP 500/4500 連接埠。 |
預先共用金鑰不匹配 | 核對兩端的預先共用金鑰是否完全一致(包括大小寫和特殊字元)。 | |
IKE 參數不一致 | 檢查 IKE 版本、密碼編譯演算法、認證演算法、DH 分組等參數是否在兩端匹配。 | |
隧道已建立但無法 ping 通 | 路由未配置 | 檢查 VPC 路由表中是否已有去往 IDC 網段的路由(下一跳為轉寄路由器)。同時檢查轉寄路由器路由表中是否有去往 IDC 網段的靜態路由(下一跳為 VPN 串連)。目的路由模式下,轉寄路由器路由不會自動產生,必須手動添加。 |
安全性群組限制 | 檢查 ECS 安全性群組是否允許來自 IDC 網段(172.16.0.0/16)的 ICMP 流量。 | |
本地防火牆限制 | 檢查 IDC 防火牆是否允許來自 VPC 網段(10.0.0.0/16)的流量。 | |
strongSwan 側路由缺失 | 確認 strongSwan 裝置已開啟 IP 轉寄,且 IDC 內其他伺服器配置了到 VPC 網段的路由(下一跳為 strongSwan 裝置)。 |