随着远程办公和远程维护等的需求增加,VPN的使用也已经常态化。在这里介绍使用Strongswan创建本地和AWS之间的Site to Site VPN方法。创建后的环境如下图。

在AWS上创建的资源名称如下表。而本地是在Ubuntu上安装Strongswan创建和AWS之间的VPN连接。提供IPSec的软件有Strongswan,Openswan,Libreswan等,在这里选择了目前最有人气的Strongswan版本5.9.5。

资源 名称 备注
VPC VPC-Default
VGW VGW-Site-to-Site-VPN
CGW CGW-MyHome 在AWS上,设定VPN的本地(MyHome)相关的信息
VPN Connection connection-AWS-to-MyHome 关联CGW,VGW及设定Tunnel相关信息

创建VPC

创建Amazon VPC的方法,参照 [AWS入门]从零开始创建Amazon VPC

创建CGW(CustomerGateway)

点击左侧栏的”Customer gateways”后,点击”Create customer gateway”。

输入如下内容之后,点击”Create customer gateway”。

名称 指定值 备注
Name tag CGW-MyHome
BGP ANS 65000 使用默认的BGP ASN,和AWS的ASN 64512不冲突就可以
IP address 221.201.3.129 指定运行Strongswan服务器的IP地址
Device Strongswan 可选项。为了以后知道在本地运行的是Strongswan

创建VGW(Virtual Private Gateway)

依次点击 “VPC” -> “Virtual private gateways”之后,点击”Create virtual private gateway”。

输入VGW名称”VGW-Site-to-Site-VPN”后,点击”Create virtual private gateway”。

VGW关联到VPC

勾选创建的VGW之后,依次点击”Actions” -> “Attach to VPC”。

选择VPC-Default之后,点击”Attach to VPC”。

将VGW关联到VPC之后的结果如下。

创建VPN连接

点击左侧栏的”Site-to-Site VPN connections”后,点击”Create VPN connection”。

输入如下内容之后,点击”Create VPN connection”。

名称 指定值 备注
Name tag connection-AWS-to-MyHome
Target gateway type Virtual private gateway
Virtual private gateway 选择VGW-Site-to-Site-VPN
Customer gateway Existing
Customer gateway ID 选择CGW-MyHome
Routing option Static
Static IP prefixes 192.168.64.0/24,172.31.0.0/16 传播到VPC路由表的CIDR
Local IPv4 network CIDR 192.168.64.0/24 本地的CDIR
Remote IPv4 network CIDR 172.31.0.0/16 Amazon VPC的CIDR

在这里没有指定pre-shared key,使用AWS创建的pre-shared key。

激活路由传播

选择左侧栏的”Route tables”后,勾选路由表并点击”Actions” -> “Edit route propagation”。

勾选”Enable”之后点击”Save”。

下载配置文件

选择创建的connection之后,点击”Download configuration”。

选择Strongswan下载配置文件,IKE version推荐选择ikev2。

安装及配置Strongswan

如果没有安装libreswan的话,使用yum命令进行安装。

# apt install strongswan

接下来是根据下载的配置文件进行设定。

激活IP packet forwarding

在 /etc/sysctl.conf 文件,追加 net.ipv4.ip_forward = 1。

# vi /etc/sysctl.conf
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

执行 sysctl -p 命令启用该设定。

# sysctl -p
net.ipv4.ip_forward = 1

修改/etc/ipsec.conf文件

根据下载的配置文件修改后的 /etc/ipsec.conf 文件如下。

# vi /etc/ipsec.conf

# ipsec.conf - strongSwan IPsec configuration file

# basic configuration

config setup
    charondebug="all"
    uniqueids=yes
    strictcrlpolicy=no

conn Tunnel1
    type=tunnel
    auto=start
    keyexchange=ikev2
    authby=psk
    leftid=221.201.3.129
    leftsubnet= 192.168.3.0/24
    right=54.65.170.122
    rightsubnet= 172.31.0.0/16
    aggressive=no
    ikelifetime=28800s
    lifetime=3600s
    margintime=270s
    rekey=yes
    rekeyfuzz=100%
    fragmentation=yes
    replay_window=1024
    dpddelay=30s
    dpdtimeout=120s
    dpdaction=restart
    ike=aes256gcm16-sha512-modp4096
    esp=aes256gcm16-sha512-modp8192
    keyingtries=%forever

