全部產品
Search
文件中心

VPN Gateway:strongSwan配置樣本

更新時間:Dec 16, 2025

本文介紹如何使用strongSwan作為本地網關,實現雲上和雲下的網路互連。

strongSwan是一個開源、基於IPsec的VPN解決方案,配置簡單,可部署在主流的Linux發行版,快速地與阿里雲建立IPsec-VPN串連。

說明

本文使用VPN網關執行個體預設的什麼是IPsec-VPN建立IPsec-VPN串連。如果您購買的VPN網關執行個體僅支援單隧道,請參見文末的單隧道如何配置?

情境樣本

以下圖情境為例,您可以在本地網關裝置上部署strongSwan軟體(下文簡稱為“strongSwan裝置”),與阿里雲建立雙隧道模式的IPsec-VPN串連,實現雲上雲下網路互連。

image

IP地址規劃

本地IDC側

  • 私網網段:172.16.0.0/16

  • strongSwan裝置

    • 網卡eth0: 172.16.20.80,NAT映射公網出口1:120.XX.XX.202

    • (可選)網卡eth1: 172.16.21.248,NAT映射公網出口2: 47.XX.XX.127

      說明

      非NAT情境,請參見“strongSwan裝置網卡綁定了公網IP地址,如何配置?”。

      無論您的裝置有1個公網出口(單出口),還是有2個公網出口(雙出口),均可與阿里雲建立雙隧道模式的IPsec-VPN串連,本文會分別給出樣本。

阿里雲側

  • VPC網段:192.168.0.0/16

    • 交換器1網段:192.168.10.0/24

    • 交換器2網段:192.168.10.0/24

    • 交換器3網段:192.168.40.0/24

    • 交換器4網段:192.168.50.0/24

    • 交換器5網段:192.168.55.0/24

  • VPN網關

    • IPsec地址1: 47.XX.XX.151

    • IPsec地址2: 47.XX.XX.87

      說明

      建立VPN網關執行個體後,系統會自動為VPN網關執行個體分配兩個IPsec地址。

BGP IP地址

本文將分別描述IPsec-VPN串連使用靜態路由方式和BGP動態路由方式下如何配置strongSwan裝置。如果您不需要使用BGP動態路由方式,可以忽略本部分。以下為本文的BGP網段規劃。

資源

隧道

BGP隧道網段

BGP IP地址

BGP AS號(本端自治系統號)

VPN網關執行個體

隧道1

169.254.10.0/30

說明

一個VPN網關執行個體下,每個隧道的網段需保持唯一。

169.254.10.1

65535

隧道2

169.254.20.0/30

169.254.20.1

strongSwan裝置

隧道1

169.254.10.0/30

169.254.10.2

65530

隧道2

169.254.20.0/30

169.254.20.2

VPN參數配置規劃

本文2條隧道使用相同的樣本值。注意每條隧道下,strongSwan裝置側和阿里雲側的配置要保持相同。

  • 預先共用金鑰:ChangeMe***

  • IKE配置

    • IKE版本:ikev2

    • 協商模式:main

    • 密碼編譯演算法:aes

    • 認證演算法:sha1

    • DH分組:group2

    • SA生存周期(秒):86400

  • IPsec配置:

    • 密碼編譯演算法:aes

    • 認證演算法:sha1

    • DH分組:group2

    • SA生存周期(秒):86400

阿里雲側的準備工作

根據您計劃使用的公網出口數量和路由方式,參見以下內容,完成阿里雲側的配置:

雙出口-BGP動態路由

請參見建立VPC到本機資料中心的串連(雙隧道模式和BGP路由),完成建立VPN網關執行個體建立使用者網關建立IPsec串連開啟BGP路由自動傳播功能的步驟。

  1. strongSwan裝置擁有2個公網出口IP,需要建立2個使用者網關。

  2. 建立IPsec串連時,隧道1對應公網出口1,隧道2對應公網出口2。路由模式本情境以目的路由模式為例。

雙出口-靜態路由

