我发现我的电脑上,大多数流量都是 http/https 流量,对于不使用 http/https 协议的软件,基本都能在客户端设置里面代理地址,比如邮件客户端、BT 类下载工具都有提供一个设置代理的选项,因此这一类软件根据自己需要配置即可。
日常办公中,需要代理的情况原因主要有两个,一个是请求地址被墙的必须用到代理,另外一个是请求的地址没有被墙,但是下载速度奇慢无比需要代理服务器加速,主要是各种包管理器用到的软件源。其他理由可能包括匿名性的需求,这个对我而言不是要紧。
网上有很多成熟的客户端,但是考虑到如果一个软件的配置文件行数多到足够我重新写一个新的小工具,为什么不自己写一个呢,当然使用 Go 编写的。
- 使用其他防火墙穿透软件提供一个 socks5 代理
- 劫持本地所有 http / https 流量,解析请求主机名,根据自己需求进行分流
- 无视 dns 污染,是因为通过主机名进行分流,域名解析在服务端执行,所以本地 dns 解析结果不做参考
事实上,我没花多少时间就写了一个 Go 版本的 demo ,使用 nftable 配置转发所有 80/443 端口的流量到指定端口,然后分析请求,对于 http 是明文请求获取 Host 字段就是主机名,https 请求自己解析扩展信息 SNI 也可以获取到主机名。
后来觉得 Go 占用资源而且我又开始学习 Rust 了,就用 Rust 重新编写了这个程序,算是我的第一个 Rust 作品。因为电脑上的所有网页请求都需要经过这个程序,所以在各种方方面面我都想着能简单就简单,用最少的资源完成我需求。
- 分流策略基于主机名,没有其他的策略
- 对于 https 协议,只读取 SNI 信息,整个 https 请求帧不会完整的分析
- 如果无法获取主机名,则是根据原来请求的目标 IP 转发请求
分流策略比较简单,基于哈希表将每个主机名分割成不同的部分,比如 example.com 这个域名会以com ⇒ example ⇒ null 这种格式存储,对于域名下面的所有子域名也都会命中策略。
因为是自用的工具,维护一套完整的代理列表不太现实,所以就网络上找了个网址列表,自己转换一下导入进去。不过分流策略的准确性直接影响到上网冲浪的体验,写死的分流策略不怎么好用,我都是遇到网络错误,然后现场把主机名添加进去,在切换回工作现场,再试一次。
简单说就是我创建了一个命名管道,然后每次遇到需要临时代理的主机名,就打开终端:
echo "example.com" > /named-pipe-path
目前我这个程序已经用来有一年多了,基本满足日常工作过程中特殊的网络需求,近半年来没有出现过任何崩溃的情况。
具体的用法的介绍可以查看项目 README.md。
同时我目前在深圳寻找一份工作,欢迎大佬点评简历:/t/933572