声明
本文章仅供学习探讨相关技术之用,不保证实际环境中的可用性与合规性,请勿部署在实际环境中。同时,请遵守 VPN 提供方的相关规定(例如,学校提供的 VPN 绝对不可以分享给他人,并且只有本人可以使用)。
此外,本系统会保存登录 vpn 的用户名、密码与 2FA 于树莓派中,尽管可以以各种形式加强安全性(例如设置文件权限、禁止密码登录树莓派),但安全性与不部署此系统相比仍有降低,请参考 4.2 节关于安全性的措施。
2022 Jan 29 更新:
- 实际使用中发现存在 OpenConnect 进程还在,但是 vpn 连接并没有生效的情况,所以新增了一个通过ping实现的保活的 daemon,详见 3.3.4
- 更新了
myvpn.service
,密码不会再明文暴露其中
- 优化了一些脚本
1 需求分析
只在树莓派上登陆学校的 Cisco Anyconnect VPN,让同一个子网内的其他设备通过树莓派访问学校内网资源(ssh、远程桌面、查论文)(我的主要需求是访问内网工作站上的 PVE web portal 和使用 SPICE 远程连接工作专用的虚拟机)。同时在树莓派上实现 VPN 的自动登录和重连,保证高可用性。
近期主力科研设备转移到了一台放在实验室的 ML Workstation,由于这个 workstation 处于学校内网,所以必须要连接上学校的 VPN 再通过远程桌面使用(不喜欢 teamviewer)。考虑到 VPN 的特殊性,我并不想在个人设备上时时开着 vpn 进行科研(说得我好像经常在科研一样),所以我总是打开放在家里的一台学校的 workstation,再连接vpn、远程桌面。这台 workstation 发热量极大,导致房间温度总是很高,所以上述需求也就应运而生。如果我在树莓派上登录了 vpn,那我子网里其他所有设备就可以通过树莓派来连接学校内网了,并且只有在规则中设定好的请求才会被转发至内网,也就是说在个人设备上进行科研不再会有各方面的顾虑了。
2 实现分析
以树莓派为核心,这套系统分成了两个部分:流量转发和 VPN 的配置(主要是自动登录与重连)。
流量转发其实是一个老生常谈的话题(毕竟这种 routing 和科学上网密不可分),简单的静态路由加树莓派上开个 nat 就足够了。
Cisco Anyconnect 的 client 在树莓派上可以用 openconnect 替代。vpn 的自动登录主要难点在于学校启用了 Duo 2FA,需要在自动登录脚本里自动生成 2FA passcode,好在我在一番搜索之后找到了在命令行生成 Duo Passcode 的办法。除了一些网络连接错误之外, VPN 会有两种情况自动断线,一种是 idle 超过一定时间(据我观测大约是1小时),另一种是达到了最大连接时长(大约是24或25小时),所以需要实现自动重新连接,来保证 vpn 服务不断。这个需求用 crontab 或者 systemd 均可,权衡一番之后我最终给 openconnect 写了个 service 文件,用 systemd 作为 daemon。
总的来说,这套系统包含: