亚马逊AWS官方博客
使用 Strongswan 建立到阿里云 VPN 的访问链路
场景:
通过在 AWS 的 EC2上建立 Strongswan 服务,连接阿里云 VPN 服务,建立站点到站点的网络连接,以组成多云网络,可以从 AWS 访问阿里云的内网资源,比如 DB。
资源需求:
- AWS EC2一台,在公有子网,带有 EIP,用于配置 VPN 软件 Strongswan,连接阿里云VPN 服务,同时也会作为访问阿里云的 NAT。
- 阿里云 VPN 服务。
网络架构:
架构说明:
- 阿里云 VPC 网段:168.0.0/16
- AWS VPC 网段:31.0.0/16
- 在 AWS VPC 中公有子网一台 EC2作为 Strongswan 服务,分配 EIP:81.252.117作为 VPN端点 对外公开IP
- 阿里云 IP:98.88.223为 VPN分配的公网对外 IP
步骤:
- AWS 建立 VPC,划分子网,在公有子网中启动一台 EC2(CentOS,需要预先在 Marketplace 中订阅),分配 EIP,记录 EIP 地址(此例中为:81.252.117)。
- 禁用 EC2的源/目标检查。
- 编辑 EC2安全组,允许TCP:22,UDP:500,UDP:4500连接
- 登录阿里云VPN 网关管理控制台,创建 VPN 链路:
- 创建 VPN
- 在左侧导航栏中,单击VPN-》VPN 网关
- 输入以下参数:
- 实例名称:输入VPN网关的实例名称。
- 地域和可用区:选择VPN网关的地域和可用区。
说明 确保VPC的地域和VPN网关的地域相同。 - VPC:选择要连接的VPC。
- 带宽规格:选择一个带宽规格。带宽规格是VPN网关所具备的公网带宽。
- IPsec-VPN:选择开启IPsec-VPN功能。
- SSL-VPN:选择是否开启SSL-VPN功能。SSL-VPN功能允许您从任何位置的单台计算机连接到专有网络。
- SSL连接数: 选择您需要同时连接的客户端最大规格。
说明 本选项只有在选择开启了SSL-VPN功能后才可配置。 - 计费周期:选择购买时长。
- 创建用户网关
- 在左侧导航栏,单击VPN > 用户网关。
- 选择用户网关的地域。
- 在用户网关页面,单击创建用户网关。
- 在创建用户网关对话框,根据以下信息配置用户网关,然后单击确定。
- 名称:输入用户网关的名称。
- IP地址:输入VPC要连接的AWS 云中 EC2 Strongswan 的公网 EIP。本示例输入81.252.117。
- 描述:输入用户网关的描述信息。
- 创建 VPN
-
- 创建 IPSec 连接
- 在左侧导航栏,单击VPN > IPsec连接。
- 选择创建IPsec连接的地域。
- 在IPsec连接页面,单击创建IPsec连接。
- 在创建IPsec连接页面,根据以下信息配置IPsec连接,然后单击确定。
- 名称:输入IPsec连接的名称。
- VPN网关:选择已创建的VPN网关。
- 用户网关:选择要连接的用户网关。
- 本端网段:输入已选VPN网关所属VPC的网段。本示例输入168.0.0/16。
- 对端网段:输入本地数据中心的网段。本示例输入31.0.0/16。
- 立即生效:选择是否立即生效。
- 是:配置完成后立即进行协商。
- 否:当有流量进入时进行协商。
- 预共享密钥:输入共享密钥,该值必须与本地网关设备的预共享密钥一致。
其他选项使用默认配置。 - 高级选项如下:
- 创建 IPSec 连接
阿里云 IPSec 高级配置如图:
- 登录 AWS EC2,安装 Strongswan 软件
-
- 如果是 Amazon Linux2,以 root 执行:
- amazon-linux-extras install epel -y
yum install strongswan - 如果是CentOS,需首先订阅,以 root 执行:
- yum install strongswan
- 查看版本
- strongswan version
- 配置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
- 配置路由
- 阿里云路由
- 在左侧导航栏,单击VPN > VPN网关。
- 选择VPN网关的地域。
- 在VPN网关页面,找到目标VPN网关,单击实例ID/名称列下的实例ID。
- 在目的路由表页签,单击添加路由条目。
- 在添加路由条目对话框,根据以下信息配置目的路由,然后单击确定。
- 目标网段:输入本地IDC侧的私网网段。本示例输入172.16.0.0/12。
- 下一跳类型:选择IPsec连接。
- 下一跳:选择IPsec连接实例。
- 发布到VPC:选择是否将新添加的路由发布到VPC路由表。本示例选择是。
- 权重:选择权重值。本示例选择100
- 阿里云路由
- 配置AWS 安全组,加固安全
- 限制连接源为阿里云 VPN 的外部 IP 地址。
错误排查:
-
- 阿里云 VPN 错误日志
-
- AWS strongswan 日志:/var/log/messages
- iptables 规则