简介
我们在上一篇文章《如何快速在CentOS7上部署VPN服务器》介绍了在CentOS 7上部署IKEv2服务器的方法。这种最常见的部署方式还是有几个缺点,
- 所有配置都是基于各个模块的对应配置文件,分散在不同的目录下,让备份和复制变得很麻烦;
- 很多基础的网络功能模块都需要单独安装;
- 手动配置出错导致系统崩溃的几率比较大。
这里我们介绍在EdgeOS/VyOS下,如何部署IKEv2 Roadwarrior VPN的方案。EdgeOS/VyOS集成了非常丰富的网络功能,配置可以脚本化,非常便于部署。然而,EdgeOS/VyOS内置的命令行并不直接支持IKEv2 Roadwarrior VPN,我们需要增加一些自己制作的配置文件。这些配置文件都统一保存在/config/ipsec.d目录下,在系统升级的时候不会丢失,也便于备份。
大家需要注意的是,低端的EdgeRouter路由器,会因为内存和处理性能的限制,无法同时支持较多的IPSec连接。基于x86的VyOS平台则完全没有这个限制。
预先准备
实现本文介绍的功能,你需要一台EdgeRouter或者安装好VyOS的软路由。
在参考本文开始配置以前,我们假定大家已经按照介绍VyOS一文完成了VyOS的初始化配置。使用EdgeOS的用户,可以使用系统自带的wizard完成初始配置。
你还需要有一个公网地址,以便客户端可以用来连接。我们并不需要静态地址,动态地址也可以,只要设置好相应的动态域名即可。具体方法请参考EdgeRouter配置DDNS动态域名一文。
签发证书
服务器密钥
我们先使用专门的RSA密钥工具生成服务器用证书密钥。如果你已经根据如何在EdgeRouter上配置站点到站点IPSec VPN隧道配置过基于RSA的隧道,可以跳过这一小节。我们把生成的RFC3110格式的公钥保存到/config/ipsec.d/rsa-keys/下,后续配置站点到站点的IPSec还会用到。
generate vpn rsa-key > localhost.pub
sudo mv ./localhost.pub /config/ipsec.d/rsa-keys/
然后,我们进入root模式,并创建工作目录。
sudo -i
mkdir -p /config/ipsec.d/{cacerts,certs,private}
再把现有的localhost.key复制到密钥目录。
sudo cp /config/ipsec.d/rsa-keys/localhost.key /config/ipsec.d/private/server-key.pem
EdgeOS
接下来,我们调用PKI命令创建一个自签发的CA证书。下面参考命令中,”CN=Creekside EdgeOS CA”是证书颁发机构名称,你可以根据自己的情况修改。
pki --gen --type rsa --outform pem > /config/ipsec.d/private/ca-key.pem
pki --self --ca --type rsa --lifetime 3650 \
--in /config/ipsec.d/private/ca-key.pem \
--dn "CN=Creekside EdgeOS CA" \
--outform pem > /config/ipsec.d/cacerts/ca-cert.pem
随后,我们使用刚才签发的CA证书,再为本机签发VPN服务器证书和密钥。请注意替换相应的服务器域名信息(范例中的”vpn.creekside.network”)。
pki --pub --in /config/ipsec.d/private/server-key.pem | \
pki --issue --cacert /config/ipsec.d/cacerts/ca-cert.pem \
--cakey /config/ipsec.d/private/ca-key.pem \
--dn "CN=vpn.creekside.network" \
--san="vpn.creekside.network" \
--flag serverAuth --flag clientAuth --flag ikeIntermediate \
--outform pem --digest sha256 > /config/ipsec.d/certs/server-cert.pem
VyOS
VyOS没有PKI这么好用的工具。好在系统内置了openssl,我们同样可以生成PKI用的证书文件。
我们调用openssl命令创建一个自签发的CA证书。下面参考命令中,在subj选项里,C=国家,O=组织,CN=证书颁发机构名称,这三项你可以根据自己的情况修改。
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
-keyout /config/ipsec.d/private/ca-key.pem \
-out /config/ipsec.d/cacerts/ca-cert.pem \
-addext "keyUsage=Certificate Sign, CRL Sign" \
-subj "/C=US/O=CreekSide Networks/CN=Creekside VyOS CA"
随后,我们使用服务器密钥生成服务器证书申请文件。
openssl req -new -nodes \
-key /config/ipsec.d/private/server-key.pem \
-out /config/ipsec.d/certs/server.csr \
-subj /CN="vpn.creekside.network"
在签发证书前,还要创建一个用于签发的extension文件,以便包括关键的SAN以及其他参数。 [alt_names]下,可以设置多个域名,分别以DNS.1, DNS.2 …列出。
echo "authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth,clientAuth
subjectAltName = @alt_names
[alt_names]
DNS.1 = vpn.creekside.network" > /config/ipsec.d/vpn-server.ext
最后,我们使用刚才生成的CA证书,签发VPN服务器证书。
openssl x509 -req -days 3650 -CAcreateserial \
-in /config/ipsec.d/certs/server.csr \
-CA /config/ipsec.d/cacerts/ca-cert.pem \
-CAkey /config/ipsec.d/private/ca-key.pem \
-out /config/ipsec.d/certs/server-cert.pem \
-extfile /config/ipsec.d/vpn-server.ext
配置IPSec连接参数
连接配置
使用下面命令创建/config/ipsec.d/ipsec.conf定制化配置文件。
echo "
# customized roadwarrior configuration by Creekside Networks LLC
config setup
uniqueids=never
ca rootca
cacert=/config/ipsec.d/cacerts/ca-cert.pem
conn winlx
ike=aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024!
esp=aes256-sha1,aes128-sha1,3des-sha1!
keyexchange=ikev2
compress=no
type=tunnel
fragmentation=yes
forceencaps=yes
dpddelay=300s
dpdtimeout=30s
dpdaction=clear
forceencaps=yes
ikelifetime=4h
lifetime=2h
eap_identity=%identity
auto=add
rekey=no
left=%any
leftcert=/config/ipsec.d/certs/server-cert.pem
leftsendcert=always
leftsubnet=0.0.0.0/0
right=%any
rightid=%any
rightauth=eap-mschapv2
rightsourceip=10.255.255.1/24
rightdns=8.8.8.8,8.8.4.4
rightsendcert=never
conn apple
also=winlx
[email protected]
" > /config/ipsec.d/ipsec.conf
- 考虑到EdgeRouter硬件加速的限制,我们只配置了有限的PN加密认证算法;如果是基于x86的VyOS平台,可以在去除IKE/ESP算法后面的”!”号,系统会自动加载所有算法;
- 苹果产品系列,remote id(等同于上述的leftid)是必填。因此我们这里将VPN服务器的域名作为remote id。你也可以用任何字符串,只要客户端设置时与此匹配就好。
密钥及用户账户
我们使用以下命令创建用户认证文件: /config/ipsec.d/ipsec.secrets。
echo "
# roadwarrior user accounts
: RSA /config/ipsec.d/private/server-key.pem
bob : EAP bobpasswd
alice : EAP alicepasswd
" > /config/ipsec.d/ipsec.secrets
exit
如果你可以参考最后两行行用户账户的格式 (用户名 :EAP 密码),添加更多的用户。用户名可以是任意字符串,你也可以使用邮箱作为用户名。在用户名和密码之间,使用” :EAP “来分割。
最后,别忘了使用exit命令退出root模式。
设置防火墙
WAN口规则
接下来,我们进入配置状态,配置相应的防火墙策略
configure
set firewall name WAN_LOCAL rule 200 action 'accept'
set firewall name WAN_LOCAL rule 200 description 'ipsec ike'
set firewall name WAN_LOCAL rule 200 destination port '500,4500'
set firewall name WAN_LOCAL rule 200 log 'disable'
set firewall name WAN_LOCAL rule 200 protocol 'udp'
set firewall name WAN_LOCAL rule 201 action 'accept'
set firewall name WAN_LOCAL rule 201 description 'ipsec esp'
set firewall name WAN_LOCAL rule 201 log 'disable'
set firewall name WAN_LOCAL rule 201 protocol 'esp'
set firewall name WAN_LOCAL rule 210 action 'accept'
set firewall name WAN_LOCAL rule 210 description 'ipsec traffic'
set firewall name WAN_LOCAL rule 210 log 'disable'
set firewall name WAN_LOCAL rule 210 protocol 'all'
set firewall name WAN_LOCAL rule 210 ipsec match-ipsec
set firewall name WAN_IN rule 210 action 'accept'
set firewall name WAN_IN rule 210 description 'ipsec traffic'
set firewall name WAN_IN rule 210 log 'disable'
set firewall name WAN_IN rule 210 protocol 'all'
set firewall name WAN_IN rule 210 ipsec match-ipsec
commit;save;exit
由于从IPSec隧道出来的数据包被视作来自WAN口,因此,需要在WAN口的IN和LOCAL两个规则集上都配置相应的规则允许数据包接入。
TCP MSS
由于esp的带来的额外负担(overhead)大约在90字节左右,考虑到PPPoE下局域网IP包最大长度被限制在1500-8=1492字节,因此TCP MSS值最大为1500-8-90-40=1362字节。考虑到可能会有GRE over IPSec,保守一点,我们可以设置为1300字节。
VyOS
configure
set firewall options interface eth0 adjust-mss 1300
commit;save;exit
EdgeOS
configure
set firewall options mss-clamp interface-type all
set firewall options mss-clamp 1300
commit;save;exit
配置NAT-exclude
因为是定制化VPN,所以需要专门配置NAT-exclude,把发送给VPN客户端的流量排除在正常WAN的NAT之外,否则,NAT过的流量,无法进入IPSec隧道返回。由于NAT规则是顺序执行的,这条配置需要排在WAN口masquerade规则的前面。
EdgeOS
configure
edit service nat rule 5010
set description "exclude roadwarrior ipsec"
set destination address 10.255.255.0/24
set exclude
set log disable
set outbound-interface eth0
set protocol all
set type masquerade
commit;save;exit
VyOS
configure
edit nat source rule 10
set description "exclude roadwarrior ipsec"
set destination address 10.255.255.0/24
set exclude
set log disable
set outbound-interface eth0
set protocol all
set translation address masquerade
commit;save;exit
启用VPN配置
最后我们把刚才定制过的VPN文件添加到配置里。
configure
set vpn ipsec include-ipsec-conf /config/ipsec.d/ipsec.conf
set vpn ipsec include-ipsec-secrets /config/ipsec.d/ipsec.secrets
commit;save;exit
配置客户端
我们需要把自签发的证书(/config/ipsec.d/cacerts/ca-cert.pem)拷贝出来,安装在客户端上。具体配置步骤,请参考如何设置IPSec VPN客户端一文。需要注意的是,Windows不能识别后缀为pem的证书文件,请下载后重命名为ca-cert.cer。
验证
以下命令可以用于验证和调试:
- openssl x509 -text -in <证书文件>,用于查看证书内容
- sudo ipsec statusall,查看ipsec状态
- sudo ipsec listcerts,显示服务器证书信息
- sudo ipsec restart, 重启Strongswan,当你改变了上述定制文件,需要用这个命令
- sudo swanctl –log,显示strongswan日志,对于诊断用户端连接问题非常有用。