Building IKEv1 and IKEv2 on CentOS 7
本文目的是为服务器配置可供多种操作系统访问的 IKEv1/IKEv2 接入,需要支持 Radius 认证;按照本文配置,没有进行流量统计的功能,如果有相关需求,请自行配置 Radius 和 StrongSwan 的 eap-radius 组件。
本文实现的 Radius 认证方式有:
EAP-MSCHAPv2(用户名+密码)、EAP-TLS(证书)、EAP-TTLS(证书)、PEAP(用户名+密码)
已知的问题
PEAP本可以支持两种认证方式:PEAP-EAP-MSCHAPv2(用户名+密码)与PEAP-EAP-TLS(证书)
但 FreeRadius 在PEAP中仅支持PEAP-EAP-MSCHAPv2与PEAP-EAP-TLS必须二选一而不能同时启用。
FreeRadius 推荐且默认为PEAP-EAP-MSCHAPv2,鉴于用户使用PEAP-EAP-MSCHAPv2是主流,且后者替代品丰富,所以放弃对PEAP-EAP-TLS的支持。但出于测试的目的,笔者尝试配置PEAP-EAP-TLS却未能成功。
系统环境
公有云上的 CentOS 7 x86_64(非 OpenVZ),双核,2 GB 内存,SELinux 不开启
配置StrongSwan
说明:不使用 yum 直接安装的原因是在库中的二进制 StrongSwan 的参数配置导致无法通过 OS X 与 iOS 连接
配置环境 & 编译
编译安装默认的配置文件路径为 /usr/local/etc,通过 yum 安装的默认为 /etc/strongswan
yum -y install pam-devel openssl-devel make gcc curl wget
wget --no-check-certificate https://download.strongswan.org/strongswan-5.3.5.tar.gz
tar zxvf strongswan-5.3.5.tar.gz
cd strongswan-5.3.5
./configure --enable-eap-identity --enable-eap-md5 \
--enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap \
--enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap \
--enable-xauth-pam --enable-dhcp --enable-openssl --enable-addrblock --enable-unity \
--enable-certexpire --enable-radattr --enable-swanctl --enable-openssl --disable-gmp
make && make install
配置证书
需要生成的证书包括根证书(CA)、服务器证书(Server)和客户端证书(Client),客户端证书可用于通过证书认证。
生成根证书
ipsec pki --gen --outform pem > ca.key.pem
ipsec pki --self --in ca.key.pem --dn "C=CN, O=VisionSrv, CN=VisionSrv CA" --ca --lifetime 3650 --outform pem > ca.cert.pem
生成服务器证书
ipsec pki --gen --outform pem > server.key.pem
ipsec pki --pub --in server.key.pem --outform pem > server.pub.pem
ipsec pki --issue --lifetime 1200 --cacert ca.cert.pem --cakey ca.key.pem --in server.pub.pem --dn "C=CN, O=VisionSrv, CN=dev.panic.ml" --san="dev.panic.ml" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
生成客户端证书
ipsec pki --gen --outform pem > client.key.pem
ipsec pki --pub --in client.key.pem --outform pem > client.pub.pem
ipsec pki --issue --lifetime 1200 --cacert ca.cert.pem --cakey ca.key.pem --in client.pub.pem --dn "C=CN, O=VisionSrv, CN=dev.panic.ml" --outform pem > client.cert.pem
生成 p12 证书可以设置密码,请注意:OS X 无法导入密码为空的 p12 证书
openssl pkcs12 -export -inkey client.key.pem -in client.cert.pem -name "VisionSrv Client Cert" -certfile ca.cert.pem -caname "VisionSrv CA" -out client.cert.p12
复制证书
说明:
(1)如果你希望用户通过用户名 + 密码连接 IKEv2,请将 ca.cert.pem 发送给客户并要求客户安装证书
(2)如果你希望用户直接通过证书登陆,请将 client.cert.p12 发送给客户并要求客户安装证书
(3)如果是 iOS,用户还需要安装 ca.cert.pem
(4)如果是 OS X,用户需要设置 CA 根证书为可信
cp -r ca.key.pem /usr/local/etc/ipsec.d/private/
cp -r ca.cert.pem /usr/local/etc/ipsec.d/cacerts/
cp -r server.cert.pem /usr/local/etc/ipsec.d/certs/
cp -r server.key.pem /usr/local/etc/ipsec.d/private/
cp -r client.cert.pem /usr/local/etc/ipsec.d/certs/
cp -r client.key.pem /usr/local/etc/ipsec.d/private/
配置 ipsec.conf
通过编译安装,ipsec.conf 路径为 /usr/local/etc/ipsec.conf,通过 yum 安装路径为 /etc/strongswan/ipsec.conf
config setup
uniqueids=never
conn cisco_cert
keyexchange=ikev1
fragmentation=yes
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=pubkey
rightauth2=xauth-radius
rightsourceip=10.31.2.0/24
auto=add
conn cisco_xauth_psk
keyexchange=ikev1
left=%defaultroute
leftauth=psk
leftsubnet=0.0.0.0/0
right=%any
rightauth=psk
rightauth2=xauth-radius
rightsourceip=10.31.2.0/24
auto=add
conn standard_ikev2
keyexchange=ikev2
ike=aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
esp=aes256-sha256,3des-sha1,aes256-sha1!
rekey=no
left=%defaultroute
[email protected]
leftsendcert=always
leftfirewall=yes
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=eap-radius
rightsourceip=10.31.2.0/24
eap_identity=%any
dpdaction=clear
fragmentation=yes
auto=add
配置 strongswan.conf
通过编译安装,ipsec.conf 路径为 /usr/local/etc/strongswan.conf,通过 yum 安装路径为 /etc/strongswan/strongswan.conf
charon {
load_modular = yes
duplicheck.enable = no #是为了你能同时连接多个设备,所以要把冗余检查关闭
compress = yes
plugins {
include strongswan.d/charon/*.conf
eap-radius {
servers {
server-a {
address = YourRadiusServer
secret = YourRadiusSecret
# nas_identifier = ipsec-gateway
}
}
}
}
dns1 = 114.114.114.114
dns2 = 8.8.8.8
# for Windows WINS Server
nbns1 = 114.114.114.114
nbns2 = 8.8.8.8
}
include strongswan.d/*.conf
配置 ipsec.secrets
通过编译安装,ipsec.conf 路径为 /usr/local/etc/ipsec.secrets,通过 yum 安装路径为 /etc/strongswan/ipsec.secrets
: RSA server.key.pem
: PSK "visionsrv"
: XAUTH "visionsrv"
test : EAP "123456"
我们在这里增加了一个测试账号,但在 Radius 认证中并不生效,如果需要使用此认证用于测试或不需要使用 Radius 进行认证,请将 ipsec.conf 中的 rightauth(或 rightauth2) 值改为 eap-mschapv2(eap-radius) 或 xauth(xauth-radius)
注意: 在停用 Radius 认证后,使用本文配置将无法通过客户端证书直接连接 VPN 服务器。如有需要,请自行研究配置方式。 下面是一些直接使用证书认证的参考资料: StrongSwan Android、Windows 身份验证(使用计算机证书)-> IKEv2 Certificate -> rightauth=pubkey StrongSwan Android、OS X、iOS -> EAP-TLS -> rightauth=eap-tls Linux 通过 NetworkManager-strongswan 支持上述所有方式
配置防火墙
本文使用的是 CentOS 7 默认的防火墙 firewalld,如需要 iptables 请查看官方文档或参阅 Google
firewall-cmd --add-port=500/tcp --permanent
firewall-cmd --add-port=500/udp --permanent
firewall-cmd --add-port=4500/tcp --permanent
firewall-cmd --add-port=4500/udp --permanent
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload
启动服务
systemctl start strongswan
systemctl enable strongswan
配置 Radius
安装并配置 FreeRadius
yum install -y freeradius*
echo 'test ClearText-Password := "123456"' >> /etc/raddb/users
配置 Radius 客户端,0.0.0.0 替换为 VPN 服务器地址,123456 替换为您想设置的 Radius 连接密钥
cat >> /etc/raddb/clients.conf < <-EOF
client 0.0.0.0 {
secret = 123456
shortname = 0.0.0.0
nas_type = other
}
EOF
请将 CA 根证书ca.cert.pem放置在/etc/raddb/certs/ca.pem(本项如果不需要通过客户端证书连接可以不配置)
请将服务器证书server.cert.pem放置在/etc/raddb/certs/server.pem
服务器私钥server.key.pem放置在/etc/raddb/certs/server.key
完成后,请执行命令cat /etc/raddb/certs/server.key >> /etc/raddb/certs/server.pem
2016-5-8 更新: 新版 OS X 对用户名+密码
不再要求强制校验服务器身份,所以不使用证书登陆可以不配置 RADIUS 证书。
注意
不配置 Radius 服务器证书时 Windows PEAP 连接将弹出提示(提示信息为“信息不足,无法验证服务器”),OS X 将拒绝连接。
需要说明的是,这并不是一般的 Radius 服务器证书配置方法,但出于简单、实用且易于描述的考虑我们这样做以免您产生混淆。
正常的做法是通过通用的 CA 根证书、 CA 私钥、 CSR 文件以及 FreeRadius 内置的私钥为 Radius 服务器生成一个证书。
这样生成的服务器证书可以被 VPN 客户端的 PEAP 判断为合法的服务器并进行连接。
OS X 使用 PEAP-EAP-MSCHAPv2(用户名)和 EAP-TLS(证书)并强制要求校验服务器合法性。
Windows 可以选择使用 PEAP-EAP-MSCHAPv2(用户名)和 EAP-TLS(证书),但配置更自由,更具灵活性。
在本文所述的方法中,因 server.pem 中的私钥是未加密的,所以 eap 配置文件中的私钥密码是不产生作用的。
配置防火墙
Radius 认证端口
firewall-cmd --add-port=1812/udp --permanent
Radius 计费端口(本文不会使用)
firewall-cmd --add-port=1813/udp --permanent
firewall-cmd --reload
客户端配置
说明:
(1)如果你希望用户通过用户名 + 密码连接 IKEv2,请将 ca.cert.pem 发送给客户并要求客户安装证书
(2)如果你希望用户直接通过证书登陆,请将 client.cert.p12 发送给客户并要求客户安装证书
(3)如果是 iOS,用户还需要安装 ca.cert.pem
(4)如果是 OS X,用户需要设置 CA 根证书为可信
OS X
OS X 采用了严格的安全校验措施,IKEv2 连接采用 PEAP(用户名+密码)/EAP-TLS(证书) 模式并必须验证服务器身份,
对服务器校验分两步:(1)校验该服务器证书是否是合法 CA 签发的,(2)校验被连接服务器的被连接域名是否是证书允许的
OS X 要求这两部分必须均校验且通过,Windows 可以选择是否校验以及校验至哪一步。
这意味着为了保证 OS X 正常使用 IKEv2,您必须为 Radius 服务器配置证书。
iOS 与 OS X 的要求相似,本文以 OS X 为例进行说明。
IKEv1
配置位置:系统偏好设置 -> 网络 -> 新建 -> VPN -> Cisco IPsec
服务器地址:在这里输入您的服务器地址
账户名称:在这里输入用户名
密码:在这里输入密码
在鉴定设置 -> 共享的密钥中输入在 ipsec.secrets 中设置的 PSK 预共享密码
IKEv2
配置位置:系统偏好设置 -> 网络 -> 新建 -> VPN -> IKEv2
服务器地址:在这里输入您的服务器地址
远程地址:在这里输入您的服务器地址
在鉴定设置 -> 用户名中输入在 ipsec.secrets 中设置的用户名和密码(通过用户名密码登陆)
在鉴定设置 -> 证书中选择安装的客户端证书(通过客户端证书登陆)
Android
由于 Andorid 的版本众多,配置方法可能不同但大同小异。
IKEv1
说明:您也可以使用 IPSec Xauth RSA 进行连接,但需要安装证书,连接时选择客户端证书,CA 和服务器证书留空
配置位置:设置 -> 其它连接方式 -> VPN -> 添加 VPN
名称:在这里填写任意名称
类型:IPSec Xauth PSK
IPsec 标识符:不更改此项内容
预共享密钥:在这里输入在 ipsec.secrets 中设置的 PSK 预共享密码
此后,在连接时输入您的用户名和密码。
IKEv2
您需要安装 StrongSwan Andorid 版本,具体配置方法详见不同版本的配置方法。
由于该 APP 为官方出品,支持认证方法众多,配置简单,推荐使用。
Windows
说明:鉴于 Windows 支持认证方式较为广泛,本文仅示例最简单的通过 EAP(MSCHAPv2) 与通过本地证书(EAP-TLS)进行认证
Windows 7 以下版本不支持 IKEv2 连接,所有版本均不支持 IKEv1 连接,如有需要请下载第三方组件。
本文配置对于 Windows 7 以上版本的 IKEv2 连接,支持通过 EAP-MSCHAPv2、EAP-TLS、PEAP(部分支持)、EAP-TTLS 认证
本文采用 Windows 10 作为操作示例,其它受支持的 Windows 版本配置与本文类似,请自行研究。
如前文所述,本文对于 PEAP 仅支持 PEAP-EAP-MSCHAPv2(用户名+密码),不支持 PEAP-EAP-TLS(证书)。
有消息称,不同连接方式之间的性能可能存在差异,但笔者并未进行详细的性能测试。
注意:笔者测试 StrongSwan 官方的 Windows 7 配置,但 Windows 7 仍不可连接。 错误提示为 IKE 身份验证凭证不可接受,该问题通常是由于 CA 根证书未安装导致,但 CA 根实际上已经安装。 因此,错误原因不明,该问题仅在 Windows 7 (Windows Server 2008)上被发现,其他未见影响。
IKEv2
配置位置:网络与共享中心 -> 设置新的连接或网络 -> 连接到工作区 -> 使用我的 Internet 连接
Internet 地址:在这里填写服务器地址
确认后,在网络与共享中心 -> 更改适配器设置 -> 选择刚刚添加的 VPN -> 右键选择属性 -> “安全”中“VPN 类型”选择 IKEv2
在这里,我们展示两种方式:
方法一:通过 EAP-TLS 使用证书连接
(1)安装客户端证书 client.cert.p12,设置为可信
(2)在“安全”中选择“Microsoft: 智能卡或其他证书(启用加密)”,在“属性”中选择“在此计算机上使用证书”
(3)完成上述步骤后,可以勾选“通过验证证书来验证服务器身份”,在文本框中输入 VPN 服务器地址
(4)勾选“连接到这些服务器”,在证书列表中选择 CA 根证书(一般在最后一个)后确定
(5)尝试连接到 VPN 服务器即可
说明:用户可以关闭“通过验证证书来验证服务器身份”,但这将降低用户安全性。
方法二:通过 EAP-MSCHAPv2 使用用户名与密码连接
(1)安装 CA 根证书,设置为可信
(2)在“安全”中选择“Microsoft: 安全密码(EAP-MSCHAP v2)(启用加密)
(3)尝试输入账号密码进行 VPN 连接即可。