V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
oyyd
V2EX  ›  分享创造

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

  •  1
     
  •   oyyd ·
    oyyd · 2017-12-20 21:50:05 +08:00 · 3135 次点击
    这是一个创建于 2530 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    tcp 代理

    tcp

    或者你想看 gif

    nysocks

    nysocks fast mode

    或者你想看 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 的选择范围变广了。欢迎试用和各种意见。

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