0x01 前言

今天在维护家庭网络时发现strongswan日志中存在许多连接失败的记录,而且都是IKEv2协议的。经过排查后发现是配置文件中一个值设置错误所导致的。

安装过程可以参考我之前写的文章:配置基于StrongSwan 的IKEv2

0x02 错误

客户端使用IKEv2协议连接VPN服务器时会一闪而过,不能正常连接。在日志中可以看到以下记录:

Dec  7 05:49:50 26[CFG] <5> no matching peer config found

这意思是客户端传入到服务器中的信息,在服务器中找不到可用的配置与之相适应。

0x03 原因

找到问题,现在来检查配置文件以便找到原因。以下是IKEv2的相关配置信息(敏感信息已经隐藏):

#打开文件
[root@c1 ~]# vim /usr/local/ipsec/etc/ipsec.conf

#IKEv2配置信息
conn IKEv2_EAP_Crt
     keyexchange = ikev2
     eap_identity = %identity
     leftcert = serverCert.crt
     leftauth = pubkey
     leftid = @foo
     rightauth = eap-radius
     rightsendcert = always
     leftsendcert = always

IKEv2有两个很总要的信息需要确认,一个是数字证书,证书必须正确配置ca、crt和key三个文件。其中服务器证书serverCert.crt中subject DN或subjectAltName字段必须包含服务器的IP或域名。

在这里我确定我的证书的配置是正确的,最后可以确定问题出在服务器域名与证书域名的匹配问题上。在上面的配置信息中最让我感到疑惑的是leftid这个配置信息。

通过查找wiki(ipsec.conf: conn <name>),我终于知道为什么会链接不上了。wiki中关于left|rightid有一段说明:

how the left|right participant should be identified for authentication; defaults to left|right or the subject of the
certificate configured with left|rightcert. If left|rightcert is configured the identity has to be confirmed by the
certificate, that is, it has to match the full subject DN or one of the subjectAltName extensions contained in the
certificate.

Can be an IP address, a fully-qualified domain name, an email address or a Distinguished Name for which the
ID type is determined automatically and the string is converted to the appropriate encoding. The rules for this
conversion are described on IdentityParsing. In versions before 5.0.0 fully-qualified domain names can be
preceded by an @ to avoid them being resolved to an IP address.

大意是:

left|rightid应该在用户认证过程中进行鉴别,同时left|rightcert的值应该是left|rightcert数字证书中的subject DN或subjectAltName中的值。left|rightid可以是IP地址、域名、邮箱地址甚至是证书中可以辨识的名称。

0x04 解决

问题很简单,解决图途径也很简单。根据上面的解释,我只需要将leftid中的值替换为证书的域名即可:

leftid = @foo.com

然后重启ipsec:

[root@c1 ~]# /usr/local/ipsec/sbin/ipsec restat

0x05 结语

一切又恢复正常。