亚马逊AWS官方博客

使用 Strongswan 建立到阿里云 VPN 的访问链路

场景:

通过在 AWS 的 EC2上建立 Strongswan 服务,连接阿里云 VPN 服务,建立站点到站点的网络连接,以组成多云网络,可以从 AWS 访问阿里云的内网资源,比如 DB。

资源需求:

  1. AWS EC2一台,在公有子网,带有 EIP,用于配置 VPN 软件 Strongswan,连接阿里云VPN 服务,同时也会作为访问阿里云的 NAT。
  2. 阿里云 VPN 服务。

网络架构:

架构说明:

  1. 阿里云 VPC 网段:168.0.0/16
  2. AWS VPC 网段:31.0.0/16
  3. 在 AWS VPC 中公有子网一台 EC2作为 Strongswan 服务,分配 EIP:81.252.117作为 VPN端点 对外公开IP
  4. 阿里云 IP:98.88.223为 VPN分配的公网对外 IP

步骤:

  1. AWS 建立 VPC,划分子网,在公有子网中启动一台 EC2(CentOS,需要预先在 Marketplace 中订阅),分配 EIP,记录 EIP 地址(此例中为:81.252.117)。
  2. 禁用 EC2的源/目标检查。
  3. 编辑 EC2安全组,允许TCP:22,UDP:500,UDP:4500连接

  1. 登录阿里云VPN 网关管理控制台,创建 VPN 链路:
    • 创建 VPN
      • 在左侧导航栏中,单击VPN-》VPN 网关
      • 输入以下参数:
        1. 实例名称:输入VPN网关的实例名称。
        2. 地域和可用区:选择VPN网关的地域和可用区。
          说明 确保VPC的地域和VPN网关的地域相同。
        3. VPC:选择要连接的VPC。
        4. 带宽规格:选择一个带宽规格。带宽规格是VPN网关所具备的公网带宽。
        5. IPsec-VPN:选择开启IPsec-VPN功能。
        6. SSL-VPN:选择是否开启SSL-VPN功能。SSL-VPN功能允许您从任何位置的单台计算机连接到专有网络。
        7. SSL连接数: 选择您需要同时连接的客户端最大规格。
          说明 本选项只有在选择开启了SSL-VPN功能后才可配置。
        8. 计费周期:选择购买时长。
    • 创建用户网关
      • 在左侧导航栏,单击VPN > 用户网关。
      • 选择用户网关的地域。
      • 在用户网关页面,单击创建用户网关。
      •  在创建用户网关对话框,根据以下信息配置用户网关,然后单击确定。
        1. 名称:输入用户网关的名称。
        2. IP地址:输入VPC要连接的AWS 云中 EC2 Strongswan 的公网 EIP。本示例输入81.252.117。
        3. 描述:输入用户网关的描述信息。
    • 创建 IPSec 连接
      • 在左侧导航栏,单击VPN > IPsec连接。
      • 选择创建IPsec连接的地域。
      • 在IPsec连接页面,单击创建IPsec连接。
      •  在创建IPsec连接页面,根据以下信息配置IPsec连接,然后单击确定。
        1. 名称:输入IPsec连接的名称。
        2. VPN网关:选择已创建的VPN网关。
        3. 用户网关:选择要连接的用户网关。
        4. 本端网段:输入已选VPN网关所属VPC的网段。本示例输入168.0.0/16。
        5. 对端网段:输入本地数据中心的网段。本示例输入31.0.0/16。
        6. 立即生效:选择是否立即生效。
          • 是:配置完成后立即进行协商。
          • 否:当有流量进入时进行协商。
        7. 预共享密钥:输入共享密钥,该值必须与本地网关设备的预共享密钥一致。
          其他选项使用默认配置。
        8. 高级选项如下:

