文档

strongSwan配置示例

更新时间:

使用IPsec-VPN实现本地数据中心IDC(Internet Data Center)和阿里云VPC之间的网络互通时,在阿里云侧完成VPN网关的配置后,您还需在本地数据中心的网关设备中添加VPN配置才能成功在本地数据中心和阿里云VPC之间建立IPsec-VPN连接。本文介绍如何使用strongSwan在本地网关设备中添加VPN配置。

场景示例

image

本文以上图场景为例。某公司在阿里云拥有一个专有网络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连接。如果您的场景需要建立单隧道模式的IPsec-VPN连接,请参见文末的单隧道配置示例

网段规划及VPN配置示例

网段规划

资源

网段

IP地址

本地数据中心

待和VPC互通的网段:192.168.0.0/16

服务器IP地址:192.168.10.198

strongSwan设备

不涉及

  • strongSwan设备连接公网的物理接口:eth0,eth0接口需配置一个公网IP地址,本文示例值为8.XX.XX.99。

  • strongSwan软件版本:5.9.10。

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网关实例(公网网络类型)

不涉及

  • IPsec地址1:8.XX.XX.149

  • IPsec地址2:8.XX.XX.137

说明

创建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连接时,两条隧道关联同一个用户网关即可。

开始配置

说明

下文以运行Alibaba Cloud Linux 3.2104 LTS 64位操作系统的strongSwan设备为例,如果您的strongSwan设备运行的是其他类型的操作系统,请参见strongSwan Installation Documentation

  1. 登录strongSwan设备的命令行界面。

  2. 执行以下命令安装strongSwan软件。

    sudo yum install -y strongswan-5.9.10
  3. 为strongSwan设备开启流量转发功能。

    echo 1 > /proc/sys/net/ipv4/ip_forward
    重要

    上述命令需要root权限,且为临时性命令,strongSwan设备重启后需重新配置该命令。您可以参见以下内容永久开启strongSwan设备的流量转发功能。

    单击查看永久配置。

    1. 执行以下命令打开/etc/sysctl.conf文件。

      sudo vi /etc/sysctl.conf
    2. 按下i键,进入编辑模式。

    3. 在文件中添加如下配置。

      net.ipv4.ip_forward = 1
    4. 按下Esc键,退出编辑模式,然后输入:wq保存配置。

    5. 使配置生效。

      sudo sysctl -p
  4. 创建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虚拟网络接口。
    重要

    创建虚拟网络接口的配置为临时性配置,strongSwan设备重启后,需要重新添加该配置,并执行sudo systemctl restart strongswan;swanctl --load-all命令(该命令需要root权限)。您可以参见以下内容为strongSwan设备添加开机自动启动脚本,strongSwan设备重启后会自动重新添加虚拟网络接口。

    单击查看开机自动启动脚本

    1. 执行以下命令创建一个脚本。

      vi xfrm.sh
    2. 按下i键,进入编辑模式。

    3. 将以下配置添加进脚本中。

      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虚拟网络接口。
    4. 按下Esc键,退出编辑模式,然后输入:wq保存配置。

    5. 执行以下命令查看脚本绝对路径。

      sudo find / -name xfrm.sh
    6. 将脚本绝对路径添加进/etc/rc.d/rc.local文件。

      sudo vi /etc/rc.d/rc.local # 打开/etc/rc.d/rc.local文件。
      按下i键,进入编辑模式
      /root/xfrm.sh  #将脚本绝对路径添加进/etc/rc.d/rc.local文件。
      按下Esc键,退出编辑模式,然后输入:wq保存配置
    7. 为rc.local文件和xfrm.sh脚本添加可执行权限。

      sudo chmod +x /etc/rc.d/rc.local
      sudo chmod +x /root/xfrm.sh
  5. 修改strongSwan配置文件。

    1. 执行以下命令打开strongSwan配置文件。

      sudo vi /etc/strongswan/swanctl/swanctl.conf
    2. 按下i键,进入编辑模式。

    3. 根据以下信息在配置文件中添加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     # 指定隧道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 = 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的预共享密钥保持一致。
         }
      }
    4. 按下Esc键,退出编辑模式,然后输入:wq保存配置。

  6. 根据以下信息创建脚本以配置路由,控制从本地数据中心去往阿里云VPC(10.0.0.0/16)的流量传输。

    1. 执行以下命令编辑/root/connect_1.sh脚本。

      sudo vi /root/connect_1.sh
    2. 按下i键,进入编辑模式。

    3. 在脚本中添加如下配置。

      如果隧道1的状态是UP,则添加路由使本地数据中心去往阿里云VPC(10.0.0.0/16)的流量通过隧道1 XFRM虚拟网络接口传输,同时指定该路由的metric值为100,使该路由的优先级高于指向隧道2 XFRM虚拟网络接口的路由。如果隧道1的状态是DOWM,则撤销该路由。

      #!/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
    4. 按下Esc键,退出编辑模式,然后输入:wq保存配置。

    5. 按照上述步骤编辑/root/connect_2.sh脚本,脚本的配置如下。

      如果隧道2的状态是UP,则添加路由使本地数据中心去往阿里云VPC(10.0.0.0/16)的流量通过隧道2 XFRM虚拟网络接口传输,同时指定该路由的metric值为101,使该路由的优先级低于指向隧道1 XFRM虚拟网络接口的路由。如果隧道2的状态是DOWM,则撤销该路由。

      #!/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
    6. 为/root/connect_1.sh和/root/connect_2.sh脚本赋予可执行权限。

      sudo chmod +x /root/connect_1.sh
      sudo chmod +x /root/connect_2.sh
    7. 重新启动strongSwan进程。

      sudo systemctl restart strongswan
  7. 查看隧道状态和路由。

    完成上述配置后,strongSwan设备和VPN网关之间通常已经建立了IPsec-VPN连接,您可以通过以下命令查看IPsec-VPN连接隧道状态以及路由。

    sudo swanctl --list-sas  # 查看隧道状态
    route -n            # 查看路由配置

    IPsec路由

  8. 在本地数据中心侧,设置本地数据中心客户端到strongSwan设备及strongSwan设备到本地数据中心客户端的路由。

    后续您可以开始测试本地数据中心和阿里云VPC之间的网络连通性。具体操作,请参见验证测试

