在EdgeOS/VyOS上启用IKEv2 拨号VPN

简介

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