Linux下连接SJTU-IKEv2校园网代理
原本以为连个VPN没啥大问题的,结果折腾了半天……还是被windows惯坏了……诶
环境确认
系统是manjaro,桌面是KDE,确认已经安装strongswan
、networkmanager-strongswan
及其所有依赖。
其他发行版或桌面环境不保证有效,仅供参考。
ubuntu系统可能默认软件源的strongswan不支持后文提到的 EAP-GTC
等模式,请参考官方网站自行编译。
尝试连接
首先网络设置里点底下那个+号,往下滚就能看到IPSec strongswan的连接选项了,你可以试试EAP方式连接,证书可以不填,如果连接上了那恭喜你可以直接关掉这个页面了……
但是大概率你是连不上的,会出现一个 VPN connection 'xxx' failed
之类的错误(看不到可能是被连接的弹窗挡掉了,关掉看看)
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啦~(真香