单隧道配置示例

单击查看单隧道配置示例。

场景示例

image

本文以上图场景为例。某公司在阿里云拥有一个VPC,VPC网段为192.168.10.0/24,VPC中使用ECS部署了应用服务。同时该公司在本地拥有一个数据中心,本地数据中心中要与VPC互通的网段为172.16.2.0/24。公司计划在本地数据中心与云上VPC之间建立IPsec-VPN连接,实现资源互访。

网段规划及VPN配置示例

网段规划

资源

示例值

VPC

待和本地数据中心互通的私网网段

192.168.10.0/24

VPN网关(公网网络类型)

VPN网关公网IP地址

119.XX.XX.125

本地数据中心

待和VPC互通的私网网段

172.16.2.0/24

strongSwan设备的公网IP地址

59.XX.XX.70

strongSwan软件版本

5.7.2

VPN配置示例

配置项

阿里云侧示例值

FortiGate防火墙侧示例值

预共享密钥

ff123TT****

ff123TT****

IKE配置

IKE版本

ikev1

ikev1

协商模式

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连接的操作。具体操作,请参见建立VPC到本地数据中心的连接(单隧道模式)

  • 创建IPsec连接时,路由模式需选择感兴趣流模式本端网段设置为192.168.10.0/24,对端网段设置为172.16.2.0/24。

  • 创建IPsec连接后,您需要发布策略路由。具体操作,请参见发布策略路由

说明

如果您本地数据中心的网络中,strongSwan设备通过统一的公网出口访问互联网,strongSwan设备本身并不具有公网IP地址,您可以使用strongSwan设备的私网IP地址来建立IPsec-VPN连接。

步骤一:安装strongSwan软件

说明

下文以运行Alibaba Cloud Linux 2.1903 LTS 64位操作系统的strongSwan设备为例,如果您的strongSwan设备运行的是其他类型的操作系统,请参见strongSwan Installation Documentation

  1. 登录strongSwan设备的命令行界面。

  2. 执行以下命令安装strongSwan软件。

    sudo yum install strongswan
  3. 可选:执行以下命令查看系统自动安装的strongSwan软件版本。

    strongswan version

    2024-07-11_10-19-48

