全部產品
Search
文件中心

VPN Gateway:建立VPC到本機資料中心的串連(雙隧道模式)

更新時間:Jan 08, 2026

使用 VPN 閘道配置 IPsec-VPN 串連(雙隧道模式)串連 VPC 和本機資料中心,避免單隧道故障導致業務中斷,保障串連高可用。

工作原理

某公司在阿里雲新加坡地區建立 VPC(主網段為 192.168.0.0/16),且在新加坡部署本機資料中心(網段為 172.16.0.0/16)。因業務發展,本機資料中心需要訪問 VPC 中的資源。公司可使用 VPN 閘道建立 VPC 與本機資料中心的 IPsec 串連(雙隧道模式)。

  • 雙隧道模式,即包含一條主隧道和一條備隧道。系統自動檢測主隧道的連通性,當檢測到主隧道中斷後,VPN 閘道會自動將流量切換到備隧道。待主隧道恢複後,流量將自動切回。

  • VPN 閘道建立時會分配兩個公網 IP 位址,分別用於建立主隧道和備隧道。每條隧道獨立完成 IKE 協商與金鑰交換,並承載資料流量。

以本地網關裝置部署 strongSwan 軟體為例。其他本地網關裝置配置樣本
image

適用範圍

  • 本機資料中心的網關裝置:

    • 網關裝置必須配置公網 IP 位址。建議配置 2 個公網 IP 位址或本機資料中心部署 2 個網關裝置,每個網關裝置均配置 1 個公網 IP 位址。

    • 網關裝置必須支援 IKEv1 或 IKEv2 協議。

  • VPC:以下地區和可用性區域支援雙隧道模式的 IPsec-VPN 串連。

    單擊查看支援的地區和可用性區域

    支援調用DescribeVpnGatewayAvailableZones查詢指定地區下支援的可用性區域資訊。如果表中的可用性區域的資訊與查詢到的資訊不符,以調用DescribeVpnGatewayAvailableZones查詢到的資訊為準。

    地區

    可用性區域

    華東1(杭州)

    K、J、I、H、G

    華東2(上海)

    L、M、N、A、B、E、F、G

    華東5(南京-本地地區)

    A

    華南1(深圳)

    A(已停止售賣)、C、E、D、F

    華南2(河源)

    A、B

    華南3(廣州)

    A、B

    華北1(青島)

    B、C

    華北2(北京)

    F、E、H、G、A、C、J、I、L、K

    華北3(張家口)

    A、B、C

    華北5(呼和浩特)

    A、B

    華北6(烏蘭察布)

    A、B、C

    西南1(成都)

    A、B

    中國香港

    B、C、D

    新加坡

    A、B、C

    泰國(曼穀)

    A

    日本(東京)

    A、B、C

    韓國(首爾)

    A

    菲律賓(馬尼拉)

    A

    印尼(雅加達)

    A、B、C

    馬來西亞(吉隆坡)

    A、B

    英國(倫敦)

    A、B

    德國(法蘭克福)

    A、B、C

    美國(矽谷)

    A、B

    美國(維吉尼亞)

    A、B

    墨西哥

    A

    沙特(利雅得)- 夥伴營運

    A、B

    阿聯酋(杜拜)

    A

  • 本機資料中心的網段與 VPC 的網段沒有重疊。

操作步驟

