Building IKEv1 and IKEv2 on CentOS 7

狂风中的少年 提交于 2020-04-10 16:52:12
本文目的是为服务器配置可供多种操作系统访问的 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 连接即可。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!