2022年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
[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 连接即可。

一、软件说明

    IPsec是虚拟私密网络(*)的一种,用于在服务器和客户端之间建立加密隧道并传输敏感数据之用。它由两个阶段组成,第一阶段(Phrase 1, ph1),交换密钥建立连接,使用互联网密钥交换(ike)协议; 第二阶段(Phrase 2, ph2),连接建立后对数据进行加密传输,使用封装安全载荷(esp)协议。

    其中,第一阶段和第二阶段可以使用不同的加密方法(cipher suites)。甚至,第一阶段ike协议的第一版(ikev1)有两种模式,主力模式(main mode)和积极模式(aggressive mode),主力模式进行六次加密握手,而积极模式并不加密,以实现快速建立连接的目的。

    第一阶段的 ike 协议有两个版本(ikev1/ikev2),不同的开源/闭源软件实现的版本均不同,不同的设备实现的版本也不同。再联系到第一阶段/第二阶段使用的各种不同加密方法,使得 IPsec 的配置有点黑魔法的性质,要么完全懂,通吃; 要么完全不懂,照抄。

二、设备操作系统规格

这里主要介绍了设备/操作系统使用的 ike 版本及其特殊要求。

Linux

    命令行客户端就是 strongswan 本身,因此完美兼容,支持 ikev1/ikev2 和所有加密方法的连接。因此如果用户只使用 Linux 命令行客户端,不使用各种移动设备也不使用 Windows,那么完全没有那么多事。

    但 Linux 的图形界面客户端 NetworkManager-strongswan 目前只支持 ikev2 连接,必须使用证书或 EAP (各种加密方法都支持,包括微软的 MSCHAPv2)进行认证,不支持纯密码(PSK)认证。这并不是 strongswan 的错误,或者技术不行(开源总是走在技术最前沿的,毕竟命令行是支持的),而仅仅是体现一种选择:ikev1 被 strongswan 项目认为是该淘汰的协议,而 PSK 加密被认为是非常不安全的。参考 strongswan 维基 NetworkManager 词条。

Android

    Android 和 Linux 不一样,只支持 ikev1。其它方面和 Linux 一样,甚至有好多种 IPsec * 配置模式可供选择。

IOS/Mac OS X

    它们声明使用的 IPsec 客户端为 Cisco,实际为自己修改的 racoon。它只支持 ike 协议的第一版即 ikev1,可以使用证书或纯密码(PSK)认证,但必须辅之 xauth 用户名/密码认证。

该修改版的 racoon 会优先使用不加密的积极模式,而积极模式是 strongSwan 所不支持的。所以要使用主力模式。

    IOS 6 还有一个「衔尾」故障:它在第一阶段握手时会把数据包拆分成小块(fragmentation),然后「加密」发送。然而这种加密仅仅是声明的,其实并未加密,这就导致 strongSwan 及其它标准服务器端/Cisco 设备无法解密。另外 ikev1 的 fragmentation 插件是闭源的。开源服务器端无法对这些小块进行重组。参考:Cisco * stop working after upgrading to IOS 6

所以产生了一种权宜之计,就是使用小证书(小于 1024,默认一般为 2048),来达到不拆包的目的。但是 Mac OS X 10.7 的更新却对这种方式进行了封杀,学习微软加入了证书验证,小证书直接拒绝。

所幸 strongswan 5.0.2 已经完成了 fragmentation 的开源实现和对 iOS 那个声明加密其实未加密故障的处理:IKE message fragmentation (cisco) + IOS 6.0 Hack for encrypted flaged ike fragmentation packets,该链接中也能找到 strongswan 4 的补丁。

Windows

    微软的差劲只比 iOS 好一点。好处在于它支持了 ikev2,但是只在 Windows 7 以后支持,Vista 之前依然使用 ikev1,坏处在于它的 ikev2 支持非常诡异,指定了 Diffie Hellman group(DH,迪菲-赫尔曼密钥交换组)必须是 modp1024。这是非常少见理论上不应该由系统管理员操心的加密选项:

    在 strongswan 中,定义第一阶段(ike)和第二阶段(esp)加密方法的语法是:

ike/esp=encryption-integrity-dhgroup
第一阶段/第二阶段=加密方法-健壮性认证方法 (后面两项可选)[-DH 组] [-扩展序列号支持模式(RFC4304)]

参考:IKEv2CipherSuites

    Windows 定义了一个可选的选项,导致了我们必须去定义整个第一阶段的加密方法。这样被破解的可能性就提高了。

    其次在于它的 rekey(重连)。IPsec 的认证是有时效的,超过时间会重新认证。这种 CHILD_SA 认证可由服务器发出,也可由客户端发出,一般是由服务器发出。但是 Windows 7 的 ikev2 的表现是,如果你在路由器(NAT)后,收到这种请求会把微软内部的通知代码发出去,代码为 12345, 经过 strongswan 项目侦错后发现这个代码的意思是 ERROR_IPSEC_IKE_INVALID_SITUATION。但是处理不了,它不是 IPsec 标准协议定义过的错误。

于是有两种权宜之计:

    一种是让 Windows 7 来主动 rekey。Windows 7 rekey 的时间大约是 58 分 46 秒,所以要配置服务器 rekey 时间比它长。但是效果非常不好。因为 rekey 是由三个变量控制的,key 的生命周期,key 的边际时间(生命周期前多久进行 rekey),和边际时间误差(rekeyfuzz),误差是不可控的。参考:ExpiryRekey。

    即使能控制 strongswan 这边,Windows 依然是「大约」; 即使两边都能控制,假设服务器延后一秒 rekey,理论上如果连接持续时间足够长,依然能够撞车:58x60+46 次 rekey 后即 146 天后撞车,连一年都没有,在 Linux 服务器对 Windows 服务器这种使用实例中就明显不符合要求。

所以目前只能使用后一种方法即完全禁用服务器端 rekey。

    最后,它的 EAP 认证也非常糟糕。MSCHAPv2 的 eap 身份不是 ikev2 身份(ikev2 身份一般是 EAP 用户名),所以必须在服务器端显式定义 eap_identity 来使用 Windows 7 的 eap 身份。

三、软件的安装

软件的安装很方便,这里我们使用epel仓库里面的yum安装

yum install strongswan 

一条命令就安装好了,下面来查看安装了哪些文件

rpm -ql strongswan

这里我就不展示有哪些内容,下面来看看我们主要使用的配置文件

rpm -qc strongswan

其中/etc/strongswan/ipsec.conf是主要的配置文件,我们也主要对他进行配置

开启转发

echo 1 > /proc/sys/net/ipv4/ip_forward

关闭防火墙

service iptables stop

iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o eth0 -j MASQUERADE

四、软件的配置

1、证书的创建,我这里不再进行演示,大家可以下面的文章

   http://wangzan18.blog.51cto.com/8021085/1676529

    假设证书都已经创建好了,我们把证书放到下面的目录,如果使用PSK认证,不需要证书可以跳过这一步。

cp -r cacert.pem /etc/strongswan/ipsec.d/cacerts/
cp -r server.crt /etc/strongswan/ipsec.d/certs/
cp -r server.key /etc/strongswan/ipsec.d/private/
cp -r client.crt /etc/strongswan/ipsec.d/certs/
cp -r client.key /etc/strongswan/ipsec.d/private/
1.
2.
3.
4.
5.
2、编辑ipsec.conf

    我主要使用的是第二个链接的与共享密钥,比较简单,文章最后有介绍各参数的意义。

vim /etc/strongswan/ipsec.conf

config setup

uniqueids=never 

conn IOS_cert #使用证书认证

keyexchange=ikev1
fragmentation=yes
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.crt
right=%any
rightauth=pubkey
rightauth2=xauth
rightsourceip=10.31.2.0/24
rightcert=client.crt
auto=add

conn android_xauth_psk #使用与共享密钥认证,不需要证书,安卓IOS都可以连接

keyexchange=ikev1
left=%defaultroute
leftauth=psk
leftsubnet=0.0.0.0/0
right=%any
rightauth=psk
rightauth2=xauth
rightsourceip=10.31.2.0/24
auto=add

conn networkmanager-strongswan

keyexchange=ikev2
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=pubkey
rightsourceip=10.31.2.0/24
rightcert=client.crt
auto=add

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
3、ipsec.secrets配置

这个文件默认是没有的,我自己来进行创建

vim /etc/strongswan/ipsec.secrets 

: RSA server.pem
: PSK "myPSKkey"
: XAUTH "myXAUTHPass"
[用户名] %any : EAP "[密码]"
1.
2.
3.
4.
将上面的myPSKkey单词更改为你需要的PSK认证方式的密钥;

将上面的myXAUTHPass单词更改为你需要的XAUTH认证方式的密码,该认证方式的用户名是随意的;

将上面的[用户名]改为自己想要的登录名,[密码]改为自己想要的密码([]符号去掉),可以添加多行,得到多个用户,这即是使用IKEv2的用户名+密码认证方式的登录凭据。

: PSK "PSK password" 相当于:%any %any : PSK "PSK password"
1.
    遵循:“主机 对等点 : 方法 <本机证书/协议密码> <本机证书密码>”的格式。以 :为分界,分别从左到右填充,除了各类密码缺失以 null 补位,其它都用 %any 补位(密码怎么可能是 %any)。

比如我的配置就是如下这样:

: RSA server.key
: PSK "123456a"
test %any : XAUTH "123456"
test %any : EAP "123456"
1.
2.
3.
4.
4、strongswan.conf配置

    dns可以改为你想使用的dns,可以添加两个dns1  dns2。

 vim /etc/strongswan/strongswan.conf

charon {

    load_modular = yes
    duplicheck.enable = no
    compress = yes
    plugins {
            include strongswan.d/charon/*.conf
    }
    dns1 = 114.114.114.114
    nbns1 = 114.114.114.114

}
include strongswan.d/*.conf
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.

五、服务的启动

service strongswan start

然后我们就可以使用手机进行连接了,IOS手机我也试过,也是可以连接的。

    注意这里使用的是Xauth认真的IPSec *

    点击进行登录,输入我们在文件ipsec.secrets设定的账号密码。

    如下显示连接成功,可以打开浏览器查看我们的地址。

    连接上去之后,我们可以在服务器上面查看*的连接状态等等,可以使用strongswan命令查看,如下:

六、ipsec.conf配置文件的详解

   其中config setup只能出现一次,而conn <连接名称> 可以有很多个。这里的名称不是预定义的,可以随意写,只要你能识别就行,主要用来定义一种连接,就是为了让你在日志里好找。

1、新版strongswan里config setup的内容不如旧版的多,许多旧版必须有的选项都被作废了。比如:

plutostart新版所有的ike协议都由原来ikev2的daemon:charon接管。根本就没有pluto了。

nat_traversal新版所有的ike协议都是可以穿越路由器(NAT)的。

virtual_private定义服务器的局域网IP地址。现在被魔术字0.0.0.0/0取代了。

pfs完美向前保密,用于rekey时。意思是你现在的密钥互换过程如果被攻破了,会不会对已经互换过的密钥产生影响。以前一般设置成no来适用于IOS这种客户端会以积极模式发出非加密的rekey请求的情况。现在这个选项完全没作用了。第一阶段永远是完美向前保密的,第二阶段(esp)如果指定了DH组那么也是完美向前保密的,但是默认加密方法就已经指定了DH组。所以该选项永远为yes。

2、而另外旧版和新版都有的选项也都定义了默认值,比如:

strictpolicy是否一定需要证书吊销列表(CRL)的URL。默认就是no。

charonstart是否启动ikev2的daemon。这是旧版加入的,因为那个时候的主力是pluto。现在默认就是yes,你改成no那你连原先pluto的连接都无法连接,因为ike协议的实现全被charon 接管了。

    所以config setup基本上占位就行了。这里我们修改了uniqueids的值来实现多设备同时在线。

3、而conn最主要要理解左右的概念。其实左右是可以不分的,它们只是用来表示一个连接的两端。只是在如果你定义的不够全面时,左侧会默认被认为是本机(你的VPS),右侧默认为他机(你的笔记本),即以左为尊。

left/right是左右id。它们用来识别服务器/客户端,可以是证书的判别名(DN),比如 "C=CN, O=strongSwan, CN=strongSwan CA",也可以是 IP 地址,也可以是 EAP 的用户名,还可以是魔术字 %any,表示什么都行。只是在 5.0.0 之前,为本机这边定义 %any 的话,ikev1 连接即 keyexchange=ikev1 的连接是识别不了,所以要改成 %defaultroute 表示自己从 ifconfig 里取 IP。为了和 right 的 %any 区分开,我们使用这种方法。所以说到最后这两个选项似乎没有什么用。但它们是必须的。

leftauth/rightauth这是最重要的改动。新版主要是作废了之前的authby和 xauth=server/client选项而都改用这种方法。因此使得ikev1也能够出现混血认证(左右两边认证的方法不同)了。参数主要有pubkey表示用证书,psk表示用密码,eap表示用扩展验证协议。

leftauth2/rightauth2是为了应对旧版很常见的authby=xauthpsk/xauthrsasig 的。现在xauth 只能写在这里。而psk对应leftauth/rightauth里的 PSK 方法,rsasig则对应pubkey方法。

leftsubnet最重要的,引入了魔术字 0.0.0.0/0。如果你在右侧为客户端分配虚拟 IP 地址的话,那表示你之后要做iptables转发,那么左边就必须是用魔术字。

leftcert/rightcert就是指定证书名字。

rightsourceip为客户端分配的虚拟IP段。

auto定义strongswan启动时该连接的行为。start是启动; route是添加路由表,有数据通过就启动; add是添加连接类型但不启动; ignore是当它不存在。默认是ignore。看起来似乎是route比较好,但问题是我们服务器端不能预分配虚拟IP,所以服务器端一般用的都是add。而客户端文本配置可以选择start。

    另外说下旧版的 xauth=server/client 的问题。它表示在服务器端还是在客户端执行 xauth 认证。而在新版中主要通过左右方向来体现。比如你在服务器端执行认证,那认证请求是由客户端发出的,所以要写 rightauth2=xauth。如果在客户端执行认证,那认证请求是服务器发出的,所以要写 leftauth2=xauth。

    另外网上很常见的一个配置选项是 leftfirewall=yes。这是完全错误的。看上去它的唯一作用是定义你的服务器是不是在防火墙后面,但实际上它是作为 ipsec_updown 脚本的参数被开发出来,是表明你的本机 subnet 是不是用 iptables 转发/伪装出来的。如果是的话,就调用 left/rightupdown 定义的路径下的脚本,脚本的作用是对通过 ipsec 连接的数据包进行 iptables 豁免。

    之所以说它是错到离谱的(虽然没有产生影响),因为这些人完全就不懂,有公网 IP 的服务器的 subnet 很少是伪装的。另外必须写了脚本该选项才有意义,没看过一个定义了这个选项的人写过脚本。还有,leftsubnet=0.0.0.0/0 通过魔术字把 subnet 定义为了 any,你根本没法写脚本啊。所以我们这里完全就不用。

至于某类型连接,主要是根据设备规格定义的,一些特殊选项的解释如下:

fragmentation=yes 开启对 iOS 拆包的重组支持。

ike=aes256-sha1-modp1024! Windows 指定的第一阶段加密方法。

rekey=no 服务器对 Windows 发出 rekey 请求会断开连接。

rightsendcert=never 因为这是一个混血连接。服务器对自己的身份进行认证时使用的是证书,而服务器对客户端的认证使用的只是 eap-mschapv2。如果不设置的话默认是 ifasked,意思是如果服务器向客户端请求证书,客户端就会给它,但客户端给不出,连接就会断。这里设置为客户端永远不给,实际上的意思其实是服务器不要向客户端请求证书。

eap_identity=%any 使用 Windows 的 eap 身份。不然会出现”no eap key found for host “错误。

六、客户端的设置

IOS

    把CA证书和之前做好的pkcs12(.p12)发邮件给自己。在IOS上收邮件,导入两者。然后新建 IPSec *

服务器,都是IP或都是URL

账户和密码写ipsec.secrets 里XAUTH前后的那两个

如果要使用证书,证书选刚才的那个。否则可以不使用证书,输入ipsec.secrets 里设置的PSK密码。

Android

1、IPSec Xauth PSK

主要还是:

服务器,都是IP或都是URL

IPSec预共享密钥:写ipsec.secrets里PSK后面的那个密码。

然后登入时还是用XAUTH前后的那两个做用户名密码。

2、"strongSwan * Client" for Android 4.0 (ICS)+

    这是官方自己出的客户端,Google Play 里就有。

    把之前做好的 pkcs12 发邮件给自己。实际上 pkcs12 里就包含了CA证书,iOS是有bug才必须明确要求导入CA证书(鄙视之)。Android不用。直接在GMail里点击就会提示你导入。

    然后打开官方客户端,新建方案:

Gateway就是服务器,同上

Type 选 IKEv2 Certificate

User certificate 选你刚才导入的

取消自动选择CA证书,然后在用户证书里选你刚才从pk12导入的

Windows的客户端我还是建议使用pptp或者l2tp open*

七、问题调试

如果没有特殊需要,服务器端的日志就足够检测出绝大多数问题的来源。

日志阅读技巧

    strongswan 的 charon daemon 启动后,会初始化并加载之前你定义好的 conn,这部分 log 是没有必要去读的。当然在你配置有问题时可能就有必要了,但当配置有问题的时候,service strongswan start会失败,strongswan status就会指出你配置问题所在的行号(=。=)...

服务器端调试

/var/log/strongswan-charon.log 文件

需要在/etc/strongswan/strongswan.d/charon-logging.conf里面开启调试日志功能

IOS调试

    越狱安装iFile。编辑/etc/racoon/racoon.conf文件,找到 #log debug; 字段,改成:

log debug;
path logfile "/var/log/racoon.log";
1.
2.
Android 调试

strongSwan 官方客户端提供了日志查看功能。

android 自带的 * 调试方法如下:

打开「终端模拟器」,输入 su,会弹出超级用户,允许。

cd /storage/sdcard0
logcat -f ./log.txt
1.
2.
然后用 Airdroid 等工具把 SD 卡中的 log.txt 传到电脑上,打开搜索 * 即可。

八、总结

   经过我测试得出的结论,我目前只测试了IOS 8还有安卓手机小米Note,都是使用的xauth认证,没有使用证书,我的小米Note是可以连接的上,但是页面加载有问题,查看日志他是使用的android_xauth_psk这个连接,也没有找到问题的原因,同样的配置用IOS连接,因为我们使用的是IOS自带的IPSec *连接,也没有使用证书,参数和安卓的连接一样,因为没有使用证书,识别的也是android_xauth_psk这个连接,但是访问都是一切正常的。

    如果有什么问题欢迎大家和我一起探讨。

附:快速安装文档

环境准备

service iptables stop
setenforce 0
echo 1 > /proc/sys/net/ipv4/ip_forward
yum install strongswan -y
1.
2.
3.
4.

设置主配置文件

vim /etc/strongswan/ipsec.conf

config setup

uniqueids=never

conn mobile_xauth_psk

keyexchange=ikev1
left=%defaultroute
leftauth=psk
leftsubnet=0.0.0.0/0
right=%any
rightauth=psk
rightauth2=xauth
rightsourceip=10.31.2.0/24
auto=add

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

添加数据包伪装转发

iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o eth0 -j MASQUERADE
1.

添加账号密码等信息

vim /etc/strongswan/ipsec.secrets

: PSK "123456a"
test %any : XAUTH "123456"
test %any : EAP "123456
1.
2.
3.

配置strongswan文件

vim /etc/strongswan/strongswan.conf

charon {

    load_modular = yes
    plugins {
            include strongswan.d/charon/*.conf
    }
    dns1 = 8.8.8.8
    nbns1 = 8.8.4.4

}

include strongswan.d/*.conf
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

启动*服务连接

登录后复制
service strongswan start
chkconfig strongswan on
1.
2.

按照上面要求,账号密码如下,手机连接即可。

账号:test
密码:123456

预共享密钥:123456a

©著作权归作者所有:来自51CTO博客作者wzlinux的原创作品,请联系作者获取转载授权,否则将追究法律责任
CentOS 用Strongswan搭建IPSec *
https://blog.51cto.com/wzlinux/1683915