第一步:建立 VPN 閘道

  1. 前往VPN網關管理主控台

    • 執行個體名稱資源群組:可結合使用,統一標識雲資源。

    • 地區:選擇 VPC 所在地區。本文為新加坡

    • 網關類型:選擇普通型

    • 網路類型:選擇公網

    • 隧道:選擇雙隧道

    • 專用網路:選擇計劃與本機資料中心連通的 VPC。

    • 虛擬交換器1虛擬交換器2:選擇 VPC 下不同可用性區域的 2 個交換器。

    • 頻寬峰值:使用預設值。

    • 流量:選擇按流量計費。

    • 開啟IPsec-VPN關閉SSL-VPN

    • 購買時間長度:使用預設值。

    • 服務關聯角色:確保建立服務關聯角色AliyunServiceRoleForVpn,VPN 閘道使用此角色來訪問其他雲產品中的資源。

    image

  2. 返回VPN網關頁面,VPN網關執行個體的初始狀態為準備中,約1~5分鐘左右會轉換為正常。系統會為 VPN 閘道分配兩個公網 IP 位址,分別用於建立主隧道和備隧道。本樣本中,系統分配的兩個公網 IP 位址為:IPsec地址1:120.XX.XX.152(IPsec地址1 - 主隧道)120.XX.XX.0(IPsec地址2 - 備隧道)

第二步:建立使用者網關

前往VPN - 使用者網關頁面,單擊建立使用者網關

分別建立 2 個使用者網關用於建立 2 個加密隧道。

  • IP地址:配置本機資料中心網關裝置的公網 IP 位址。

  • 自治系統號:計劃啟用BGP時,需配置。本文無需配置。

image

image

第三步:建立 IPsec 串連

  1. 前往VPN - 建立IPsec串連頁面,配置完成後單擊確定

    IPsec配置

    • 地區:選擇 VPC 所在地區。本文為新加坡

    • 綁定VPN網關:選擇第一步建立的 VPN 閘道。

    • 路由模式:選擇目的路由模式,基於目的 IP 位址路由和轉寄流量。

    • 立即生效:選擇是,配置完成後立即進行協商。

    image

    隧道配置

    • 啟用BGP:本文選擇不啟用。

    • Tunnel:分別配置主隧道和備隧道。

      • Tunnel 1:主隧道。

        • 使用者網關:選擇第二步建立的使用者網關CGW1

        • 預先共用金鑰:隧道及其對端網關裝置配置的預先共用金鑰需一致,否則系統無法正常建立IPsec-VPN串連。

        • 加密配置:根據本地網關裝置的支援情況選擇,確保 IPsec 串連和本地網關裝置的加密配置保持一致。

      • Tunnel 2:備隧道。

        • 使用者網關:選擇第二步建立的使用者網關CGW2

        • 預先共用金鑰:與主隧道的配置保持一致。且隧道及其對端網關裝置配置的預先共用金鑰需一致,否則系統無法正常建立IPsec-VPN串連。

        • 加密配置:根據本地網關裝置的支援情況選擇,確保 IPsec 串連和本地網關裝置的加密配置保持一致。

    image

    image

  2. 建立成功對話方塊,單擊取消。單擊建立的 IPsec 串連操作列的產生對端配置複製配置並儲存在本地,用於後續配置本地網關裝置。

第四步:配置本地網關裝置

本文以本地網關裝置部署 strongSwan 軟體(下文簡稱為“ strongSwan 裝置”)為例。

