简介
我们在上一篇文章《如何快速在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日志,对于诊断用户端连接问题非常有用。