步骤二:配置strongSwan

  1. 执行以下命令打开ipsec.conf配置文件。

    sudo vi /etc/strongswan/ipsec.conf
  2. 请参见以下配置,更改ipsec.conf配置文件。

    # ipsec.conf - strongSwan IPsec configuration file
    # basic configuration
    config setup
           uniqueids=never
    conn %default
         authby=psk                  #使用预共享密钥认证方式
         type=tunnel
    conn tomyidc
         keyexchange=ikev1           #IPsec连接使用的IKE协议的版本
         left=59.XX.XX.70            #strongSwan设备的公网IP地址。如果您使用strongSwan设备的私网IP地址建立IPsec-VPN连接,则本项需配置为strongSwan设备的私网IP地址。
         leftsubnet=172.16.2.0/24    #本地数据中心待和VPC互通的私网网段
         leftid=59.XX.XX.70          #strongSwan设备的标识,需和阿里云侧的RemoteId保持一致。默认为strongSwan设备使用的公网地址。
         right=119.XX.XX.125         #VPN网关的公网IP地址。
         rightsubnet=192.168.10.0/24 #VPC待和本地IDC互通的私网网段
         rightid=119.XX.XX.125       #VPN网关的标识,需和阿里云侧的LocalId保持一致。默认为VPN网关实例的公网地址。
         auto=route                  #在左右两端子网的任意主机向对方发起访问请求时才会创建IPsec连接。您可以通过“auto参数说明”了解更多信息。
              
         ike=aes-sha1-modp1024       #IPsec连接中IKE协议的加密算法-认证算法-DH分组
         ikelifetime=86400s          #IKE协议的SA生命周期
         esp=aes-sha1-modp1024       #IPsec连接中IPsec协议的加密算法-认证算法-DH分组
         lifetime=86400s             #IPsec协议的SA生命周期
         type=tunnel
         #aggressive = yes           #选择是否开启野蛮模式,当前野蛮模式为关闭状态,系统使用默认模式,即为主模式(main)

    单击查看auto参数说明。

    auto参数取值

    说明

    auto=add

    strongSwan进程启动时,仅读取连接配置参数,不主动发起连接。适用于服务器端等待客户端主动发起连接请求的情况。

    auto=route

    在左右两端子网的任意主机向对方发起访问请求时才会创建IPsec连接。

    auto=start

    strongSwan进程读取连接配置并立即建立IPsec连接。

    auto=ignore

    该条配置将被忽略。

  3. 配置ipsec.secrets文件。

    1. 执行以下命令打开ipsec.secrets文件。

      sudo vi /etc/strongswan/ipsec.secrets
    2. 添加以下配置。

      说明

      以下两种配置方式,任选一种即可。

      • 方式一:

        59.XX.XX.70 119.XX.XX.125 : PSK ff123TT****   #ff123TT****为IPsec连接的预共享密钥,本地IDC侧和VPN网关侧的预共享密钥需保持一致。
      • 方式二:

        119.XX.XX.125 : PSK ff123TT****   #ff123TT****为IPsec连接的预共享密钥,本地IDC侧和VPN网关侧的预共享密钥需保持一致。
  4. 执行以下命令启动strongSwan服务。

    sudo systemctl enable strongswan
    sudo systemctl start strongswan
    #您可以通过以下命令查看strongSwan服务是否正常启动
    sudo systemctl status strongswan
  5. 打开系统转发配置。

    echo 1 > /proc/sys/net/ipv4/ip_forward
    重要

    上述命令需要root权限,且为临时性命令,strongSwan设备重启后需重新配置该命令。您可以参见以下内容永久开启strongSwan设备的流量转发功能。

    单击查看永久配置。

    1. 执行以下命令打开/etc/sysctl.conf文件。

      sudo vi /etc/sysctl.conf
    2. 按下i键,进入编辑模式。

    3. 在文件中添加如下配置。

      net.ipv4.ip_forward = 1
    4. 按下Esc键,退出编辑模式,然后输入:wq保存配置。

    5. 使配置生效。

      sudo sysctl -p
  6. 在本地数据中心侧,设置本地数据中心客户端到strongSwan设备及strongSwan设备到本地数据中心客户端的路由。

    后续您可以开始测试本地数据中心和阿里云VPC之间的网络连通性。具体操作,请参见测试连通性

  7. 如果您使用strongSwan建立了3条(不包含3条)以上的IPsec连接,您需要修改/etc/strongswan/strongswan.d/charon.conf中的配置。

    删除max_ikev1_exchanges = 3 命令前的注释符号,启用此命令,并修改命令中参数的值大于您建立的IPsec连接数。

    例如:您使用strongSwan建立了4条IPsec连接,您可以修改该命令为max_ikev1_exchanges = 5