其他本地網關裝置配置樣本
以下內容包含的第三方產品資訊僅供參考。阿里雲對第三方產品的效能、可靠性以及操作可能帶來的潛在影響,不做任何暗示或其他形式的承諾。
以下步驟以運行CentOS Stream 9 64位作業系統的strongSwan裝置為例。其他動作系統,請參考strongSwan官方文檔
  1. 放通防火牆策略:在 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
  2. 執行echo 1 > /proc/sys/net/ipv4/ip_forward開啟流量轉寄。

    上述命令為臨時性命令,strongSwan 裝置重啟後需重新設定該命令。可單擊查看永久開啟流量轉寄的配置。

    1. 執行vi /etc/sysctl.conf

    2. 在檔案中添加配置並儲存:net.ipv4.ip_forward = 1

    3. 執行sudo sysctl -p確保配置生效。

  3. 執行dnf install epel-release -ydnf install strongswan -y安裝 strongSwan 軟體。

  4. 配置雙隧道:

    雙出口基於 XFRM 虛擬網路介面實現,使用XFRM虛擬網路介面需要安裝strongSwan 5.8.0或以上版本,同時要求Linux核心版本為4.19及以上、iproute2版本為5.1.0及以上,且核心支援xfrm模組(lsmod | grep xfrm無顯示則不支援)。更多資訊,請參見XFRM Interfaces on Linux

    1. 添加指向阿里雲側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. 建立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裝置重啟後,需要重新添加該配置,並執行sudo systemctl restart strongswan;swanctl --load-all命令(該命令需要root許可權)。單擊查看開機自動啟動指令碼

      1. 執行vi xfrm.sh建立指令碼,添加並儲存如下配置。

      2. 添加並儲存如下配置。

        sudo ip link add ipsec0 type xfrm dev eth0 if_id 42 # 建立隧道1 XFRM虛擬網路介面,介面ID為42,底層介面為公網介面eth0。
        sudo ip link add ipsec1 type xfrm dev eth1 if_id 43 # 建立隧道2 XFRM虛擬網路介面,介面ID為43,底層介面為公網介面eth1。
        sudo ip link set ipsec0 up # 啟動隧道1 XFRM虛擬網路介面。
        sudo ip link set ipsec1 up # 啟動隧道2 XFRM虛擬網路介面。
      3. 執行sudo find / -name xfrm.sh查看指令碼絕對路徑。

      4. 執行sudo vi /etc/rc.d/rc.local,添加指令碼絕對路徑並儲存。

      5. 執行sudo chmod +x /etc/rc.d/rc.localsudo chmod +x /root/xfrm.sh添加可執行許可權。

    3. 修改 strongSwan 設定檔。

      1. 執行mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak備份原始設定檔。

      2. 執行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的預先共用金鑰保持一致。
           }
        }
  5. 重啟 strongSwan 進程,重新載入 strongSwan 配置,查看隧道狀態。

    sudo systemctl restart strongswan
    swanctl --load-all
    watch swanctl --list-sas

    如下圖所示,strongSwan裝置和 VPN 閘道之間已經成功建立 IPsec-VPN 串連。

    image

  6. 配置路由:

    1. 執行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
    2. 執行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
    3. 執行sudo chmod +x /root/connect_1.shsudo chmod +x /root/connect_2.sh賦予可執行許可權。

    4. 執行sudo systemctl restart strongswan重啟 strongSwan 進程。

    5. 執行route -n確認路由是否配置成功。

      image

    6. 為本機資料中心內、計劃與 VPC 連通的伺服器配置目標網段為 VPC 網段、下一跳為 strongSwan 裝置的路由。

    7. 執行以下命令關閉 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。

單擊目的路由表頁簽,選擇添加路由條目

  • 目標網段:配置本機資料中心的網段。

  • 下一跳:選擇第三步建立的 IPsec 串連。

  • 發布到專用網路:選擇,將新添加的路由發布到 VPN 閘道關聯的 VPC。

image

驗證測試

  1. 測試本機資料中心和 VPC 的連通性:登入 VPC 中的 ECS 執行個體,執行ping <本機資料中心伺服器私網IP地址>,收到本機資料中心伺服器的回複報文,即可正常通訊。

  2. 測試 IPsec-VPN 串連的高可用性。

    1. 登入 VPC 中的 ECS 執行個體,執行ping <本機資料中心伺服器私網IP地址> -c 10000連續向本機資料中心發送訪問報文。

    2. 中斷 IPsec-VPN 串連的主隧道:可通過修改 IPsec 串連主隧道的預先共用金鑰,主隧道因兩端的預先共用金鑰不一致而中斷。

    3. 中斷主隧道後,觀察 VPC 中 ECS 執行個體的通訊情況:流量在短暫中斷後,又重新恢複通訊,則表示在主隧道中斷後,流量自動通過備隧道進行通訊。

      image