請參見建立VPC到本機資料中心的串連(雙隧道模式),完成建立VPN網關執行個體建立使用者網關建立IPsec串連配置VPN網關路由的步驟。

  1. strongSwan裝置擁有2個公網出口IP,需要建立2個使用者網關。

  2. 建立IPsec串連時,隧道1對應公網出口1,隧道2對應公網出口2。路由模式本情境以目的路由模式為例。

單出口-BGP動態路由

請參見建立VPC到本機資料中心的串連(雙隧道模式和BGP路由),完成建立VPN網關執行個體建立使用者網關建立IPsec串連開啟BGP路由自動傳播功能的步驟。

  1. strongSwan裝置僅有1個公網出口IP,因此僅需建立1個使用者網關。

  2. 建立IPsec串連時,兩條隧道關聯同1個使用者網關。路由模式本情境以目的路由模式為例。

單出口-靜態路由

請參見建立VPC到本機資料中心的串連(雙隧道模式),完成建立VPN網關執行個體建立使用者網關建立IPsec串連配置VPN網關路由的步驟。其中:

  1. strongSwan裝置僅有1個公網出口IP,因此僅需建立1個使用者網關。

  2. 建立IPsec串連時,需使用感興趣流模式,配置如下。兩條隧道關聯同1個使用者網關。

    • 本端網段輸入阿里雲側VPC的網段192.168.0.0/16

    • 對端網段輸入本地IDC側的私網網段172.16.0.0/16

說明

對於IPsec串連綁定轉寄路由器的情境,更推薦您使用BGP動態路由協議,不推薦使用該方式。

開始配置strongSwan裝置

說明

下文步驟以運行“CentOS Stream 9 64位作業系統”的strongSwan裝置為例。其他動作系統,請參考strongSwan官方文檔

1. 放通防火牆策略

在strongSwan裝置上放通ESP協議(IP協議號50)、UDP500連接埠、UDP4500連接埠。

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裝置重啟後需重新設定該命令。您可以參見以下內容永久開啟strongSwan裝置的流量轉寄功能。

單擊查看永久配置。

  1. 開啟/etc/sysctl.conf檔案。

    vi /etc/sysctl.conf
  2. 在檔案中添加如下配置。

    net.ipv4.ip_forward = 1
  3. 使配置生效。

    sudo sysctl -p

3. 安裝strongSwan軟體

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

4. 配置雙隧道

雙出口-靜態路由和BGP動態路由

重要