在这里ike和esp的DH组(aes256gcm16-sha512-modp4096)的格式如下,详细信息查看IKEv2 Cipher Suites

  • aes256gcm16: Authenticated Encryption (AEAD) Algorithms
  • sha512: Integrity Algorithms
  • modp4096: Diffie Hellman Groups

创建pre-shared key文件

根据下载的配置文件的内容,设定pre-shared key文件。

# vi /etc/ipsec.secrets
221.201.3.129 54.65.170.122 : PSK "LOHigH5K1RHugl9kC_j5t.x3wz6LBeXX"

启动Strongswan

使用systemctl命令启动 strongswan-starter服务。

# systemctl start strongswan-starter

VPN状态

ipsec status 命令确认IPSec的状态,可以确认到SA(Security Assocations)处于up。

# ipsec status
Security Associations (1 up, 0 connecting):
     Tunnel1[1]: ESTABLISHED 48 minutes ago, 192.168.3.36[221.201.3.129]...54.65.170.122[54.65.170.122]
     Tunnel1{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cddee7e1_i cdfca7e3_o
     Tunnel1{1}:   192.168.3.0/24 === 172.31.0.0/16

在AWS管理控制页面也可以确认到,1个Tunnel处于Up状态。

从MyHome的服务器(Strongswan)ping确认,是否能到达AWS EC2服务器。

# ping -c4 172.31.18.31
PING 172.31.18.31 (172.31.18.31) 56(84) bytes of data.
64 bytes from 172.31.18.31: icmp_seq=1 ttl=254 time=72.0 ms
64 bytes from 172.31.18.31: icmp_seq=2 ttl=254 time=71.5 ms
64 bytes from 172.31.18.31: icmp_seq=3 ttl=254 time=70.4 ms
64 bytes from 172.31.18.31: icmp_seq=4 ttl=254 time=70.7 ms

小结

IPSec的组件及需要设定的参数比较多,也比较难以理解。如下面SPD和SAD是Strongswan在Phase1及Phase2生成的内容。相对来说AWS等云厂商提供了配置文件的下载,减少了我们的负担。

SPD(Security Policy Database)

使用 ip xfrm policy 命令可确认SPD的内容。

# ip xfrm policy
src 192.168.3.0/24 dst 172.31.0.0/16 
    dir out priority 379519 
    tmpl src 192.168.3.36 dst 54.65.170.122
        proto esp spi 0xc3318266 reqid 1 mode tunnel
src 172.31.0.0/16 dst 192.168.3.0/24 
    dir fwd priority 379519 
    tmpl src 54.65.170.122 dst 192.168.3.36
        proto esp reqid 1 mode tunnel
src 172.31.0.0/16 dst 192.168.3.0/24 
    dir in priority 379519 
    tmpl src 54.65.170.122 dst 192.168.3.36
        proto esp reqid 1 mode tunnel
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket in priority 0 
src 0.0.0.0/0 dst 0.0.0.0/0 
    socket out priority 0 
src ::/0 dst ::/0 
    socket in priority 0 
src ::/0 dst ::/0 
    socket out priority 0 
src ::/0 dst ::/0 
    socket in priority 0 
src ::/0 dst ::/0 
    socket out priority 0 

SAD(Security Association Database)

使用 ip xfrm state 命令可确认SAD的内容。

# ip xfrm state
src 192.168.3.36 dst 54.65.170.122
    proto esp spi 0xc3318266 reqid 1 mode tunnel
    replay-window 0 flag nopmtudisc af-unspec
    aead rfc4106(gcm(aes)) 0x1831db82d7a14c80f09d42163a36e3f5f14c41e72892c30532232159e10dadbe29eddc4b 128
    encap type espinudp sport 4500 dport 4500 addr 0.0.0.0
    lastused 2023-12-23 09:05:48
    anti-replay context: seq 0x0, oseq 0x20, bitmap 0x00000000
src 54.65.170.122 dst 192.168.3.36
    proto esp spi 0xc2006a09 reqid 1 mode tunnel
    replay-window 0 flag nopmtudisc af-unspec
    aead rfc4106(gcm(aes)) 0x74318c56e309b2f165a8872514fe84960911ddccdbfcd6240edfb8f822947b154a9a3bf9 128
    encap type espinudp sport 4500 dport 4500 addr 0.0.0.0
    lastused 2023-12-23 09:05:48
    anti-replay esn context:
     seq-hi 0x0, seq 0x40, oseq-hi 0x0, oseq 0x0
     replay_window 1024, bitmap-length 32
     00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
     00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
     00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
     00000000 00000000 00000000 00000000 00000000 00000000 ffffffff ffffffff