Android VPN 转 Socks5 代理应用分享

2023-02-17 21:20:27 +08:00
 heiher

大家好,我又来分享轮子啦~

SocksTun是我最近开源的一个基于HevSocks5Tunnel实现的 Android VPN ,用于将手机端的 TCP 、UDP 流量通过 Socks5 代理进行转发。其实它只是一个参考实现,主要用于演示如何用 HevSocks5Tunnel 实现 VPN 。它可以对接明文的标准 Socks5 协议,比如 Socks5 服务(或映射)部署在本地局域网,也是能具有一些实用性的吧。

特性支持

使用方法

服务端

HevSocks5Server

HevSocks5Server支持 UDP 从 TCP 转发,可以运行在 Linux/BSD 和 macOS 系统上,配置、使用方法也比较简单。

# 下载、编译
git clone --recursive https://github.com/heiher/hev-socks5-server
cd hev-socks5-server
make

# 运行
hev-socks5-server conf.yml

conf.yml:

main:
  workers: 4
  port: 1080
  listen-address: '::'

misc:
  limit-nofile: 65535

其它

任意支持标准 Socks5 协议的 TCP(Connect)和 UDP(Associate)的服务端即可。

手机客户端

  1. 从项目发布页下载 APK 并安装。
  2. 打开应用,配置 Socks5 地址、端口和 DNS 地址。
  3. 如果使用 HevSocks5Server 服务端,钩选 UDP relay over TCP ;使用其它服务端则去掉。
  4. 保存配置后,点击启用开启 VPN 服务。

性能评测

Android VPN App 目前还没有做过性能、能耗的评测(其实是不会~),之前在低性能的 RK3399(AArch64 架构)设备做过几款 tun2socks 的评测,结论是只有 HevSocks5Tunnel 可以几乎跑满物理网卡的最大带宽,并且对应的 CPU 资源使用最少。那么,基于它实现的 Android VPN 应该具有相对较好的节能效果吧。

速率

CPU 使用率

最后

最开心的事情当然是开源的这些小轮子能跑起来,确实对大家有用,期待支持与反馈~

4610 次点击
所在节点    分享创造
42 条回复
HXHGTS
2023-02-18 10:42:27 +08:00
建议改成 socks2tun ,和 tun2socks 反过来,哈哈
Achophiark
2023-02-18 19:49:00 +08:00
支持开源。
mogging
2023-02-19 07:48:21 +08:00
感觉可以用于抓包?
studyingss
2023-02-19 09:28:01 +08:00
DNS 那一栏不支持填端口号,没办法和其他代理配合使用。
参考 https://www.pishifu.org/Logs/clash-and-adguard.html
原因是需要接管 dns 实现分流。
heiher
2023-02-19 23:25:17 +08:00
@mogging 确实可能,一些使用 VPN 方案的抓包应用就是使用 tun2socks 方案实现的 TCP 流重组并直接对接到物理网络。
heiher
2023-02-19 23:28:03 +08:00
@studyingss 是的,DNS 两项是配置的 VPN 网络的 DNS 地址,不支持直接指定端口。就分流的需求来说,其实可以实现在服务端,因为 DNS 流量也是通过 Socks5 的。
t6attack
2023-04-04 12:16:14 +08:00
一直有疑惑,为什么此类应用必须设置 DNS 呢? socks5 代理不应该是直接把域名传到代理端吗?
为什么要在本地解析域名?
heiher
2023-04-04 23:02:55 +08:00
@t6attack 因为 IP 网络的地址类型只有 uint32 和 uint128 两种,假设支持 domain string 就像 socks5 一样,那么你这个想法就可以实现啦。
cxc520589
300 天前
这用途我正需要,请问安卓手机怎么部署?使用 termux 来部署吗
heiher
300 天前
@cxc520589 APK 直接安装
cxc520589
300 天前
@heiher 我的意思是安卓上的服务端
cxc520589
300 天前
@heiher 我的用途是把手机上的 Google oneVPN 转接到局域网上
ClarkAbe
282 天前
挺不错, 但是 DNS 那里能不能继承 WIFI 或者 4G 的 DNS...
heiher
282 天前
@ClarkAbe 如果网络出口变成了 Socks5 代理服务器,那么客户端本地的 WIFI 或 4G 的 DNS 未必是合适的。
ClarkAbe
282 天前
@heiher #14 但是会有可能用家庭内网 DNS 的情况
anciusone
234 天前
已 star ,试了下,挺简单方便的。
studyingss
182 天前
@heiher
我的表述有误。
在 clash 这一系的代理工具里,使用了 fake-ip 或者类似的机制来让代理工具可以取得域名,因此从 tun 接管流量的时候需要把 dns 填写成代理工具在本地开放的端口。
heiher
182 天前
@studyingss 其实代理工具可以直接使用标准端口,因为它接管了 tun 上所有的流量,也就是可以虚拟任何地址上任意端口的服务。也就是不管 tun2socks 的客户端填写或继承动态分配的 dns 地址是什么,只要流量经过代理工具都可以捕获,我这的应用场景是这样处理的。
studyingss
174 天前
@heiher 虽然没听懂,但是还是谢谢。
clash 的配置一般会在 127.0.0.1:6060 这样的端口上开一个 dns server ,我不是很懂如果使用标准配置要怎么写,127.0.0.1:53 ? 后续我会尝试下。

我有一个新的问题,就是你的 banchmark 看起来很好看,比其他所有实现都更好,但是根据我粗浅的理解,在某一方面的提升一般会付出另外一些代价,比方说速度更快一般就会消耗更多的内存,要么就是支持的特性少一些,但在你的测试里,速度更快,内存消耗也更少,
你的实现里面用了 lwip ,badvpn 的 tun2socks 也一样用了这个库,在这个部分应该是没有区别的,在我的理解里 tcp stack 的实现应该是最影响性能的部分,我有点疑惑。
翻了一下 readme ,没有找到你的实现的相关文档,所以想请教一下,你的实现在测试的表现上比其他实现更好的主要原因是什么?可以简单讲解一下吗?或者提供一点线索?
heiher
171 天前
@studyingss #19

如果是在 clash 分流规则中捕获 dns 访问,填写任何 dns 服务器地址都行,只要与分流规则中一致。

关于性能我认为主要有这两方面:
1. 内存使用方面:编程语言的影响很明显,比如 GoLang 就明显没有 C 语言容易精细控制内存。
2. 传输速度方面:一方面是对 lwip 的调参,提高单次 IO 的载荷从而提高整体性能;另一方面是将 lwip 的 zero-copy 真正应用起来。

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

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

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

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

© 2021 V2EX