原本以为连个VPN没啥大问题的,结果折腾了半天……还是被windows惯坏了……诶

环境确认

系统是manjaro,桌面是KDE,确认已经安装strongswannetworkmanager-strongswan及其所有依赖。
其他发行版或桌面环境不保证有效,仅供参考。

ubuntu系统可能默认软件源的strongswan不支持后文提到的 EAP-GTC 等模式,请参考官方网站自行编译。

尝试连接

首先网络设置里点底下那个+号,往下滚就能看到IPSec strongswan的连接选项了,你可以试试EAP方式连接,证书可以不填,如果连接上了那恭喜你可以直接关掉这个页面了……
1.png
但是大概率你是连不上的,会出现一个 VPN connection 'xxx' failed 之类的错误(看不到可能是被连接的弹窗挡掉了,关掉看看)
2.png

Debugging

下面就是艰难的Debug时间
首先GUI讨厌的一点是没有log消息,我们需要康康发生了什么

journalctl -u NetworkManager |tail -n 1000 > log.txt

log打出来可以看到最后有一坨

VPN plugin: failed: connect-failed (1)

之类的东西,然而这种SB东西和之前一样没啥用……我们需要往上翻仔细看看连接过程。

原先我以为是证书的问题,因为不知道用啥所有就没填,然而在log中我们可以看到它自动遍历了所有CA然后其实连接是成功的,

authentication of 'CN=stu.vpn.sjtu.edu.cn' with RSA_EMSA_PKCS1_SHA2_256 successful

而且我们也看到接下来其实开始了验证过程

server requested EAP_IDENTITY (id 0x00), sending 'xxxx'
generating IKE_AUTH request 2 [ EAP/RES/ID ]

这里xxxx就是我们的用户名,说明已经通过了证书协商开始认证账号了,再往后翻

parsed IKE_AUTH response 2 [ EAP/REQ/PEAP ]
server requested EAP_PEAP authentication (id 0x01)
EAP_PEAP version is v0
generating IKE_AUTH request 3 [ EAP/RES/PEAP ]
...
parsed IKE_AUTH response 3 [ EAP/REQ/PEAP ]
negotiated TLS 1.2 using suite TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
generating IKE_AUTH request 4 [ EAP/RES/PEAP ]
...
parsed IKE_AUTH response 4 [ EAP/REQ/PEAP ]
generating IKE_AUTH request 5 [ EAP/RES/PEAP ]
...
parsed IKE_AUTH response 5 [ EAP/REQ/PEAP ]
server certificate does not match to 'CN=stu.vpn.sjtu.edu.cn'
sending fatal TLS alert 'access denied'
generating IKE_AUTH request 6 [ EAP/RES/PEAP ]
...
parsed IKE_AUTH response 6 [ EAP/FAIL ]
received EAP_FAILURE, EAP authentication failed
generating INFORMATIONAL request 7 [ N(AUTH_FAILED) ]

这里可以发现是认证错了……但我可以确信密码没有问题,那么问题只能出在这个EAP_PEAP了,不知道啥情况可能是认证方式不一致。

问题解决

根据这些线索我找到了在这里前人踩过的坑……原来EAP方式还有各种细分,果然还是windows傻瓜式好emmm
连接成功后可以看到最后认证使用的是EAP-GTC方式,而不是之前那个EAP_PEAP,自然会出错……

不过看官方网站似乎是可以资瓷的,不太清楚问题出在哪可能是服务端的问题(但是win可以直连),待我提个issue问问……翻了翻源码也没看到啥问题(可能是我太菜了)

GUI还是不行终端才是王道~

后续

向官方提了个issue,看回复应该是SJTU的VPN服务器配置问题,首先给出的验证方式不是EAP-GTC而是EAP-PEAP,而GUI比较笨就信了它的邪……
所以解决办法有两个,一个是黑掉服务器爆改设置……还有一个比较可行的办法就是让charon不加载EAP-PEAP这个插件就行了。
可以在编译期做但是这样更新了还要自己编译,不太友好,我们可以通过改配置文件的方法让它不加载。需要注意的一点是NetworkManager使用的是charon-nm而不是普通的charon,所以修改charon的配置没有效果,应该改strongswan的配置。

sudo vim /etc/strongswan.conf

在里面加上

charon-nm {
  plugins {
    eap-peap {
      load = no
    }
    eap-md5 {
      load = no
    }
  }
}

注意这里还有一个EAP-MD5,因为SJTU的服务器默认按照EAP-PEAP-EAP-MD5-EAP-GTC的顺序认证,所以需要把前两个都禁用掉。

如果是其他服务器的话可能配置顺序不一样哦,或许还有其他认证方式在前面,请参考Debugging中打日志的方法,看看最后连接用的是哪个,不是你要的连接方式的都禁用掉就行啦。

接着重启,然后删掉原来那个连接,像之前第一步那样点+号新建一个连接。

不重启无法重新加载charon-nm设置,而不重新建一个连接会密码错误,具体原因不明。

最后就可以愉快的用GUI啦~(真香
3.png