雙出口基於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出口訪問。

    ip route add 47.XX.XX.151 via 172.16.20.253 dev eth0  #172.16.20.253是eth0私網網關地址
    ip route add 47.XX.XX.87 via 172.16.21.253 dev eth1   #172.16.20.253是eth1私網網關地址

    確保下面2個IPsec地址能ping通。

    ping 47.XX.XX.151 
    ping 47.XX.XX.87 
  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許可權)。您可以參見以下內容為strongSwan裝置添加開機自動啟動指令碼,strongSwan裝置重啟後會自動重新添加虛擬網路介面。

    單擊查看開機自動啟動指令碼

    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命令,將指令碼絕對路徑添加進/etc/rc.d/rc.local檔案。

      按下i鍵,進入編輯模式;將指令碼絕對路徑/root/xfrm.sh添加進/etc/rc.d/rc.local檔案;按下Esc鍵,退出編輯模式,然後輸入:wq儲存配置。

    5. 為rc.local檔案和xfrm.sh指令碼添加可執行許可權。

      sudo chmod +x /etc/rc.d/rc.local
      sudo chmod +x /root/xfrm.sh
  3. 修改strongSwan設定檔。

    1. 備份原始strongSwan設定檔。

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

      vi /etc/strongswan/swanctl/swanctl.conf
    3. 根據情境樣本中IPsec參數規劃,添加並儲存如下配置。

      重要

      如果您計劃使用靜態路由方式,需要在設定檔中啟用以下兩條命令updown = /root/connect_1.shupdown = /root/connect_2.sh

      connections {
         vco1 {                            # 添加IPsec-VPN隧道1的VPN配置
            version = 2                    # 指定IKE版本,需與阿里雲隧道1的IKE版本保持一致,2表示IKEv2。
            local_addrs  = 172.16.20.80       # 第1個本地網卡的ip地址
            remote_addrs = 47.XX.XX.151       # 指定隧道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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
            encap = yes
      
            local {
               auth = psk                  # 本段認證方式選擇PSK模式,即預先共用金鑰方式。
               id = 120.XX.XX.202             # 第1個本地公網出口IP,需與阿里雲隧道1的RemoteId保持一致。
            }
            remote {
               auth = psk                  # 對端認證方式選擇PSK方式,即阿里雲使用預先共用金鑰方式。
               id = 47.XX.XX.151             # 阿里雲側IPsec地址1,需與阿里雲隧道1的LocalId保持一致。
            }
            children {
               vco_child1 {
                  local_ts  = 0.0.0.0/0    # 阿里雲目的路由模式對應的感興趣流是0.0.0.0/0。
                  remote_ts = 0.0.0.0/0    # 阿里雲目的路由模式對應的感興趣流是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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,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.21.248        # 第2個本地網卡的ip地址。
            remote_addrs = 47.XX.XX.87       # 指定隧道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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
            encap = yes
      
            local {
               auth = psk                  # 本端認證方式選擇PSK方式,即預先共用金鑰方式。
               id = 47.XX.XX.127              # 第2個本地公網出口IP,,需與阿里雲隧道2的RemoteId保持一致。
            }
            remote {
               auth = psk                  # 對端認證方式選擇PSK方式,即阿里雲使用預先共用金鑰方式。
               id = 47.XX.XX.87             # 阿里雲側IPsec地址2,需與阿里雲隧道2的LocalId保持一致。
            }
            children {
               vco_child2 {
                  local_ts  = 0.0.0.0/0    # 阿里雲目的路由模式對應的感興趣流是0.0.0.0/0
                  remote_ts = 0.0.0.0/0    # 阿里雲目的路由模式對應的感興趣流是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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,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指令碼,以配置路由。僅使用靜態路由時需要配置該參數。
               }
            }
         }
      }
      
      secrets {
         ike-vco1 {
            id = 47.XX.XX.151               # 阿里雲側 VPN網關隧道1的公網IP地址
            secret = ChangeMe***            # 指定隧道1的預先共用金鑰,需與阿里雲隧道1的預先共用金鑰保持一致。
         }
         ike-vco2 {
            id = 47.XX.XX.87                # 阿里雲側 VPN網關隧道2的公網IP地址
            secret = ChangeMe***            # 指定隧道2的預先共用金鑰,需與阿里雲隧道2的預先共用金鑰保持一致。
         }
      }
  4. 重啟strongSwan進程,重新載入strongSwan配置,查看隧道狀態。

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

    如下圖所示,strongSwan裝置和VPN網關之間已經成功建立IPsec-VPN串連,但網路還無法正常互連,您還需要配置路由。

    IPsec-VPN

  5. 配置路由。

    根據您計劃使用的路由方式查看對應內容。

    BGP動態路由

    說明

    strongSwan裝置重啟後,需要重新添加BGP配置。

    1. 執行以下命令配置BGP IP地址。

      ip address add 169.254.10.2/30 dev ipsec0
      ip address add 169.254.20.2/30 dev ipsec1
    2. 安裝frr軟體。

      yum install -y frr
    3. 執行vi /etc/frr/daemons命令,編輯設定檔,開啟BGP動態路由功能。

      按下i鍵,進入編輯模式;修改bgpd參數的值為yes,開啟BGP動態路由功能;按下Esc鍵,退出編輯模式,然後輸入:wq儲存配置。

    4. 運行frr功能。

      systemctl enable frr
      systemctl restart frr
    5. 添加BGP配置。

      1. 執行以下命令進入配置介面。

        vtysh
      2. 執行以下命令進入配置模式。

        config terminal
      3. 添加BGP配置。

        執行命令時,將以下地址替換為您實際使用的地址。

        • “169.254.10.1”、“169.254.20.1”替換為您實際使用的阿里雲側隧道BGP IP地址。

        • “65535”替換為您實際情境中VPN網關執行個體的BGP AS號。

        • “172.16.20.0/24”、“172.16.21.0/24”替換為您實際情境中本地IDC的網段。

        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.20.0/24                  
          network 172.16.21.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
        
    6. 執行exit命令退出配置模式,然後執行show ip bgp命令查看BGP路由條目。

      可以看到strongswan裝置已經成功學習到雲上VPC的路由,本地IDC與雲上VPC之間已經可以正常互連。BGP路由

    靜態路由

    建立2個指令碼,供strongSwan調用並配置路由,從而控制流程量傳輸。

    1. 建立並編輯/root/connect_1.sh指令碼。

      vi /root/connect_1.sh
    2. 添加並儲存如下內容。

      #!/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

      指令碼功能:如果隧道1的狀態是UP,則添加路由使本機資料中心去往阿里雲VPC(192.168.0.0/16)的流量通過隧道1 XFRM虛擬網路介面傳輸,同時指定該路由的metric值為100,使該路由的優先順序高於指向隧道2 XFRM虛擬網路介面的路由。如果隧道1的狀態是DOWN,則撤銷該路由。

    3. 建立並編輯/root/connect_2.sh指令碼。

      vi /root/connect_2.sh
    4. 添加並儲存如下內容。

      #!/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

      指令碼功能:如果隧道2的狀態是UP,則添加路由使本機資料中心去往阿里雲VPC(192.168.0.0/16)的流量通過隧道2 XFRM虛擬網路介面傳輸,同時指定該路由的metric值為101,使該路由的優先順序低於指向隧道1 XFRM虛擬網路介面的路由。如果隧道2的狀態是DOWN,則撤銷該路由。

    5. 為2個指令碼賦予可執行許可權。

      sudo chmod +x /root/connect_1.sh
      sudo chmod +x /root/connect_2.sh
    6. 重啟strongSwan進程。

      sudo systemctl restart strongswan
    7. 執行以下命令查看路由是否配置成功。

      route -n

      靜態路由

單出口-BGP動態路由

重要

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

  1. 建立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 eth0 if_id 43 # 建立隧道2 XFRM虛擬網路介面,介面ID為43,底層介面為公網介面eth0。
    ip link set ipsec0 up # 啟動隧道1 XFRM虛擬網路介面。
    ip link set ipsec1 up # 啟動隧道2 XFRM虛擬網路介面。
    重要

    建立虛擬網路介面的配置為臨時性配置,strongSwan裝置重啟後,需要重新添加該配置,並執行sudo systemctl restart strongswan;swanctl --load-all命令(該命令需要root許可權)。您可以參見以下內容為strongSwan裝置添加開機自動啟動指令碼,strongSwan裝置重啟後會自動重新添加虛擬網路介面。

    單擊查看開機自動啟動指令碼

    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 eth0 if_id 43 # 建立隧道2 XFRM虛擬網路介面,介面ID為43,底層介面為公網介面eth0。
      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命令,將指令碼絕對路徑添加進/etc/rc.d/rc.local檔案。

      按下i鍵,進入編輯模式;將指令碼絕對路徑/root/xfrm.sh添加進/etc/rc.d/rc.local檔案;按下Esc鍵,退出編輯模式,然後輸入:wq儲存配置。

    5. 為rc.local檔案和xfrm.sh指令碼添加可執行許可權。

      sudo chmod +x /etc/rc.d/rc.local
      sudo chmod +x /root/xfrm.sh
  2. 修改strongSwan設定檔。

    1. 備份原始strongSwan設定檔。

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

      vi /etc/strongswan/swanctl/swanctl.conf
    3. 根據情境樣本中IPsec參數規劃,添加並儲存如下配置。

      connections {
         vco1 {                            # 添加IPsec-VPN隧道1的VPN配置。
            version = 2                    # 指定IKE版本,需與阿里雲隧道1的IKE版本保持一致,2表示IKEv2。
            local_addrs  = 172.16.20.80    # eth0介面私網IP地址。
            remote_addrs = 47.XX.XX.151    # 指定隧道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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
            encap = yes
      
            local {
               auth = psk                  # 本端認證方式選擇PSK模式,即預先共用金鑰方式。
               id = 120.XX.XX.202          # eth0公網出口IP,需與阿里雲隧道1的RemoteId保持一致。
            }
            remote {
               auth = psk                  # 對端認證方式選擇PSK方式,即阿里雲使用預先共用金鑰方式。
               id = 47.XX.XX.151           # 阿里雲側IPsec地址1,需與阿里雲隧道1的LocalId保持一致。
            }
            children {
               vco_child1 {
                  local_ts  = 0.0.0.0/0    # 阿里雲目的路由模式對應的感興趣流是0.0.0.0/0。
                  remote_ts = 0.0.0.0/0    # 阿里雲目的路由模式對應的感興趣流是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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
      
                  if_id_out = 42           # 指定隧道1的出介面和入介面為隧道1 XFRM虛擬網路介面。
                  if_id_in = 42
               }
            }
         }
        vco2 {                             # 添加IPsec-VPN隧道2的VPN配置
            version = 2                    # 指定IKE版本,需與阿里雲隧道2的IKE版本保持一致,2表示IKEv2。
            local_addrs  = 172.16.20.80    # eth0介面的私網IP地址。
            remote_addrs = 47.XX.XX.87     # 指定隧道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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
            encap = yes
      
            local {
               auth = psk                  # 本端認證方式選擇PSK方式,即預先共用金鑰方式。
               id = 120.XX.XX.202          # eth0公網出口IP,需與阿里雲隧道2的RemoteId保持一致。
            }
            remote {
               auth = psk                  # 對端認證方式選擇PSK方式,即阿里雲使用預先共用金鑰方式。
               id = 47.XX.XX.87            # 阿里雲側IPsec地址2,需與阿里雲隧道2的LocalId保持一致。
            }
            children {
               vco_child2 {
                  local_ts  = 0.0.0.0/0    # 阿里雲目的路由模式對應的感興趣流是0.0.0.0/0。
                  remote_ts = 0.0.0.0/0    # 阿里雲目的路由模式對應的感興趣流是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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
                  if_id_out = 43           # 指定隧道2的出介面和入介面為隧道2 XFRM虛擬網路介面。
                  if_id_in = 43
                
               }
            }
         }
      }
      
      secrets {
         ike-vco1 {
            id = 47.XX.XX.151               # 阿里雲側 VPN網關隧道1的公網IP地址
            secret = ChangeMe***            # 指定隧道1的預先共用金鑰,需與阿里雲隧道1的預先共用金鑰保持一致。
         }
         ike-vco2 {
            id = 47.XX.XX.87               # 阿里雲側 VPN網關隧道2的公網IP地址
            secret = ChangeMe***            # 指定隧道2的預先共用金鑰,需與阿里雲隧道2的預先共用金鑰保持一致。
         }
      }
  3. 重啟strongSwan進程,重新載入strongSwan配置,查看隧道狀態。

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

    如下圖所示,strongSwan裝置和VPN網關之間已經成功建立IPsec-VPN串連,但網路還無法正常互連,您還需要配置路由。

    單出口

  4. 配置BGP動態路由。

    說明

    strongSwan裝置重啟後,需要重新添加BGP配置。

    1. 執行以下命令配置BGP IP地址。

      ip address add 169.254.10.2/30 dev ipsec0
      ip address add 169.254.20.2/30 dev ipsec1
    2. 安裝frr軟體。

      yum install -y frr
    3. 執行vi /etc/frr/daemons命令,編輯設定檔,開啟BGP動態路由功能。

      按下i鍵,進入編輯模式;修改bgpd參數的值為yes,開啟BGP動態路由功能;按下Esc鍵,退出編輯模式,然後輸入:wq儲存配置。

    4. 運行frr功能。

      systemctl enable frr
      systemctl restart frr
    5. 添加BGP配置。

      1. 執行以下命令進入配置介面。

        vtysh
      2. 執行以下命令進入配置模式。

        config terminal
      3. 添加BGP配置。

        執行命令時,將以下地址替換為您實際使用的地址。

        • “169.254.10.1”、“169.254.20.1”替換為您實際使用的阿里雲側隧道BGP IP地址。

        • “65535”替換為您實際情境中VPN網關執行個體的BGP AS號。

        • “172.16.20.0/24”、“172.16.21.0/24”替換為您實際情境中本地IDC的網段。

        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.20.0/24                  
          network 172.16.21.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
        
    6. 執行exit命令退出配置模式,然後執行show ip bgp命令查看BGP路由條目。

      可以看到strongswan裝置已經成功學習到雲上VPC的路由,本地IDC與雲上VPC之間已經可以正常互連。BGP路由

單出口-靜態路由

重要

單出口-靜態路由方式下如果阿里雲側判斷主隧道有風險,會主動將流量切換至備隧道,有可能會導致流量不通。您可以觀察/proc/net/xfrm_stat檔案中XfrmInTmplMismatch參數的值來判斷阿里雲側是否已將流量切換至備隧道,如果該參數的值一直在變化,則證明阿里雲側已將流量切換至備隧道,您可以在/etc/strongswan/swanctl/swanctl.conf檔案中修改備隧道priority的值,使本地IDC上雲的流量優先通過備隧道傳輸。

  1. 備份原始strongSwan設定檔。

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

    vi /etc/strongswan/swanctl/swanctl.conf
  3. 根據情境樣本中的規劃,添加並儲存如下配置。

    connections {
       vco1 {                              # 添加IPsec-VPN隧道1的VPN配置。
          version = 2                      # 指定IKE版本,需與阿里雲隧道1的IKE版本保持一致,2表示IKEv2。
          local_addrs  = 172.16.20.80      # eth0私網IP地址。
          remote_addrs = 47.XX.XX.151      # 指定隧道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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
          encap = yes
    
          local {
             auth = psk                    # 本端認證方式選擇PSK模式,即預先共用金鑰方式。
             id = 120.XX.XX.202            # 本地公網出口IP,需與阿里雲隧道1的RemoteId保持一致。
          }
          remote {
             auth = psk                    # 對端認證方式選擇PSK方式,即阿里雲使用預先共用金鑰方式。
             id = 47.XX.XX.151             # 阿里雲側IPsec地址1,需與阿里雲隧道1的LocalId保持一致。
          }
          children {
             vco_child1 {
                local_ts  = 172.16.0.0/16   # 本地側感興趣流,填寫本地私網網段172.16.0.0/16。
                remote_ts = 192.168.0.0/16  # 阿里雲側感興趣流,填寫VPC網段192.168.0.0/16。
                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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
                priority = 1                        # 指定隧道1的優先順序,優先使用主隧道上雲。
             }
          }
       }
      vco2 {                             # 添加IPsec-VPN隧道2的VPN配置
          version = 2                    # 指定IKE版本,需與阿里雲隧道2的IKE版本保持一致,2表示IKEv2。
          local_addrs  = 172.16.20.80    # eth0私網IP地址
          remote_addrs = 47.XX.XX.87     # 指定隧道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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
          encap = yes
    
          local {
             auth = psk                  # 本端認證方式選擇PSK方式,即預先共用金鑰方式。
             id = 120.XX.XX.202          # 本地公網出口IP,與阿里雲隧道2的RemoteId保持一致。
          }
          remote {
             auth = psk                  # 對端認證方式選擇PSK方式,即阿里雲使用預先共用金鑰方式。
             id = 47.XX.XX.87            # 阿里雲側IPsec地址2,需與阿里雲隧道2的LocalId保持一致。
          }
          children {
             vco_child2 {
                local_ts  = 172.16.0.0/16     # 本地側感興趣流,填寫本地私網網段172.16.0.0/16。
                remote_ts =  192.168.0.0/16   # 阿里雲側感興趣流,填寫VPC網段192.168.0.0/16。
                mode = tunnel 
                rekey_time = 85500
                life_time = 86400        # 指定隧道2的SA生存周期,需與阿里雲隧道2 IPsec配置中的SA生存周期保持一致。
                dpd_action = restart
                start_action = start
                close_action = start
                esp_proposals = aes-sha1-modp1024     # 指定隧道2的密碼編譯演算法、認證演算法、DH分組,需與阿里雲隧道2 IPsec配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
                priority = 2                          # 指定隧道2的優先順序,隧道2的優先順序低於隧道1。
             }
          }
       }
    }
    
    secrets {
       ike-vco1 {
          id = 47.XX.XX.151               # 阿里雲側 VPN網關隧道1的公網IP地址
          secret = ChangeMe***            # 指定隧道1的預先共用金鑰,需與阿里雲隧道1的預先共用金鑰保持一致。
       }
       ike-vco2 {
          id = 47.XX.XX.87                # 阿里雲側 VPN網關隧道2的公網IP地址
          secret = ChangeMe***            # 指定隧道2的預先共用金鑰,需與阿里雲隧道2的預先共用金鑰保持一致。
       }
    }
  4. 重啟strongSwan進程,重新載入strongSwan配置,查看隧道狀態。

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

    如下圖所示,strongSwan裝置和VPN網關之間已經成功建立IPsec-VPN串連,本地IDC和VPC之間已經可以互相通訊。

    單出口

5. 驗證連通性和高可用性

  1. 驗證本地IDC和VPC之間的連通性。

    使用本地IDC中的一台用戶端ping阿里雲VPC內的任意1台ECS,如果能ping通,則證明連通正常。

    ping <VPC內1台ECS的地址>
  2. 驗證IPsec-VPN串連的高可用性。

    1. 保持ping通的情況下,中斷IPsec-VPN串連下的主隧道。

      您可以通過修改IPsec串連主隧道的預先共用金鑰來中斷主隧道,主隧道兩端的預先共用金鑰不一致,則主隧道會中斷。

    2. 中斷主隧道後,您可以通過ping命令觀察兩側的連通情況。您會發現ping流量在短暫中斷後,又重新恢複通訊。這表示在主隧道中斷後,流量自動通過備隧道進行通訊。

常見問題

IPsec串連綁定轉寄路由器情境下如何配置strongSwan裝置?

IPsec串連綁定轉寄路由器的情境下,strongSwan裝置側的配置與上文相同。推薦您使用BGP動態路由協議,配置完成後,可以在strongSwan裝置上看到通過BGP動態路由協議學習到的VPC側路由,IPsec-VPN串連的兩條隧道自動形成ECMP鏈路。等價路由

IKEv1版本,使用strongSwan建立IPsec-VPN串連時是否支援?

支援。

配置/etc/strongswan/swanctl/swanctl.conf檔案時,指定version = 1即可。

如何指定感興趣流?

配置/etc/strongswan/swanctl/swanctl.conf檔案時,在以下配置中指定具體網段即可。請確保阿里雲側IPsec串連也配置了感興趣流模式。

如果本機資料中心側或阿里雲側需要指定多個網段,strongSwan裝置和阿里雲IPsec串連均需要使用IKEv2版本。

children {
         vco_child1 {
            local_ts  = 192.168.20.0/24,192.168.50.0/24    # 本機資料中心網段。
            remote_ts = 10.0.0.0/16    # 阿里雲VPC側網段。
         }
}

strongSwan裝置網卡綁定了公網IP地址,如何配置?

對於非NAT的情境,也就是strongSwan裝置內部可見的地址為公網IP地址,僅需將/etc/strongswan/swanctl/swanctl.conf設定檔中每條隧道的local_addrs欄位改為公網IP地址即可,其他配置不變。

connections {
   vco1 {                            
      local_addrs  = 1.1.XX.XX     # 指定為strongSwan裝置網卡綁定的公網IP地址
   }
}

單隧道如何配置?

重要

如果您購買的VPN網關執行個體僅支援建立單隧道模式的IPsec-VPN串連,推薦您升級IPsec-VPN串連為雙隧道模式,雙隧道模式的IPsec-VPN串連支援可用性區域層級的容災,有效提高了網路的高可用性。

單擊此處查看單隧道配置樣本

單隧道配置樣本

情境樣本

以下圖情境為例,您可以在本地網關裝置上部署strongSwan軟體(下文簡稱為“strongSwan裝置”),與阿里雲建立雙隧道模式的IPsec-VPN串連,實現雲上雲下網路互連。

image

IP地址規劃

本地IDC側

阿里雲側

  • VPC網段:172.16.0.0/16

    • 交換器1網段:172.16.1.0/24

    • 交換器2網段:172.16.2.0/24

  • VPN網關

    • IPsec地址:3.3.XX.XX

      說明

      建立VPN網關執行個體後,系統會自動為VPN網關執行個體分配IPsec地址。

VPN參數配置規劃

注意strongSwan裝置側和阿里雲側的配置要保持相同。

  • 預先共用金鑰:ChangeMe***

  • IKE配置

    • IKE版本:ikev2

    • 協商模式:main

    • 密碼編譯演算法:aes

    • 認證演算法:sha1

    • DH分組:group2

    • SA生存周期(秒):86400

  • IPsec配置:

    • 密碼編譯演算法:aes

    • 認證演算法:sha1

    • DH分組:group2

    • SA生存周期(秒):86400

阿里雲側的準備工作

配置strongSwan裝置之前,請先根據情境樣本中的規劃,在阿里雲側完成建立VPN網關執行個體建立使用者網關建立IPsec串連配置VPN網關路由的步驟。具體操作,請參見建立VPC到本機資料中心的串連(單隧道模式)

建立IPsec串連時,隧道的路由模式選擇感興趣流模式:

  • 本端網段填寫阿里雲側VPC的網段 172.16.0.0/16

  • 對端網段填寫本地IDC側的私網網段 10.0.0.0/16

開始配置strongSwan裝置

說明

下文步驟以運行“CentOS Stream 9 64位作業系統”的strongSwan裝置為例。其他動作系統,請參考strongSwan的官方文檔

1. 放通防火牆策略

放通strongSwan裝置的ESP協議(IP協議號50)、UDP500連接埠、UDP4500連接埠。

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裝置重啟後需重新設定該命令。您可以參見以下內容永久開啟strongSwan裝置的流量轉寄功能。

單擊查看永久配置。

  1. 開啟/etc/sysctl.conf檔案。

    vi /etc/sysctl.conf
  2. 在檔案中添加如下配置。

    net.ipv4.ip_forward = 1
  3. 使配置生效。

    sudo sysctl -p

3. 安裝strongSwan軟體

dnf install epel-release -y
dnf install strongswan-5.9.10 -y

4. 配置隧道

基於strongSwan感興趣流進行配置。

  1. 備份原始strongSwan設定檔

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

    vi /etc/strongswan/swanctl/swanctl.conf
  3. 根據情境樣本中的規劃,添加並儲存如下配置

    connections {
       vco1 {                            # 添加IPsec-VPN隧道1的VPN配置
          version = 2                    # 指定IKE版本,需與阿里雲隧道1的IKE版本保持一致,2表示IKEv2。
          local_addrs  = 10.0.0.1        # 本地網卡的ip地址
          remote_addrs = 3.3.XX.XX       # 指定隧道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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
          encap = yes
    
          local {
             auth = psk                  # 本段認證方式選擇PSK模式,即預先共用金鑰方式。
             id = 1.1.XX.XX              # 公網出口IP,與阿里雲隧道1的RemoteId保持一致。
          }
          remote {
             auth = psk                  # 對端認證方式選擇PSK方式,即阿里雲使用預先共用金鑰方式。
             id = 3.3.XX.XX              # 阿里雲側IPsec地址,需與阿里雲隧道1的LocalId保持一致。
          }
          children {
             vco_child1 {
                local_ts  = 10.0.0.0/16    # 阿里雲目的路由模式對應的感興趣流是0.0.0.0/0。
                remote_ts = 172.16.0.0/16    # 阿里雲目的路由模式對應的感興趣流是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配置中的密碼編譯演算法、認證演算法、DH分組保持一致,group2對應的是modp1024。
             }
          }
       }
    
    }
    
    secrets {
       ike-vco1 {
          id = 3.3.XX.XX               # 阿里雲側 VPN網關隧道1的公網IP地址
          secret = ChangeMe***            # 指定隧道1的預先共用金鑰,需與阿里雲隧道1的預先共用金鑰保持一致。
       }
    }
    
  4. 重啟strongSwan進程,重新載入strongSwan配置

    systemctl restart strongswan
    swanctl --load-all
  5. 查看隧道狀態

    watch swanctl --list-sas 

    image

    如圖,strongSwan裝置和VPN網關之間已經正常建立了IPsec-VPN串連。

5. 驗證

驗證strongSwan裝置和VPC之間的連通性:

在strongSwan裝置ping阿里雲VPC內的任意1台ECS,如果能Ping通,則證明連通正常。

ping <VPC內1台ECS的地址>