基于 NODE.JS 和 MQTT 开发的新一代高性能内网穿透工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
rockey543400
V2EX    分享创造

基于 NODE.JS 和 MQTT 开发的新一代高性能内网穿透工具

  •  
  •   rockey543400
    rockey2020 2023-05-05 23:12:08 +08:00 3203 次点击
    这是一个创建于 944 天前的主题,其中的信息可能已经有所发展或是发生改变。

    介绍

    Anynat 是一款通用性极强的内网穿透工具,能够适应复杂的内网环境,在较差的网络条件下,仍然能够提供稳定可靠的数据传输.

    安装方式

    1. docker 容器化部署 Anynat(推荐)
    2. npm 安装方式(不推荐)

    *** 阅读本文档之前,会默认您有一定的网络知识,例如如何输入命令,怎样配置和解析域名等,文档不再赘述,自行搜索相关答案 ***

    *** 本文档仅提供 docker 部署方法,如果采用 npm 安装方式,则默认您具有一定的编程知识,需要自行摸索和解决 npm 相关问题 ***

    docker 容器化部署 Anynat

    1. Anynat 需要同时部署服务端和客户端
      1. 服务端是指具有公网 IP 的服务器.例如阿里云,腾讯云的服务器,当然也有一些第三方免费的服务器,需要自行准备
      2. 客户端是指你的内网服务器.例如你的 nas,台式电脑,笔记本或者其他系统平台,需要暴露自己本地的服务给外面的人访问就是客户,需要自行准备
    2. 部署服务端 /客户端之前,建议准备一个干净的系统,只安装 docker 相关的软件依赖
      1. 部署 docker 的教程文档(** 服务端和客户端都需要安装好 docker **):
        1. ubuntu/linux/macos 教程:https://docs.docker.com/engine/install/ubuntu/
        2. windows 教程:https://docs.docker.com/desktop/install/windows-install/
        3. 中文安装教程:https://zhuanlan.zhihu.com/p/441965046
        4. 其他语言的 docker 安装方法自行搜索
    3. 建议提前准备好一个域名,没有域名也没问题,有公网 IP 即可.需要提前将域名开启 HTTPS 并解析到您的服务器公网 IP,推荐使用 cloudflare 作为域名解析平台
    4. 服务端和客户端共用同一份配置文件,如果配置对不上,则无法使用内网穿透服务,每次修改好配置需要重启 Anynat 容器 /重启系统
    5. 点击阅读服务端安装方法
    6. 点击阅读客户端安装方法

    你的下一个内网穿透工具何必是 ngrok,frp,Natapp 呢~~ 感谢支持

    humbass
        1
    humbass  
       2023-05-06 00:11:42 +08:00   1
    Nodejs 写的工具比较少见,必须支持。
    rockey543400
        2
    rockey543400  
    OP
       2023-05-06 04:30:09 +08:00
    @humbass 感谢老铁
    dj721xHiAvbL11n0
        3
    dj721xHiAvbL11n0  
       2023-05-06 08:44:51 +08:00
    第一个 Star
    yaott2020
        4
    yaott2020  
       2023-05-06 08:45:16 +08:00 via Android
    只是一个内网穿透,为啥要 250M 的大小,我为啥不选择只有 10M 的 frp 呢
    gps949
        5
    gps949  
       2023-05-06 08:57:43 +08:00
    这使用的技术栈够新颖
    使用的内网穿透原理方便简介下吗?像 frp 、n2n 、Tailscale 这样大家已经熟悉的产品穿透原理都比较透明,你提到使用了MQTT 又提到全链路使用 CDN 加速,是不是在穿透原理上有些新颖之处?
    jifengg
        6
    jifengg  
       2023-05-06 08:58:17 +08:00
    楼主你好,首先表示支持。
    不知是否有性能方面的相关数据,比如穿透到一台机器上的 nginx ,http 请求相比直接访问 nginx 的对比?
    以及,与 frp 等工具的性能对比?
    不是杠,主要是之前我也用 nodejs 写过 tcp 的穿透,后来发现性能下降很多。
    rockey543400
        7
    rockey543400  
    OP
       2023-05-06 10:43:46 +08:00
    @x2420390517 感谢铁汁

    @yaott2020
    体积是个问题 后续可以精简下 因为我第一版做得比较粗糙些 简单粗暴就把项目直接 copy 进 docker 里面,下一版其实是可以将 build 之后的文件加上项目依赖放进去,这样就会小点,而且我用的基础镜像体积也是大了点


    @gps949
    内网穿透的方法也有好些个,目前只实现了其中一种(精力不太够),我觉得目前最优解的方案是 p2p 穿透+mqtt 作为备选方案最好了.

    目前我用的 mqtt 方案有两种数据传输方式:1.tcp 2.websocket 默认是 tcp 但是我一般选用 2 文档也配置教程也是选用 2

    因为有些 CDN 是不能够直接使用传输层协议,只能用应用层协议也就是如果用 TCP UDP 就用不了 CDN,所以只能折中使用 websocket,这也是能实现全链路( 客户端<==>服务端 服务端<==>用户端 )CDN 加速的主要原因

    而为什么是 MQTT

    因为 MQTT 实现了消息 QoS 控制
    MQTT 定义了三个 QoS 等级,分别为:
    QoS 0 ,最多交付一次。
    QoS 1 ,至少交付一次。
    QoS 2 ,只交付一次
    其中,使用 QoS 0 可能丢失消息,使用 QoS 1 可以保证收到消息,但消息可能重复,使用 QoS 2 可以保证消息既不丢失也不重复。QoS 等级从低到高,不仅意味着消息可靠性的提升,也意味着传输复杂程度的提升

    这个特性在一些网络较差的环境下,仍然能够保障内网穿透可用性,但就是体验会差些

    @jifengg 性能是分多个维度,我这个标题是有点标题党的味道,哈哈哈,性能测试我当时开发是只测了 io 和大文件传输下内存的占用率的的比较,没有分多维度对比,后续看看有没空弄个报告
    humbass
        8
    humbass  
       2023-05-06 11:24:16 +08:00
    @rockey543400 有没有 TG 可以联系下?
    gps949
        9
    gps949  
       2023-05-06 11:24:37 +08:00
    @rockey543400
    那我理解你目前还只是实现了个“内网服务代理”而不是“内网穿透”?
    rockey543400
        10
    rockey543400  
    OP
       2023-05-06 11:42:29 +08:00
    @gps949 是内网穿透 方案不同 距离我最终方案还差点
    @humbass 我的 V2EX 名字就是我的 tg
    suyuyu
        11
    suyuyu  
       2023-05-06 13:41:41 +08:00
    感觉 nodejs 应该不会很高性能
    suyuyu     12
    suyuyu  
       2023-05-06 13:45:27 +08:00
    @suyuyu 忘记狗头了
    star7th
        13
    star7th  
       2023-05-06 14:52:27 +08:00
    我的 内网穿透 搞一下 也是 nodejs 写的

    https://www.gaoyixia.com/
    qwq11
        14
    qwq11  
       2023-05-06 19:13:13 +08:00
    我有个疑惑,这种工具不应该叫做流量中继或者反向代理吗,我理解的内网穿透应该是打洞这种类型的
    atpking
        15
    atpking  
       2023-05-09 15:58:12 +08:00
    好吧 思路完全不同, 我做了一个类似的, 但是出发点完全不同

    我是完全不考虑性能, 而是考虑 0 安装, 随时用 随时走的 产品, 仅依赖 ssh

    主要用来 偶尔上服务器调试设备的时候 临时突破内网限制, 或者调试 第三方 webhook 的时候, 临时接到开发环境

    www.1apm.com 我自己用的很 happy
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1083 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 18:19 PVG 02:19 LAX 10:19 JFK 13:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86