随着远程办公和远程维护等的需求增加,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文件。
# 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