本文介紹如何使用strongSwan作為本地網關,實現雲上和雲下的網路互連。
strongSwan是一個開源、基於IPsec的VPN解決方案,配置簡單,可部署在主流的Linux發行版,快速地與阿里雲建立IPsec-VPN串連。
本文使用VPN網關執行個體預設的什麼是IPsec-VPN建立IPsec-VPN串連。如果您購買的VPN網關執行個體僅支援單隧道,請參見文末的單隧道如何配置?。
情境樣本
以下圖情境為例,您可以在本地網關裝置上部署strongSwan軟體(下文簡稱為“strongSwan裝置”),與阿里雲建立雙隧道模式的IPsec-VPN串連,實現雲上雲下網路互連。
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路由自動傳播功能的步驟。
strongSwan裝置擁有2個公網出口IP,需要建立2個使用者網關。
建立IPsec串連時,隧道1對應公網出口1,隧道2對應公網出口2。路由模式本情境以目的路由模式為例。
雙出口-靜態路由
請參見建立VPC到本機資料中心的串連(雙隧道模式),完成建立VPN網關執行個體、建立使用者網關、建立IPsec串連、配置VPN網關路由的步驟。
strongSwan裝置擁有2個公網出口IP,需要建立2個使用者網關。
建立IPsec串連時,隧道1對應公網出口1,隧道2對應公網出口2。路由模式本情境以目的路由模式為例。
單出口-BGP動態路由
請參見建立VPC到本機資料中心的串連(雙隧道模式和BGP路由),完成建立VPN網關執行個體、建立使用者網關、建立IPsec串連、開啟BGP路由自動傳播功能的步驟。
strongSwan裝置僅有1個公網出口IP,因此僅需建立1個使用者網關。
建立IPsec串連時,兩條隧道關聯同1個使用者網關。路由模式本情境以目的路由模式為例。
單出口-靜態路由
請參見建立VPC到本機資料中心的串連(雙隧道模式),完成建立VPN網關執行個體、建立使用者網關、建立IPsec串連、配置VPN網關路由的步驟。其中:
strongSwan裝置僅有1個公網出口IP,因此僅需建立1個使用者網關。
建立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 ACCEPT2. 開啟流量轉寄功能
echo 1 > /proc/sys/net/ipv4/ip_forward上述命令為臨時性命令,strongSwan裝置重啟後需重新設定該命令。您可以參見以下內容永久開啟strongSwan裝置的流量轉寄功能。
3. 安裝strongSwan軟體
dnf install epel-release -y
dnf install strongswan -y4. 配置雙隧道
雙出口-靜態路由和BGP動態路由
雙出口基於XFRM虛擬網路介面實現,使用XFRM虛擬網路介面需要安裝strongSwan 5.8.0或以上版本,同時要求Linux核心版本為4.19及以上、iproute2版本為5.1.0及以上,且核心支援xfrm模組(lsmod | grep xfrm無顯示則不支援)。更多資訊,請參見XFRM Interfaces on Linux。
添加去往阿里雲側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個虛擬網路介面,用於建立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裝置重啟後會自動重新添加虛擬網路介面。修改strongSwan設定檔。
備份原始strongSwan設定檔。
mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak建立strongSwan設定檔。
vi /etc/strongswan/swanctl/swanctl.conf根據情境樣本中IPsec參數規劃,添加並儲存如下配置。
重要如果您計劃使用靜態路由方式,需要在設定檔中啟用以下兩條命令
updown = /root/connect_1.sh和updown = /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的預先共用金鑰保持一致。 } }
重啟strongSwan進程,重新載入strongSwan配置,查看隧道狀態。
sudo systemctl restart strongswan swanctl --load-all watch swanctl --list-sas如下圖所示,strongSwan裝置和VPN網關之間已經成功建立IPsec-VPN串連,但網路還無法正常互連,您還需要配置路由。

配置路由。
根據您計劃使用的路由方式查看對應內容。
BGP動態路由
說明strongSwan裝置重啟後,需要重新添加BGP配置。
執行以下命令配置BGP IP地址。
ip address add 169.254.10.2/30 dev ipsec0 ip address add 169.254.20.2/30 dev ipsec1安裝frr軟體。
yum install -y frr執行
vi /etc/frr/daemons命令,編輯設定檔,開啟BGP動態路由功能。按下
i鍵,進入編輯模式;修改bgpd參數的值為yes,開啟BGP動態路由功能;按下Esc鍵,退出編輯模式,然後輸入:wq儲存配置。運行frr功能。
systemctl enable frr systemctl restart frr添加BGP配置。
執行以下命令進入配置介面。
vtysh執行以下命令進入配置模式。
config terminal添加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
執行
exit命令退出配置模式,然後執行show ip bgp命令查看BGP路由條目。可以看到strongswan裝置已經成功學習到雲上VPC的路由,本地IDC與雲上VPC之間已經可以正常互連。

靜態路由
建立2個指令碼,供strongSwan調用並配置路由,從而控制流程量傳輸。
建立並編輯/root/connect_1.sh指令碼。
vi /root/connect_1.sh添加並儲存如下內容。
#!/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,則撤銷該路由。
建立並編輯/root/connect_2.sh指令碼。
vi /root/connect_2.sh添加並儲存如下內容。
#!/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,則撤銷該路由。
為2個指令碼賦予可執行許可權。
sudo chmod +x /root/connect_1.sh sudo chmod +x /root/connect_2.sh重啟strongSwan進程。
sudo systemctl restart strongswan執行以下命令查看路由是否配置成功。
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。
建立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裝置重啟後會自動重新添加虛擬網路介面。修改strongSwan設定檔。
備份原始strongSwan設定檔。
mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak建立strongSwan設定檔。
vi /etc/strongswan/swanctl/swanctl.conf根據情境樣本中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的預先共用金鑰保持一致。 } }
重啟strongSwan進程,重新載入strongSwan配置,查看隧道狀態。
sudo systemctl restart strongswan swanctl --load-all watch swanctl --list-sas如下圖所示,strongSwan裝置和VPN網關之間已經成功建立IPsec-VPN串連,但網路還無法正常互連,您還需要配置路由。

配置BGP動態路由。
說明strongSwan裝置重啟後,需要重新添加BGP配置。
執行以下命令配置BGP IP地址。
ip address add 169.254.10.2/30 dev ipsec0 ip address add 169.254.20.2/30 dev ipsec1安裝frr軟體。
yum install -y frr執行
vi /etc/frr/daemons命令,編輯設定檔,開啟BGP動態路由功能。按下
i鍵,進入編輯模式;修改bgpd參數的值為yes,開啟BGP動態路由功能;按下Esc鍵,退出編輯模式,然後輸入:wq儲存配置。運行frr功能。
systemctl enable frr systemctl restart frr添加BGP配置。
執行以下命令進入配置介面。
vtysh執行以下命令進入配置模式。
config terminal添加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
執行
exit命令退出配置模式,然後執行show ip bgp命令查看BGP路由條目。可以看到strongswan裝置已經成功學習到雲上VPC的路由,本地IDC與雲上VPC之間已經可以正常互連。

單出口-靜態路由
單出口-靜態路由方式下如果阿里雲側判斷主隧道有風險,會主動將流量切換至備隧道,有可能會導致流量不通。您可以觀察/proc/net/xfrm_stat檔案中XfrmInTmplMismatch參數的值來判斷阿里雲側是否已將流量切換至備隧道,如果該參數的值一直在變化,則證明阿里雲側已將流量切換至備隧道,您可以在/etc/strongswan/swanctl/swanctl.conf檔案中修改備隧道priority的值,使本地IDC上雲的流量優先通過備隧道傳輸。
備份原始strongSwan設定檔。
mv /etc/strongswan/swanctl/swanctl.conf /etc/strongswan/swanctl/swanctl.conf.bak建立strongSwan設定檔。
vi /etc/strongswan/swanctl/swanctl.conf根據情境樣本中的規劃,添加並儲存如下配置。
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的預先共用金鑰保持一致。 } }重啟strongSwan進程,重新載入strongSwan配置,查看隧道狀態。
sudo systemctl restart strongswan swanctl --load-all watch swanctl --list-sas如下圖所示,strongSwan裝置和VPN網關之間已經成功建立IPsec-VPN串連,本地IDC和VPC之間已經可以互相通訊。

5. 驗證連通性和高可用性
驗證本地IDC和VPC之間的連通性。
使用本地IDC中的一台用戶端
ping阿里雲VPC內的任意1台ECS,如果能ping通,則證明連通正常。ping <VPC內1台ECS的地址>驗證IPsec-VPN串連的高可用性。
保持ping通的情況下,中斷IPsec-VPN串連下的主隧道。
您可以通過修改IPsec串連主隧道的預先共用金鑰來中斷主隧道,主隧道兩端的預先共用金鑰不一致,則主隧道會中斷。
中斷主隧道後,您可以通過
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串連支援可用性區域層級的容災,有效提高了網路的高可用性。
