分享个人自用的分流工具,彻底无视 dns 污染

2023-04-18 22:11:00 +08:00
 iRiven

我发现我的电脑上,大多数流量都是 http/https 流量,对于不使用 http/https 协议的软件,基本都能在客户端设置里面代理地址,比如邮件客户端、BT 类下载工具都有提供一个设置代理的选项,因此这一类软件根据自己需要配置即可。

日常办公中,需要代理的情况原因主要有两个,一个是请求地址被墙的必须用到代理,另外一个是请求的地址没有被墙,但是下载速度奇慢无比需要代理服务器加速,主要是各种包管理器用到的软件源。其他理由可能包括匿名性的需求,这个对我而言不是要紧。

网上有很多成熟的客户端,但是考虑到如果一个软件的配置文件行数多到足够我重新写一个新的小工具,为什么不自己写一个呢,当然使用 Go 编写的。

  1. 使用其他防火墙穿透软件提供一个 socks5 代理
  2. 劫持本地所有 http / https 流量,解析请求主机名,根据自己需求进行分流
  3. 无视 dns 污染,是因为通过主机名进行分流,域名解析在服务端执行,所以本地 dns 解析结果不做参考

事实上,我没花多少时间就写了一个 Go 版本的 demo ,使用 nftable 配置转发所有 80/443 端口的流量到指定端口,然后分析请求,对于 http 是明文请求获取 Host 字段就是主机名,https 请求自己解析扩展信息 SNI 也可以获取到主机名。

后来觉得 Go 占用资源而且我又开始学习 Rust 了,就用 Rust 重新编写了这个程序,算是我的第一个 Rust 作品。因为电脑上的所有网页请求都需要经过这个程序,所以在各种方方面面我都想着能简单就简单,用最少的资源完成我需求。

  1. 分流策略基于主机名,没有其他的策略
  2. 对于 https 协议,只读取 SNI 信息,整个 https 请求帧不会完整的分析
  3. 如果无法获取主机名,则是根据原来请求的目标 IP 转发请求

分流策略比较简单,基于哈希表将每个主机名分割成不同的部分,比如 example.com 这个域名会以com ⇒ example ⇒ null 这种格式存储,对于域名下面的所有子域名也都会命中策略。

因为是自用的工具,维护一套完整的代理列表不太现实,所以就网络上找了个网址列表,自己转换一下导入进去。不过分流策略的准确性直接影响到上网冲浪的体验,写死的分流策略不怎么好用,我都是遇到网络错误,然后现场把主机名添加进去,在切换回工作现场,再试一次。

简单说就是我创建了一个命名管道,然后每次遇到需要临时代理的主机名,就打开终端:

echo "example.com" > /named-pipe-path

目前我这个程序已经用来有一年多了,基本满足日常工作过程中特殊的网络需求,近半年来没有出现过任何崩溃的情况。

具体的用法的介绍可以查看项目 README.md

同时我目前在深圳寻找一份工作,欢迎大佬点评简历:/t/933572

4199 次点击
所在节点    分享创造
7 条回复
molezznet
2023-04-18 22:51:49 +08:00
“维护一套完整的代理列表不太现实,所以就网络上找了个网址列表,自己转换一下导入进去。” 嗯 这个能直接读取一个 onling 的 list 不, 这样多终端方便些 hahahaha
SenLief
2023-04-19 07:24:24 +08:00
这不就是 clash 这类 dns 分流策略吗? dns 污染主要是 ip 吧,你这好像没解决这个问题啊。如果是域名解析,那就简单多了。
bigtan
2023-04-19 08:09:14 +08:00
我用的另外一套方案 完全按照 IP 来分流. ss-rust 的 acl 默认全部走代理,用 17mon 的国内 ip 段走直连.缺点是 ipv6 不好搞.
star7th
2023-04-19 10:16:42 +08:00
看了 N 久才明白标题怎么回事,设置个 http 代理跟 dns 污染有什么关系。原来就只是简单的域名在服务端解析。
建议好好练习表达能力
tswc
2023-04-21 18:53:51 +08:00
star 表示支持
FrankAdler
2023-04-22 23:52:26 +08:00
v2ray 、xray 、sing-box 、clash 等一大堆已有的东西都能达到这类效果啊,配合 geosite 、geoip 、自定义规则,为什么要重复造轮子呢
l619534951
2023-10-28 14:03:48 +08:00
其实 sing-box 和 clash 都很好用,配置文件没几行,支持全系统

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/933580

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX