JS 检测用户是否使用 socks5 代理

2021-10-17 17:26:21 +08:00
 iqoo

检测方案有很多,这里讲解一个有趣的。

由于大部分 socks5 代理只转发数据,不转发 TCP 头,因此后端返回数据时附带一个特殊的 TCP 头,然后前端验证该头是否生效,即可推断否是存在代理。

例如后端下发 tcpwin=0 的控制信息,正常情况下前端收到后不会再往外发包,数据累计在协议栈缓冲区里;而有代理的情况下,数据被累积在了代理服务的缓冲区,前端仍能往代理服务发包,缓冲区不会有累积。至于缓冲区是否满,可通过 WebSocket 的 bufferAmount 属性检测。

Demo: www.etherdream.com/proxy-detect/tcpwin.html

实现也很简单,查看 github.com/EtherDream/web-frontend-magic

有不准确的情况可反馈。

2703 次点击
所在节点    分享创造
21 条回复
Trim21
2021-10-17 17:31:43 +08:00
手机试了下,挂没挂代理都是 true
XhstormR02
2021-10-17 18:26:15 +08:00
Android vpn 试了有效
ZeroClover
2021-10-17 18:39:34 +08:00
对移动设备似乎无效。

虚拟网卡类型的代理似乎也能检测出来。
liuzhiyong
2021-10-17 18:49:09 +08:00
安卓上面有效,强。
ClarkAbe
2021-10-17 19:40:48 +08:00
大佬本人?
iqoo
2021-10-17 19:44:05 +08:00
理论上 VPN 是无效的,只有 http/socks 有效
Tink
2021-10-17 20:06:40 +08:00
厉害了,路由器 clash fq 有效
crab
2021-10-17 20:17:37 +08:00
@ClarkAbe 记得是他 @mytry
heiher
2021-10-17 21:18:44 +08:00
有两个问题:
1. tcpwin=0 时,用户态 send 的数据也可以在内核的 TCP 栈上部分缓冲,缓冲空间有多大不同系统可能不同,影响判断精度不?
2. socks5 代理服务器也可以缓冲很小的,与问题 1 还是不太好区分?
lekai63
2021-10-17 21:58:51 +08:00
loon 测了下。 被识别出来了
iqoo
2021-10-17 22:52:05 +08:00
@heiher 不止 TCP 栈有缓冲,浏览器 ws 栈也有,所有得发很大的数据,把本地缓冲用完(反正发多大数据都不会消耗服务器带宽)。

代理缓冲小就没办法了,会有误报。
NewYear
2021-10-18 09:15:10 +08:00
win10 firefox 无效
iqoo
2021-10-18 10:39:06 +08:00
@NewYear firefox 缓冲区比较小,得减少发送量。现在可以了
iqoo
2021-10-18 11:19:21 +08:00
@NewYear 应该是和代理端的缓冲区有关,不同的软件不一样。所以这种方式其实并不稳定~
scyuns
2021-10-18 13:46:17 +08:00
4G 开流量看也是 true 呀
NewYear
2021-10-18 17:58:10 +08:00
@iqoo 没啥用,还是 false 。。。。算了吧别折腾了哈哈哈
BQsummer
2021-10-20 16:22:53 +08:00
mac big sur, clash, ss, chrome 无效
imxieke
2021-10-23 05:13:35 +08:00
ios 15 无效 结果都一样
imxieke
2021-10-23 05:14:08 +08:00
shadowrocket
hanssx
2023-10-12 14:07:02 +08:00
这个需要等好久吗?一直显示 status: ...
也没发现有未完成的包?

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

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

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

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

© 2021 V2EX