可使用開源的 strongSwan 軟體,快速地與阿里雲建立 IPsec-VPN 串連(IPsec 串連綁定轉寄路由器),實現雲上 VPC 與本地 IDC 的網路互連。
情境說明
某公司在華東1(杭州)地區建立了 VPC,現需通過 IPsec-VPN 將本地 IDC 與雲上 VPC 網路互連。與直接綁定 VPN 閘道不同,本情境中 IPsec 串連綁定轉寄路由器——通過雲企業網(CEN)的轉寄路由器統一管理雲上網路,後續可靈活擴充更多 VPC 或跨地區互連。
本情境採用 BGP 動態路由,IDC 側僅有一個公網出口 IP,與阿里雲建立雙隧道模式的 IPsec 串連。兩條隧道會自動形成 ECMP(等價多重路徑),流量在雙隧道間負載平衡,一條隧道中斷時自動收斂到另一條。
資源規劃
雲上: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 / BGP網段衝突)
雲下:本地 IDC 網段 172.16.0.0/16
strongSwan 裝置:私網 IP 172.16.0.1
公網出口 IP:XX.XX.3.3
密碼編譯演算法:IKEv2 / AES-128 / SHA-1 / DH Group 2 / SA生存周期86400秒。隧道兩端請務必配置相同的加密參數。
路由方式:使用 BGP 動態路由。BGP 網段規劃如下(隧道網段需為 169.254.0.0/16 內的 /30,兩條隧道不能相同)。
資源
隧道
隧道網段
BGP IP 位址
BGP AS 號
IPsec 串連(雲端)
隧道 1
169.254.10.0/30
169.254.10.1
65535
隧道 2
169.254.20.0/30
169.254.20.1
65535
本地網關裝置(IDC)
隧道 1
169.254.10.0/30
169.254.10.2
65530
隧道 2
169.254.20.0/30
169.254.20.2
65530
兩條隧道的本端自治系統號必須相同;對端(IDC)AS 號也建議兩條隧道相同。
前提條件
雲上 VPC 網段、雲下 IDC 網段、BGP 隧道網段兩兩之間不能衝突。
已建立 VPC,並在兩個不同可用性區域各建立了一個交換器(交換器所在可用性區域需在轉寄路由器支援的可用性區域列表中)。VPC 內至少有一台 ECS 執行個體用於驗證連通性。
已建立 CEN 和 TR,並且:
已在本地 IDC 部署一台 Linux 伺服器(本文以 CentOS Stream 9 為例),具備 1 個公網出口,後續將在該伺服器上安裝 strongSwan(IPsec 隧道)與 FRRouting(BGP)作為本地網關。
第一步:建立使用者網關
使用者網關用於將本地網關裝置的公網 IP 和 BGP AS 號 記錄到阿里雲。本情境中 IDC 只有 1 個公網出口,因此只需建立 1 個使用者網關。
前往 VPN網關頁面, 在左側導覽列單擊使用者網關。
在頂部功能表列選擇華東1(杭州)地區。
單擊建立使用者網關,配置:
名稱:輸入使用者網關名稱,例如 cgw-idc。
IP地址:輸入本地 IDC 的公網出口 IP(XX.XX.3.3)。
自治系統號:輸入本地 IDC 的 BGP AS 號,本文為 65530。
重要:BGP 情境下使用者網關必須填寫自治系統號。如果已建立的使用者網關未指定 ASN,需刪除後重新建立。
第二步:建立 IPsec 串連
在 VPN 閘道控制台左側導覽列,單擊IPsec串連。
單擊綁定Cloud Enterprise Network,配置 IPsec 串連基本參數:
IPsec串連名稱:填寫資源名稱,例如 ipsec-demo。
地區:選擇华东1(杭州)。
網關類型:選擇公網。
綁定Cloud Enterprise Network:選擇本帳號綁定
綁定資源:選擇轉寄路由器。
Cloud Enterprise Network執行個體ID:選擇前提條件中已經建立的雲企業網CEN執行個體。
路由模式:選擇目的路由模式(BGP 動態路由推薦使用目的路由模式)。
立即生效:選擇是,配置完成後立即進行協商,阿里雲側會主動向對端發起協商。
開啟 BGP 並配置本端自治系統號:
在雙隧道配置地區,開啟啟用BGP開關(勾選開啟)。
本端自治系統號:輸入雲端 IPsec 串連的 BGP AS 號,本文為 65535。兩條隧道的本端自治系統號必須相同。
高級配置(包含自動關聯路由表、配置轉寄路由等配置):全部勾選,包括自動發布路由、自動關聯至轉寄路由器的預設路由表、自動傳播系統路由至轉寄路由器的預設路由表。
配置隧道參數:
隧道 1(主):
使用者網關:選擇第一步建立的使用者網關。
預先共用金鑰:兩端約定好的密碼,用於建立隧道時互相驗證身份。建議使用複雜密碼,雲上雲下填寫必須完全一致。
加密配置:保持預設值即可。如需手動指定演算法,可展開修改。
重要請將雲上和雲下的加密配置保持一致,包括IKE版本、協商模式,以及各階段的密碼編譯演算法、認證演算法、DH分組,SA生存周期。
展開 BGP配置:
隧道網段:輸入 169.254.10.0/30。
本端BGP地址:輸入 169.254.10.1。
隧道 2(備):
使用者網關:選擇與隧道 1 相同的使用者網關(本情境 IDC 只有 1 個公網出口)。
預先共用金鑰:本文使用與隧道 1 相同的密鑰。
加密配置:本文使用與隧道 1 相同的加密配置。
展開 BGP配置:
隧道網段:輸入 169.254.20.0/30(不能與隧道 1 相同)。
本端BGP地址:輸入 169.254.20.1。
單擊確定。建立成功後系統提示是否去發布路由,先單擊取消。
IPsec 串連資源初始化約需 5 分鐘(狀態為準備中),此時還無法配置路由。您可以先記錄雲上公網IP地址,後續再前往第三步配置路由。
記錄雲上 2 條隧道的公網 IP,後續配置 strongSwan 時需使用:
回到IPsec串連列表頁,找到剛建立的 IPsec 串連。在網關IP列,記錄IPsec地址1:和IPsec地址2:。本文以 XX.XX.1.1 和 XX.XX.2.2 為例。您也可以單擊執行個體ID進入串連詳情頁,查看每條隧道的隧道網段、本端BGP地址、對端BGP地址及 BGP 狀態。
第三步:確認TR和VPC路由
BGP 動態路由方式下,無需在 TR 路由表中手動添加去往 IDC 網段的靜態路由。本地網關裝置通過 BGP 宣告 IDC 網段後,路由會自動傳播到 IPsec 串連 BGP 路由表,再通過 TR 的路由學習功能傳播到 TR 路由表,最後通過TR的路由同步功能傳播到VPC路由表。
前往雲企業網控制台,單擊雲企業網執行個體 ID。
在轉寄路由器頁簽中,找到華東1(杭州)的轉寄路由器,單擊其 ID 進入詳情頁。
切換到轉寄路由器路由表頁簽,在路由條目頁簽中確認:待本地網關裝置的 BGP 配置完成後(見第四步),此處會自動出現去往 IDC 網段(172.16.0.0/16)的路由條目,路由來源為 IPsec 串連。
如果建立 IPsec 串連時未保持預設勾選自動傳播系統路由至轉寄路由器的預設路由表、自動關聯至轉寄路由器的預設路由表,則需手動為 IPsec 串連建立關聯轉寄關係並開啟路由學習,否則 TR 無法學到 IDC 路由、流量不通。
前往Virtual Private Cloud控制台,在 VPC 的路由表頁面確認是否已有去往 IDC 網段(172.16.0.0/16)、下一跳為轉寄路由器的路由。待本地網關裝置的 BGP 配置完成後(見第四步),此處會自動出現去往 IDC 網段(172.16.0.0/16)的路由條目。
若未開啟路由同步功能,本地網關配置完成後,此處不會產生去往 IDC 的路由條目。您可以在TR上開啟對VPC的路由同步,也可直接在VPC路由表添加路由條目。
第四步:配置 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 虛擬介面來避免核心路由策略衝突。BGP 動態路由方式下,還需要在 XFRM 介面上配置 BGP 隧道地址。
# 建立 XFRM 隧道介面(分別對應隧道 1 和隧道 2;單公網出口時底層介面均為 eth0)
sudo ip link add ipsec0 type xfrm dev eth0 if_id 42
sudo ip link add ipsec1 type xfrm dev eth0 if_id 43
sudo ip link set ipsec0 up
sudo ip link set ipsec1 up
# 在 XFRM 介面上配置本端 BGP 隧道地址
sudo ip address add 169.254.10.2/30 dev ipsec0
sudo ip address add 169.254.20.2/30 dev ipsec1XFRM 介面和地址為臨時配置,裝置重啟後需重新添加。可將上述命令寫入開機啟動指令碼(例如
/etc/rc.d/rc.local)。使用 XFRM 介面需要 strongSwan ≥ 5.8、Linux 核心 ≥ 4.19、iproute2 ≥ 5.1,且核心支援 xfrm 模組(
lsmod | grep 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 串連 + 本地公網單出口 + BGP 動態路由 # # 只有帶"請修改"標記的參數需要根據實際環境修改,其餘參數保持預設即可。 # 使用 XFRM 介面(if_id)區分兩條隧道的流量;路由由 BGP 動態學習。 connections { # === 隧道1 === tunnel1 { version = 2 dpd_delay = 10s rekey_time = 86400s proposals = aes-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 { tunnel1-child { local_ts = 0.0.0.0/0 remote_ts = 0.0.0.0/0 mode = tunnel esp_proposals = aes-sha1-modp1024 dpd_action = restart start_action = start close_action = start if_id_in = 42 # 對應 ipsec0 介面 if_id_out = 42 } } if_id_in = 42 if_id_out = 42 } # === 隧道2 === tunnel2 { version = 2 dpd_delay = 10s rekey_time = 86400s proposals = aes-sha1-modp1024 encap = yes local_addrs = 172.16.0.1 # strongSwan 本機網卡 IP,與隧道 1 相同(請修改) 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 = aes-sha1-modp1024 dpd_action = restart start_action = start close_action = start if_id_in = 43 # 對應 ipsec1 介面 if_id_out = 43 } } if_id_in = 43 if_id_out = 43 } } 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 介面(ipsec0 / ipsec1),確保兩條隧道的流量互不干擾。local_ts和remote_ts設定為0.0.0.0/0,由 BGP 學習到的路由決定哪些流量進入隧道。目的路由模式下,雲上側的流量選取器也為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_967. 配置 BGP 動態路由(FRRouting)
IPsec 隧道建立後,網路還無法互連,需要在本地網關裝置上配置 BGP,與阿里雲側建立 BGP 鄰居,自動宣告本地網段並學習雲上網段。
說明:strongSwan/FRR 裝置重啟後,需要重新添加 XFRM 介面、BGP 隧道地址及 BGP 配置。
安裝 FRRouting:
sudo dnf install frr -y開啟 bgpd 守護進程:
編輯
/etc/frr/daemons,將bgpd=no改為bgpd=yes,儲存後啟動 FRR:sudo sed -i 's/^bgpd=no/bgpd=yes/' /etc/frr/daemons sudo systemctl enable frr sudo systemctl restart frr添加 BGP 配置:
進入 vtysh 配置介面,添加如下配置。執行時請將地址替換為您的實際值:
169.254.10.1、169.254.20.1替換為阿里雲側兩條隧道的本端 BGP 地址(即本地裝置的對端 BGP 鄰居)。65535替換為阿里雲 IPsec 串連的本端自治系統號。65530替換為本地 IDC 的 BGP AS 號。172.16.0.0/24替換為您需要宣告給雲上的本地 IDC 網段。
sudo vtyshconfigure terminal route-map allow-all permit 1 exit router bgp 65530 bgp router-id 169.254.10.2 neighbor 169.254.10.1 remote-as 65535 neighbor 169.254.10.1 timers 10 30 neighbor 169.254.20.1 remote-as 65535 neighbor 169.254.20.1 timers 10 30 address-family ipv4 unicast network 172.16.0.0/24 neighbor 169.254.10.1 soft-reconfiguration inbound neighbor 169.254.10.1 route-map allow-all in neighbor 169.254.10.1 route-map allow-all out neighbor 169.254.20.1 soft-reconfiguration inbound neighbor 169.254.20.1 route-map allow-all in neighbor 169.254.20.1 route-map allow-all out maximum-paths 32 exit-address-family exit exit write memory確認 BGP 鄰居和路由:
show ip bgp summary show ip bgpshow ip bgp summary中兩個鄰居(169.254.10.1、169.254.20.1)的State/PfxRcd應顯示為已接收的首碼數量(而非 Active/Idle),表示 BGP 鄰居已建立。show ip bgp中應能看到通過 BGP 學習到的雲上 VPC 網段(如 10.0.0.0/24、10.0.2.0/24),且每個網段有兩條等價路徑(分別經隧道 1 和隧道 2),形成 ECMP。
# show ip bgp summary 期望輸出樣本(已省略部分內容) Neighbor V AS ... State/PfxRcd 169.254.10.1 4 65535 ... 2 169.254.20.1 4 65535 ... 2 # show ip bgp 期望輸出樣本 *> 10.0.0.0/24 169.254.10.1 ... 65535 i *= 169.254.20.1 ... 65535 i *> 10.0.2.0/24 169.254.10.1 ... 65535 i *= 169.254.20.1 ... 65535 i確認核心已安裝 ECMP 路由:
ip route show 10.0.0.0/24 # 期望:一條路由帶兩個 nexthop,分別經 ipsec0 和 ipsec1
驗證測試
驗證連通性
先確保 ECS 的安全性群組規則已放通 ICMP 協議,再從本地 IDC 內的用戶端 ping 雲上 ECS:
ping 10.0.0.1若能收到回複報文,說明雲上 VPC 和雲下 IDC 之間已成功互連。
說明:若從 strongSwan 裝置自身發起 ping 時,請指定 IDC 內網 IP 為源地址(例如
ping -I 172.16.0.1 10.0.0.1),避免核心選用 BGP 隧道地址(169.254.x.x)作為源地址導致回程不通。先確保strongSwan或內網伺服器已放通 ICMP 協議,再登入 VPC 中的 ECS 執行個體(10.0.0.1),ping strongSwan 裝置的內網地址:
ping 172.16.0.1若能收到回複報文,說明反向連通也正常。
驗證高可用
綁定轉寄路由器且使用 BGP 的 IPsec 串連預設以 ECMP(等價多重路徑)方式同時使用兩條隧道,流量在雙隧道間負載平衡。當一條隧道中斷時,BGP 會自動撤銷該隧道的路由,流量收斂到另一條隧道,無需手動切換。
保持 ECS 持續 ping IDC 伺服器:
ping 172.16.0.1 -c 10000中斷其中一條隧道:在阿里雲控制台修改 IPsec 串連隧道 1 的預先共用金鑰(使兩端密鑰不一致),該隧道將中斷,其 BGP 鄰居隨之斷開。
觀察 ping 結果:流量在短暫中斷後重新恢複通訊,說明流量已自動收斂到隧道 2。
恢複隧道:將隧道 1 的預先共用金鑰改回正確值,隧道與 BGP 鄰居恢複後,流量將重新在兩條隧道間負載平衡。
故障排查
常見問題與解決方案:
問題現象 | 可能原因 | 解決方案 |
控制台隧道狀態顯示協商失敗 | 網路不通 | 檢查 strongSwan 裝置能否連通阿里雲的 IPsec 地址;確認本地 IDC 的防火牆已放通 UDP 500/4500 連接埠。 |
預先共用金鑰不匹配 | 核對兩端的預先共用金鑰是否完全一致(包括大小寫和特殊字元)。 | |
IKE 參數不一致 | 檢查 IKE 版本、密碼編譯演算法、認證演算法、DH 分組等參數是否在兩端匹配。 | |
隧道已建立但 BGP 鄰居無法建立 | BGP 配置錯誤 | 檢查使用者網關是否已填寫正確的自治系統號;檢查 IPsec 串連的隧道網段、本端 BGP 地址是否與本地裝置匹配;檢查本地 FRR 中 remote-as(對端應為雲端 ASN 65535)、鄰居地址(雲端隧道 BGP 地址)是否正確;確認 XFRM 介面已配置對端 BGP 隧道地址(169.254.x.2/30)。 |
BGP 已建立但無法 ping 通 | 路由未生效 | 檢查 TR 路由表是否已通過路由學習學到 IDC 網段;檢查 VPC 路由表中是否已有去往 IDC 網段、下一跳為轉寄路由器的路由(若未自動產生需手動添加);確認 IPsec 串連已與 TR 路由表建立關聯轉寄並開啟路由學習/路由同步。 |
安全性群組限制 | 檢查 ECS 安全性群組是否允許來自 IDC 網段(172.16.0.0/16)的 ICMP 流量。 | |
本地防火牆限制 | 檢查 IDC 防火牆是否允許來自 VPC 網段(10.0.0.0/16)的流量。 | |
strongSwan 側源地址選擇錯誤,從裝置自身 ping 時未指定源 | 從 strongSwan 裝置自身測試時使用 |
如果仍未解決,詳見:故障排查。