IKEv2 on Windows Server 2012R2

本文简单介绍了 Windows Server 平台上 IKEv2 VPN 的搭建,与 Windows/Linux 设备的访问。

在 Windows Server 上建立 PPTP VPN 服务

首先,通过远程桌面连接访问作为 VPN 服务器的 Windows Server,打开「服务器管理器」,点击「管理」菜单中的「添加与删除角色」,在「服务器角色」中,勾选「远程访问」。


继续向导,出现远程访问角色配置时,勾选「DirectAccess 和 VPN」。

DirectAccess-and-VPN-RAS

如果有其余选项,保持默认即可。随后就可以开始添加角色了。

完成之后,通知会提示 DirectAccess 和 VPN 需要配置,这里我们选择「仅 VPN」。

Deploy-VPN

随后打开「路由和远程访问」。该管理控制台可以在开始菜单的「管理工具」,或是「服务器管理器」中找到。

右击左侧的服务器名,点击「配置路由和远程访问」,在弹出的向导中,选择「自定义配置」,并勾选「远程访问(拨号或 VPN)」。

Custom-VPN-Configuration
VPN-Access

完成向导,如果有其他选项保持默认。这样我们就搭建好了一个最简单的 VPN 服务器。下面需要配置用户账户,以允许远程访问。

打开「计算机管理」,展开左侧「系统工具」中的「本地用户和组」,点击「用户」,右击右侧你想允许远程登录的用户账户,单击「属性」,在「拨入」选项卡中的网络访问权限里,选择「允许访问」。

如果需要为 VPN 连接分配静态地址池,你需要在「路由和远程访问」里打开服务器属性,在「IPv4」选项卡中,配置「IPv4 地址分配」。

通过以上步骤,你已经建立起一个简单可用的 VPN 服务器,你可以使用其他设备,配置一个 PPTP 协议的 VPN 连接,来测试是否可用。

使用 IKEv2 来代替 PPTP 作为 VPN 协议

与 PPTP/L2TP 相比,IKEv2 具有很多优点,详细的描述可以看这里:浅谈网络安全和 IKEV2 协议

IKEv2 需要一组证书来完成服务端与客户端之间的认证和加密。此外,按照连接方式,IKEv2 可能还需要连接发起方提供其他认证凭据。

由于窝死活摆不平微软爸爸的证书颁发角色,我选择了使用 strongSwan 提供的 ipsec pki 指令来生成证书。当然,使用 openssl 也是没有问题的。首先是生成一张 CA 证书,并签名。其中 C、O、CN 仅供参考:

ipsec pki --gen --outform pem > ca.pem
ipsec pki --self --in ca.pem --dn "C=CN, O=myvpn, CN=VPN CA" --ca --outform pem >ca.cert.pem

继续准备一份服务器证书。其中 CN 是 VPN 服务器的 IP 或域名,错误的 CN 将会导致连接被终止。该证书将被安装至 VPN 服务器:

ipsec pki --gen --outform pem > server.pem
ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=com, O=myvpn, CN=123.123.123.123" --san="123.123.123.123" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem

如法炮制一份客户端证书,它将被安装到 VPN 客户端,即连接的发起方:

ipsec pki --gen --outform pem > client.pem
ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=com, O=myvpn, CN=VPN Client" --outform pem > client.cert.pem

将服务端证书与客户端证书转化为 p12 格式,就可以安装到 Windows 设备上了。以客户端证书为例:

openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" -certfile ca.cert.pem -caname "VPN CA"  -out client.cert.p12

这样我们就将得到一份加密信息拓展文件。安装证书步骤如下:

  开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
  「文件」-「添加/删除管理单元」,添加「证书」单元
  证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
  在左边的「控制台根节点」下选择「证书」-「个人」,然后选右边的「更多操作」-「所有任务」-「导入」打开证书导入窗口。
  选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码。下一步「证书存储」选「个人」。
  导入成功后,把导入的 CA 证书剪切到「受信任的根证书颁发机构」的证书文件夹里面。
  打开剩下的那个私人证书,看一下有没有显示「您有一个与该证书对应的私钥」,以及「证书路径」下面是不是显示「该证书没有问题」。
  然后关闭 mmc,提示「将控制台设置存入控制台1吗」,选「否」即可。

完成证书的导入后,就可以使用 IKEv2 作为 VPN 协议进行远程访问了。

在 Linux 下远程登录到 VPN 服务器

Linux 环境下的拨入有两个实现的思路:使用 PPTP 协议或者使用 IKEv2 协议。

