本文目的是为服务器配置可供多种操作系统访问的 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 leftid=@dev.panic.ml 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 连接即可。
来源:oschina
链接:https://my.oschina.net/u/3585265/blog/3047294