frp 源码分析
说明
本文档是 2024 秋季学期 UCAS 课程《面向对象程序设计》的源码分析大作业,笔者选择对 frp 源码进行分析。
frp 是一个开源的内网穿透工具。通过 frp,用户可以将内网服务暴露到公网,实现内网穿透的效果。仓库的地址为https://github.com/fatedier/frp。本人阅读的是最新版本 v0.61.0。
缘起
在 2024 年秋季学期,笔者因为同时选修计算机系的两门研讨课——体系结构研讨课和操作系统研讨课(原神lab!!!),需要经常把自己的游戏本和电源适配器(砖头)背来背去。虽然对于习武之人是强身健体的好方法,但奈何本人实在太懒
,如此频繁的搬运工作非常让人头疼
。更何况,每次都要拔掉宿舍电脑外接的显示器、机械键盘和网线,实在是太麻烦了。
尽管宿舍和教学楼只有不到百米的通勤距离,但为了进一步减轻负担,笔者国庆节期间在 海鲜市场 闲鱼买了一台二手 surface,用于在宿舍外进行轻便的办公。轻薄本的体验让人爱不释手,但是两台电脑信息的同步又成了一个问题。为了从根本上解决这个问题,笔者想到将宿舍的游戏本搭建成服务器,然后让 surface 直接 ssh 连接到游戏本上,这样就可以在远程直接操作宿舍的电脑,不需要花额外精力去同步两台电脑的信息了。
想法已有,但是实现起来还是面临着重重困难。利用 UCAS 校园网先进的 IPV6 ,很容易就能获取到公网 IP。因此,笔者最先在游戏本上用 apache 搭建了服务器。但是,先进的 IPV6 也有失灵的时候,有一天本人在一公寓活动室和组员讨论操作系统实例分析时,突然间就断连了。一打听才知道,校园网的 IPV6 寄了
,这可如何是好?
虽然就遇到一次,但是这种情况很可能会再次发生。更何况,将电脑直接暴露在公网上也是非常不安全的,尤其是 ssh 服务,一旦真的被黑客入侵,后果不堪设想。因此,笔者决定暂时抛弃 IPV6,回归到传统的内网穿透。于是又开始寻找一种更加安全、稳定的内网穿透工具,最终找到了 frp。frp 不仅支持多种协议,还提供了安全的访问认证功能,有效保护了内网服务的安全,非常符合笔者的需求。
选题
在《面向对象程序设计》课程中,笔者立刻想到了 frp。这本来就是一个优秀的开源项目,代码量不算太大,而且 Go 语言上手也相对简单,非常适合作为源码分析的对象。因此,笔者选择了 frp 作为本次大作业的选题。
这是本人第一次认真阅读开源项目的源码(除了 xv6,那个不够面向对象),虽然是自己不太熟悉的编程语言,但得益于大模型以及goplantuml
和Sequence Diagram
等工具的神助,笔者源码分析的过程并没有预想中困难。此外,由于笔者这学期并未选修《计算机网络》课程,所以与网络相关的部分难免有所疏漏,敬请谅解。希望本次源码分析能为读者提供一些帮助,没有帮助也不要紧,反正 frp 真的蛮好用的。有任何问题欢迎通过邮箱lanyuzhou22@mails.ucas.ac.cn联系笔者。
P.S. 关于笔者最终如何通过 frp 实现内网穿透的细节这里不展开叙述,以免有打广告嫌疑(玩 MC 的同学应该能猜到用的是什么)