使用IPsec-VPN实现本地数据中心IDC(Internet Data Center)和阿里云VPC之间的网络互通时,在阿里云侧完成VPN网关的配置后,您还需在本地数据中心的网关设备中添加VPN配置才能成功在本地数据中心和阿里云VPC之间建立IPsec-VPN连接。本文介绍如何使用strongSwan在本地网关设备中添加VPN配置。
场景示例
本文以上图场景为例。某公司在阿里云拥有一个专有网络VPC(Virtual Private Cloud),VPC网段为10.0.0.0/16,VPC中使用云服务器ECS(Elastic Compute Service)部署了应用服务。同时该公司在本地拥有一个数据中心,本地数据中心中要与VPC互通的网段为192.168.0.0/16。公司计划在本地数据中心与云上VPC之间建立IPsec-VPN连接,实现资源互访。
本文场景中,将要部署strongSwan的本地网关设备简称为strongSwan设备。本地数据中心使用一台strongSwan设备的一个公网IP地址与阿里云建立双隧道模式的IPsec-VPN连接。如果您购买的VPN网关实例仅支持建立单隧道模式的IPsec-VPN连接,请参见文末的单隧道配置示例。
推荐您升级IPsec-VPN连接为双隧道模式,双隧道模式的IPsec-VPN连接支持可用区级别的容灾,有效提高了网络的高可用性。
网段规划及VPN配置示例
网段规划
资源 | 网段 | IP地址 |
本地数据中心 | 待和VPC互通的网段:192.168.0.0/16 | 服务器IP地址:192.168.10.198 |
strongSwan设备 | 不涉及 |
|
VPC | 主网段:10.0.0.0/16 交换机1:10.0.10.0/24 交换机2:10.0.20.0/24 | ECS IP地址:10.0.10.250 |
VPN网关实例(公网网络类型) | 不涉及 |
说明 创建VPN网关实例后,系统会自动为VPN网关实例分配地址。 |
VPN配置示例
本文场景中隧道1(主隧道)和隧道2(备隧道)使用相同的示例值。
每条隧道下,阿里云侧和strongSwan设备侧VPN配置需保持相同。
配置项 | 阿里云侧示例值 | strongSwan设备侧示例值 | |
预共享密钥 | 123456**** | 123456**** | |
IKE配置 | IKE版本 | ikev2 | ikev2 |
协商模式 | main | main | |
加密算法 | aes | aes | |
认证算法 | sha1 | sha1 | |
DH分组 | group2 | group2 | |
SA生存周期(秒) | 86400 | 86400 | |
IPsec配置 | 加密算法 | aes | aes |
认证算法 | sha1 | sha1 | |
DH分组 | group2 | group2 | |
SA生存周期(秒) | 86400 | 86400 |
前提条件
本文仅描述如何在strongSwan设备中添加VPN配置,不再描述阿里云VPN网关侧的配置。因此在您开始配置前,请确保您已经完成创建VPN网关实例、创建用户网关、创建IPsec连接、配置VPN网关路由的任务。具体操作,请参见建立VPC到本地数据中心的连接(双隧道模式)。
本文场景中,本地数据中心使用strongSwan设备的一个公网IP地址与阿里云建立双隧道模式的IPsec-VPN连接,因此仅需创建一个用户网关,创建IPsec连接时,两条隧道关联同一个用户网关即可。
开始配置
下文以运行CentOS Stream 9 64位操作系统的strongSwan设备为例,如果您的strongSwan设备运行的是其他类型的操作系统,请参见strongSwan Installation Documentation。
登录strongSwan设备的命令行界面。
执行以下命令安装strongSwan软件。
sudo yum install -y strongswan-5.9.10
为strongSwan设备开启流量转发功能。
echo 1 > /proc/sys/net/ipv4/ip_forward
重要上述命令需要root权限,且为临时性命令,strongSwan设备重启后需重新配置该命令。您可以参见以下内容永久开启strongSwan设备的流量转发功能。
创建2个虚拟网络接口,用于建立IPsec-VPN隧道。
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虚拟网络接口。
重要使用XFRM虚拟网络接口需要安装strongSwan 5.8.0或以上版本,同时要求Linux内核版本为4.19及以上、iproute2版本为5.1.0及以上。更多信息,请参见XFRM Interfaces on Linux。
创建虚拟网络接口的配置为临时性配置,strongSwan设备重启后,需要重新添加该配置,并执行
sudo systemctl restart strongswan;swanctl --load-all
命令(该命令需要root权限)。您可以参见以下内容为strongSwan设备添加开机自动启动脚本,strongSwan设备重启后会自动重新添加虚拟网络接口。
修改strongSwan配置文件。
执行以下命令打开strongSwan配置文件。
sudo vi /etc/strongswan/swanctl/swanctl.conf
按下
i
键,进入编辑模式。根据以下信息在配置文件中添加VPN配置,文件中原有的配置需全部删除。
重要您需要将配置中的IP地址替换为您实际使用的IP地址,并确保阿里云侧和strongSwan设备侧VPN配置相同。
connections { vco1 { # 添加IPsec-VPN隧道1的VPN配置 version = 2 # 指定IKE版本,需与阿里云隧道1的IKE版本保持一致,2表示IKEv2。 local_addrs = 8.XX.XX.99 # 指定需要建立IPsec-VPN连接的公网IP地址。 remote_addrs = 8.XX.XX.149 # 指定隧道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 = 8.XX.XX.99 # 指定本端ID,需与阿里云隧道1的RemoteId保持一致。 } remote { auth = psk # 对端认证方式选择PSK方式,即阿里云使用预共享密钥方式。 id = 8.XX.XX.149 # 指定对端ID,需与阿里云隧道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 = 8.XX.XX.99 # 指定需要建立IPsec-VPN连接的公网IP地址。 remote_addrs = 8.XX.XX.137 # 指定隧道 址,即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 = 8.XX.XX.99 # 指定本端ID,需与阿里云隧道2的RemoteId保持一致。 } remote { auth = psk # 对端认证方式选择PSK方式,即阿里云使用预共享密钥方式。 id = 8.XX.XX.137 # 指定对端ID,需与阿里云隧道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 { secret = 123456**** # 指定隧道1的预共享密钥,需与阿里云隧道1的预共享密钥保持一致。 } ike-vco2 { secret = 123456**** # 指定隧道2的预共享密钥,需与阿里云隧道2的预共享密钥保持一致。 } }
按下
Esc
键,退出编辑模式,然后输入:wq
保存配置。
根据以下信息创建脚本以配置路由,控制从本地数据中心去往阿里云VPC(10.0.0.0/16)的流量传输。
执行以下命令编辑/root/connect_1.sh脚本。
sudo vi /root/connect_1.sh
按下
i
键,进入编辑模式。在脚本中添加如下配置。
如果隧道1的状态是UP,则添加路由使本地数据中心去往阿里云VPC(10.0.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 10.0.0.0/16 dev ipsec0" >> /root/vpn_route.log;ip route add 10.0.0.0/16 dev ipsec0 metric 100 elif [ x"$PLUTO_VERB" == "xdown-client" ]; then echo "ip route del 10.0.0.0/16 dev ipsec0" >> /root/vpn_route.log;ip route del 10.0.0.0/16 dev ipsec0 metric 100 fi
按下
Esc
键,退出编辑模式,然后输入:wq
保存配置。按照上述步骤编辑/root/connect_2.sh脚本,脚本的配置如下。
如果隧道2的状态是UP,则添加路由使本地数据中心去往阿里云VPC(10.0.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 10.0.0.0/16 dev ipsec1" >> /root/vpn_route.log;ip route add 10.0.0.0/16 dev ipsec1 metric 101 elif [ x"$PLUTO_VERB" == "xdown-client" ]; then echo "ip route del 10.0.0.0/16 dev ipsec1" >> /root/vpn_route.log;ip route del 10.0.0.0/16 dev ipsec1 metric 101 fi
为/root/connect_1.sh和/root/connect_2.sh脚本赋予可执行权限。
sudo chmod +x /root/connect_1.sh sudo chmod +x /root/connect_2.sh
重新启动strongSwan进程。
sudo systemctl restart strongswan
如果strongSwan设备配置了访问控制策略或防火墙策略,请确保strongSwan设备的UDP协议500和4500端口允许阿里云隧道IP地址通过。例如您可以通过以下命令使防火墙放行UDP 500和4500端口。
#开启指定端口 sudo firewall-cmd --zone=public --add-port=500/udp --permanent sudo firewall-cmd --zone=public --add-port=4500/udp --permanent sudo systemctl restart firewalld.service sudo firewall-cmd --reload #查看已开启的端口 sudo firewall-cmd --list-ports
查看隧道状态和路由。
完成上述配置后,strongSwan设备和VPN网关之间通常已经建立了IPsec-VPN连接,您可以通过以下命令查看IPsec-VPN连接隧道状态以及路由。
sudo swanctl --list-sas # 查看隧道状态 route -n # 查看路由配置
在本地数据中心侧,设置本地数据中心客户端到strongSwan设备及strongSwan设备到本地数据中心客户端的路由。
后续您可以开始测试本地数据中心和阿里云VPC之间的网络连通性。具体操作,请参见验证测试。
单隧道配置示例
常见问题
使用strongSwan建立IPsec-VPN连接时是否支持BGP动态路由?
不支持。
使用strongSwan建立IPsec-VPN连接时是否支持IKEv1版本?
支持。
配置/etc/strongswan/swanctl/swanctl.conf文件时,指定version = 1
即可。
使用strongSwan建立IPsec-VPN连接时如何指定感兴趣流?
配置/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地址支持与VPN网关建立IPsec-VPN连接么?
支持。
strongSwan设备本身可以不具备公网IP地址,但strongSwan设备需能访问互联网。例如,在strongSwan设备通过本地数据中心统一的公网出口访问互联网的场景中,您可以使用strongSwan设备的私网IP地址来建立IPsec-VPN连接。配置/etc/strongswan/swanctl/swanctl.conf文件时,需要按照以下内容进行配置。
connections {
vco1 {
local_addrs = 192.168.1.1 # 指定为strongSwan设备的私网IP地址。
local {
id = 8.XX.XX.99 # 指定为strongSwan设备使用的公网IP地址。
}
}
}
}