全部產品
Search
文件中心

VPN Gateway:綁定轉寄路由器入門

更新時間:Mar 20, 2026

可使用開源的 strongSwan 軟體,快速地與阿里雲建立 IPsec-VPN 串連(IPsec 串連綁定轉寄路由器),實現雲上 VPC 與本地 IDC 的網路互連。

情境說明

某公司在華東1(杭州)地區建立了 VPC,現需通過 IPsec-VPN 將本地 IDC 與雲上 VPC 網路互連。與直接綁定 VPN 閘道不同,本情境中 IPsec 串連綁定轉寄路由器——通過雲企業網(CEN)的轉寄路由器統一管理雲上網路,後續可靈活擴充更多 VPC 或跨地區互連。

本情境中,IDC 側僅有一個公網出口 IP,與阿里雲建立雙隧道模式的 IPsec 串連:

image

資源規劃

  • 雲上: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 串連。

前提條件

  • 雲上 VPC 網段與雲下 IDC 網段不能衝突。

  • 已建立 VPC,並在兩個不同可用性區域各建立了一個交換器。VPC 內至少有一台 ECS 執行個體用於驗證連通性。

  • 已建立 CEN 和 TR,並且:

  • 已在本地 IDC 部署一台 Linux 伺服器(本文以 CentOS Stream 9 為例),具備 1 個公網出口,後續將在該伺服器上安裝 strongSwan 作為本地網關。

第一步:建立使用者網關

使用者網關用於將本地網關裝置的公網 IP 記錄到阿里雲。本情境中 IDC 只有 1 個公網出口,因此只需建立 1 個使用者網關。

  1. 前往 VPN網關頁面, 在左側導覽列單擊使用者網關

  2. 在頂部功能表列選擇華東1(杭州)地區。

  3. 單擊建立使用者網關,配置:

    名稱:輸入使用者網關名稱,例如 cgw-idc。

    IP地址:輸入本地 IDC 的公網出口 IP(XX.XX.3.3)。

第二步:建立 IPsec 串連

  1. 在 VPN 閘道控制台左側導覽列,單擊IPsec串連

  2. 單擊綁定Cloud Enterprise Network,配置 IPsec 串連基本參數:

    • IPsec串連名稱:填寫資源名稱,例如 ipsec-demo。

    • 地區:選擇華東1(杭州)

    • 網關類型:選擇公網

    • 綁定Cloud Enterprise Network:選擇本帳號綁定

    • 綁定資源:選擇轉寄路由器

    • Cloud Enterprise Network執行個體ID:選擇前提條件中已經建立的雲企業網CEN執行個體。

    • 路由模式:選擇目的路由模式,後續通過在轉寄路由器路由表中添加靜態路由來控制流程量轉寄。

    • 立即生效:選擇是,配置完成後立即進行協商,阿里雲側會主動向對端發起協商。

    • 高級配置(包含自動關聯路由表、配置轉寄路由等配置):全部勾選,包括自動發布路由自動關聯至轉寄路由器的預設路由表自動傳播系統路由至轉寄路由器的預設路由表

  3. 配置隧道參數:

    • 隧道 1(主)

      • 使用者網關:選擇第一步建立的使用者網關。

      • 預先共用金鑰:兩端約定好的密碼,用於建立隧道時互相驗證身份。建議使用複雜密碼,雲上雲下填寫必須完全一致。

    • 隧道 2(備)

      • 使用者網關:選擇與隧道 1 相同的使用者網關(本情境 IDC 只有 1 個公網出口)。

      • 預先共用金鑰:本文使用與隧道 1 相同的密鑰。

        加密配置中的其餘參數保持預設值即可。如需手動指定演算法,可展開加密配置進行修改。
  4. 單擊確定。建立成功後系統提示是否去發布路由,先單擊取消

    IPsec 串連資源初始化約需 5 分鐘(狀態為準備中),此時還無法配置路由。您可以先記錄雲上公網IP地址,後續再前往第三步配置路由。
  5. 記錄雲上 2 條隧道的公網 IP,後續配置 strongSwan 時需使用:

    回到IPsec串連列表頁,找到剛建立的 IPsec 串連。在網關IP列,記錄IPsec地址1:IPsec地址2:。本文以 XX.XX.1.1 和 XX.XX.2.2 為例。

第三步:TR添加靜態路由

由於使用目的路由模式,需手動在TR路由表中添加去往 IDC 網段的路由。

  1. 前往雲企業網控制台,單擊雲企業網執行個體 ID。

  2. 转发路由器頁簽中,找到華東1(杭州)的轉寄路由器,單擊其 ID 進入詳情頁。

  3. 切換到转发路由器路由表頁簽,介面預設展示系統路由表。

  4. 在系統路由表的路由条目頁簽,單擊创建路由条目

    • 目的地址CIDR:輸入 IDC 網段 172.16.0.0/16。

    • 是否为黑洞路由:選擇

    • 下一跳连接:選擇 VPN 串連對應的網路執行個體串連(IPsec 串連綁定轉寄路由器後自動建立的串連)。

  5. 單擊確定

    添加完成後,在路由表中可看到一條靜態路由:目標網段 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 ACCEPT

2. 開啟路由轉寄

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sudo sysctl -p

3. 安裝 strongSwan

sudo dnf install epel-release -y
sudo dnf install strongswan -y

4. 建立 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

  1. 備份原始設定檔:

    mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak
  2. 建立設定檔:

    vi /etc/strongswan/swanctl/swanctl.conf
  3. 添加並儲存以下配置。請將樣本中的 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_inif_id_out 將每條隧道綁定到對應的 XFRM 介面(xfrm1 / xfrm2),確保兩條隧道的流量互不干擾。

    • local_tsremote_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

驗證測試

驗證連通性

  1. 先確保 ECS 的安全性群組規則已放通 ICMP 協議,再登入 strongSwan 裝置,執行以下命令 ping 雲上 ECS:

    ping 10.0.0.1

    若能收到回複報文,說明雲上 VPC 和雲下 IDC 之間已成功互連。

  2. 先確保strongSwan或內網伺服器已放通 ICMP 協議,再登入 VPC 中的 ECS 執行個體(10.0.0.1),ping strongSwan 裝置的內網地址:

    ping 172.16.0.1

    若能收到回複報文,說明反向連通也正常。

驗證高可用

綁定轉寄路由器的 IPsec 串連預設以 ECMP(等價多重路徑)方式同時使用兩條隧道,流量在雙隧道間負載平衡。當一條隧道中斷時,流量會自動收斂到另一條隧道,無需手動切換。

  1. 保持 ECS 持續 ping IDC 伺服器:

    ping 172.16.0.1 -c 10000
  2. 中斷其中一條隧道:在阿里雲控制台修改 IPsec 串連隧道 1 的預先共用金鑰(使兩端密鑰不一致),該隧道將中斷。

  3. 觀察 ping 結果:流量在短暫中斷後重新恢複通訊,說明流量已自動收斂到隧道 2。

  4. 恢複隧道:將隧道 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 裝置)。