使用 PPTP 应该是不难的,很多 Linux 发行版的网络设置内就可以创建 PPTP 协议的连接,即使没有也可以用 pptpsetup 或是手写 peers 文件,然后用 pon 指令连接。然而因为 PPTP 本身的缺陷,有时候会遇到各种各样的问题导致无法使用,这时就可以转而使用 IKEv2。

可以说 Linux 最强大的 IPsec 实现就是 strongSwan 了,我们就将使用这个软件来进行 IKEv2 的拨入。首先你需要下载并解压 strongSwan 的源码:

wget https://download.strongswan.org/strongswan-5.4.0.tar.gz
tar xzvf strongswan-5.4.0.tar.gz && cd strongswan-5.4.0

配置软件并编译:

./configure --prefix=/usr \
    --sbindir=/usr/bin \
    --sysconfdir=/etc \
    --libexecdir=/usr/lib \
    --with-ipsecdir=/usr/lib/strongswan \
    --enable-md4 \
    --enable-sqlite \
    --enable-openssl --enable-curl \
    --enable-sql --enable-attr-sql \
    --enable-farp --enable-dhcp \
    --enable-eap-sim --enable-eap-sim-file --enable-eap-simaka-pseudonym \
    --enable-eap-simaka-reauth --enable-eap-identity --enable-eap-md5 \
    --enable-eap-gtc --enable-eap-aka --enable-eap-aka-3gpp2 \
    --enable-eap-mschapv2 --enable-eap-radius --enable-xauth-eap \
    --enable-ha --enable-vici --enable-swanctl --enable-systemd --enable-ext-auth \
    --disable-mysql --disable-ldap -enable-cmd --enable-forecast --enable-connmark \
    --enable-aesni --enable-eap-ttls --enable-radattr --enable-xauth-pam --enable-xauth-noauth \
    --enable-eap-dynamic --enable-eap-peap --enable-eap-tls --enable-chapoly --enable-unity \
    --with-capabilities=libcap
make -j4 && sudo make install

一个比较坑的地方是,虽然 Arch Linux 的 AUR Script 内启用了 EAP-MSCHAPV2,但是这个认证依赖于 md4,而这个特性并没有被启用,所以导致了无法使用 MSCHAPv2 进行身份验证。

完成安装后,就需要将可爱的证书们和客户端私钥配置好具体步骤:

    1. 将根证书复制到 /etc/ipsec.d/cacerts/ 目录下
    2. 将 CA 颁发的客户端证书复制到 /etc/ipsec.d/certs/
    3. 将 CA 颁发的客户端证书的私钥复制到 /etc/ipsec.d/private/

修改 /etc/ipsec.conf,添加一个 connection,我的配置是添加了一个叫 pv 的连接,你需要修改后面的 eap_identity, right 和 rightid 为自己的选项,rightsubnet 填写分配的静态地址网段:

# ipsec.conf - strongSwan IPsec configuration file

conn %default
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    keyexchange=ikev2
    ike=aes256-sha1-modp1024!
    
conn pv
    left=%any
    leftfirewall=yes
    leftauth=eap-mschapv2
    leftsourceip=%config
    eap_identity=Administrator
    right=zh.ali.dimension.moe
    rightauth=pubkey
    rightid="C=CN, O=NTZYZ, CN=zh.ali.dimension.moe"
    rightsubnet=172.16.8.0/24
    auto=add

编辑 /etc/ipsec.secrets,内容为 EAP 身份验证时使用的凭据和私钥文件名:

# either of these two lines depending on leftauth above
: RSA 
 %any : EAP ""

这样我们就完成了基本的配置。连接到 VPN 只需要很简单的输入以下指令:

ipsec start
ipsec up pv

如果没有异常,命令执行完后的输出大致如图:

ipsec-up-pv

其他的一些维护

虽然 IKEv2 具有很多优点,但是还是有时会遭不住国内这样糟糕的互联网环境而被断开(但是比那个 PPTP 不知道高到哪里去了)

最简单的解决方案就是使用任务计划,Linux 下可以使用 crontab,Windows 则可以使用计算机管理提供的任务计划。对于 Linux,我们可以配置以下命令每两小时执行一次:

ipsec up pv

对于 Windows,我们可以准备这样的命令:

rasdial "VPN Connection"

参考链接:

1. HOW TO INSTALL VPN ON WINDOWS SERVER 2012 R2 | Thomas Maurer
2. UBUNTU、CENTOS搭建IPSEC/IKEV2 VPN服务器全攻略
3. 使用 Strongswan 架设 Ipsec VPN
4. strongSwan – Arch Wiki
5. AUR (en) – strongswan – Arch Linux