分享:基于 kcp 写的代理工具 nysocks(node-addon)

2017-12-20 21:50:05 +08:00
 oyyd

TLDR; nysocks1.2.4 版本支持了“某个很流行的代理”协议(即作为其 server 服务),修复了一些内存问题(项目的本身的代码 valgrind free )。

nysocks是基于kcp写的的 node-addon,用于网络代理,在有一定程度丢包的网络环境下会比 tcp 有更好的传输效果。

目前 nysocks 的 client 支持 SOCKS5 协议和“某个很流行的代理”协议。使用这些协议的客户端都可以接入。

对于我这边经常丢包 10%的 Linode Tokyo 2, JP 机房到 YOUTUBE 的测试:

tcp 代理

或者你想看 gif

nysocks

或者你想看 gif

使用

安装完 node 和 node-addon 后:

npm i -g nysocks

在对境外网络访问比较好的机器上开 server:

nysocks server -k MY_PASSWORD -m fast

在境内机器或本机上开 client (默认 SOCKS5 ):

nysocks client -k MY_PASSWORD -s my.host.net -m fast

或者开“某个很流行的代理”协议的 client:

nysocks client -c config.json --cp SS --ss_password MY_SS_PASSWORD --ss_method aes-128-cfb

另外-d start开启守护进程,-c config.json指定配置文件

底层传输默认aes_256_cbc加密,流量过境时,协议应该不会被轻易识别阻拦。

一些微小的思考与分享

对于 kcp 及其他比 tcp 占用更多网络资源的工具,我比较赞同云风老师的想法。和其他工具对比起来,我觉得至少 kcp 做的是比较优雅的。

nysocks 大量参考 kcptun,目前不支持 FEC。在最便宜的 VPS 上(aliyun, linode),10MB/s 的传输 cpu 和内存应该都没有太大问题,整体瓶颈还是带宽。底层的 node-addon(C/CPP)代码还有很多优化空间。脚本消耗内存比较厉害,猜测不太适合部署在路由器上等小内存的设备上。

原本想用 node 直接写kcp-node,但是 node 中默认包含的 api (来自 libuv )和性能都还是会有问题。好在之前看到了 Scott Frees 的 blog 和这本电子书 —— C++ and Node.js Integration(需付费)。如果你有类似的需求的话,特别是在 c/cpp 层面进行非阻塞进程的操作及大量 buffer 在 c/cpp 和 v8 之前转换的这种场景,这本书中的内容是非常有效、实用的。

对我自己最大的帮助还是代理用的 vps 的选择范围变广了。欢迎试用和各种意见。

2942 次点击
所在节点    分享创造
16 条回复
bao3
2017-12-21 02:59:38 +08:00
为什么我们不是协作起来打造一个好用的而每个人造一次轮子,结果疏于维护。。。。
oyyd
2017-12-21 10:15:55 +08:00
@bao3 我是觉得,在这件事情上,个人理解原理最重要,客观手段多不是件坏事。其次 golang 很好,但也不是每个人都熟悉。我自己是特别想尝试在脚本上用起来 kcp,所以说是 proof of concept 也不过过吧,至少我自己能用 nysocks 替代其他日常代理工具。
Thiece
2017-12-21 10:48:14 +08:00
我用的香港线路,丢包反而不是困扰着我的问题,线路本身上没有问题,但是在公司这边的网络网关对 UDP 限制,以及应该是识别出了酸酸乳的协议对我使用的端口进行了屏蔽。nysocks 有计划解决这些问题吗?
xm0625
2017-12-21 15:35:51 +08:00
@Thiece 这是 Qos 问题,来自运营商对 UDP 流量的粗暴 Qos 根本不管你是什么协议
xm0625
2017-12-21 15:38:17 +08:00
@Thiece 所以最佳方案是 KVM_VPS+BBR+酸酸乳乳+tls 伪装
NullMan
2017-12-21 16:10:44 +08:00
很赞!比 kcptun 好用,已切换成 nysocks 了.
Thiece
2017-12-21 16:40:45 +08:00
@xm0625 抱歉,我一直在你们口中听说酸酸乳乳,但是我一直找不到它的项目地址。我在 GitHub 上发了这个项目,它对于 UDP 被 Qos 的处理方法非常有意思 https://github.com/wangyu-/udp2raw-tunnel
ZiLong
2017-12-21 17:07:07 +08:00
@xm0625 酸酸乳大概知道是啥?请问酸酸乳乳又是啥,可以给点提示么?
xm0625
2017-12-21 18:02:26 +08:00
@ZiLong aab->aabb
xm0625
2017-12-21 18:03:52 +08:00
@Thiece 看我 github 的 star
ZiLong
2017-12-21 18:36:43 +08:00
@xm0625 最后一个乳是 server 啊,我还以为。。。
oyyd
2017-12-21 21:19:08 +08:00
@Thiece 每个地方的网络情况不一样,得看具体情况。我碰到的情况是公司网络会对请求做代理,不保持链接再次发请求,端口会发生变化,并且 udp 发送请求和接收请求的端口必须完全一致,这类情况我再 nysocks 中做了处理。理论上如果加密解密包含了协议部分的话,都不会被轻易识别。
oyyd
2017-12-21 21:22:24 +08:00
@NullMan 感谢资瓷(其实更多是对个人使用上做了些优化处理
xm0625
2017-12-22 16:23:22 +08:00
@ZiLong 其实一个 R 和两个 R 可能就是说明是上一个的演进版吧
xm0625
2017-12-22 16:24:47 +08:00
@Thiece udp2raw-tunnel 很有意思, rawsocket 这一手玩的骚啊
forwind
2017-12-22 20:15:11 +08:00
一生平安

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

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

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

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

© 2021 V2EX