阿里云 IPSec 高级配置如图:

  1. 登录 AWS  EC2,安装 Strongswan 软件

    • 如果是 Amazon Linux2,以 root 执行:
    • amazon-linux-extras install epel -y
      yum install strongswan
    • 如果是CentOS,需首先订阅,以 root 执行:
    • yum install strongswan
    • 查看版本
    • strongswan version
  1. 配置Strongswan
    • 编辑/etc/strongswan/ipsec.conf,参考以下配置,注意:left=%any,因为 EC2有内外部地址,而且在 EC2内部并不知道 EIP 地址。连接模式需要使用 aggressive,否则可能会导致安全验证不匹配。ike 和 esp 需要跟阿里云 IPSec的高级配置中的验证加密算法一致。
    • # ipsec.conf – strongSwan IPsec configuration file# basic configurationconfig setup
      # strictcrlpolicy=yes
      uniqueids = no# Add connections here.conn %default
      authby=psk
      type=tunnel# Sample VPN connectionsconn aliyun
      keyexchange=ikev1
      left=%any
      leftsubnet=172.31.0.0/16
      leftid=52.81.252.117
      right=39.98.88.223
      rightsubnet=192.168.0.0/16
      rightid=39.98.88.223
      auto=start
      ike=aes-sha1-modp1024
      ikelifetime=86400s
      esp=aes-sha1-modp1024
      lifetime=86400s
      aggressive=yes
      type=tunnel
    • 编辑/etc/strongswan/ipsec.secrets,注意:地址为:{EC2-EIP} {ALi-VPN} : PSK “阿里云 IPsec高级选项中的预存共享密钥”
    • 81.252.117 39.98.88.223 : PSK “29z9411522bjipod”
    • 打开系统转发配置
    • echo 1 > /proc/sys/net/ipv4/ip_forward
    • 启动strongswan 服务
    • systemctl enable strongswan
      systemctl start strongswan
    • 检查服务状态,可以看到已经有 Security Associations 连接
    • [root@ip-172-31-6-57 strongswan]# strongswan statusall
      Status of IKE charon daemon (strongSwan 5.4.0, Linux 2.6.32-696.30.1.el6.x86_64, x86_64):
      uptime: 19 hours, since Nov 18 19:47:37 2020
      malloc: sbrk 536576, mmap 0, used 438752, free 97824
      worker threads: 11 of 16 idle, 5/0/0/0 working, job queue: 0/0/0/0, scheduled: 3
      loaded plugins: charon aes des rc2 sha2 sha1 md4 md5 random nonce x509 revocation constraints acert pubkey pkcs1 pkcs8 pkcs12 pgp dnskey sshkey pem openssl gcrypt fips-prf gmp xcbc cmac hmac ctr ccm gcm curl attr kernel-netlink resolve socket-default farp stroke vici updown eap-identity eap-md5 eap-gtc eap-mschapv2 eap-tls eap-ttls eap-peap xauth-generic xauth-eap xauth-pam xauth-noauth dhcp
      Listening IP addresses:
      31.6.57
      Connections:
      aliyun:  %any…39.98.88.223  IKEv1 Aggressive
      aliyun:   local:  [52.81.252.117] uses pre-shared key authentication
      aliyun:   remote: [39.98.88.223] uses pre-shared key authentication
      aliyun:   child:  172.31.0.0/16 === 192.168.0.0/16 TUNNEL
      Security Associations (1 up, 0 connecting):
      aliyun[1]: ESTABLISHED 19 hours ago, 172.31.6.57[52.81.252.117]…39.98.88.223[39.98.88.223]
      aliyun[1]: IKEv1 SPIs: b55d1a96e1b03e76_i* 24e26559f0d6bcf5_r, pre-shared key reauthentication in 4 hours
      aliyun[1]: IKE proposal: AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
      aliyun{1}:  REKEYED, TUNNEL, reqid 1, expires in 4 hours
      aliyun{1}:   172.31.0.0/16 === 192.168.0.0/16
      aliyun{2}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: c6057cf7_i 804136e6_o
      aliyun{2}:  AES_CBC_128/HMAC_SHA1_96/MODP_1024, 0 bytes_i, 0 bytes_o, rekeying in 23 hours
      aliyun{2}:   172.31.0.0/16 === 192.168.0.0/16
  2. 配置路由
    • 阿里云路由
      • 在左侧导航栏,单击VPN > VPN网关。
      • 选择VPN网关的地域。
      • 在VPN网关页面,找到目标VPN网关,单击实例ID/名称列下的实例ID。
      • 在目的路由表页签,单击添加路由条目。
      • 在添加路由条目对话框,根据以下信息配置目的路由,然后单击确定。
      • 目标网段:输入本地IDC侧的私网网段。本示例输入172.16.0.0/12。
      • 下一跳类型:选择IPsec连接。
      • 下一跳:选择IPsec连接实例。
      • 发布到VPC:选择是否将新添加的路由发布到VPC路由表。本示例选择是。
      • 权重:选择权重值。本示例选择100
    • AWS 路由
      • 添加到阿里云网段192.168.0.0/16的目标为那台 strongswan 的 EC2,如图:

 

  1. 配置AWS 安全组,加固安全
    • 限制连接源为阿里云 VPN 的外部 IP 地址。

错误排查:

    1. 阿里云 VPN 错误日志

    1. AWS strongswan 日志:/var/log/messages
    2. iptables 规则

 

本篇作者

信欣

AWS解决方案架构师,目前负责基于AWS云计算方案架构的咨询和设计。在加入AWS之前曾就职于IBM,有超过十年的 HPC 产品研发和架构设计经验。