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

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

  •  
  •   rockey543400 ·
    rockey2020 · 350 天前 · 2326 次点击
    这是一个创建于 350 天前的主题,其中的信息可能已经有所发展或是发生改变。

    介绍

    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  
       350 天前   ❤️ 1
    Nodejs 写的工具比较少见,必须支持。
    rockey543400
        2
    rockey543400  
    OP
       350 天前
    @humbass 感谢老铁😘
    x2420390517
        3
    x2420390517  
       349 天前
    第一个 Star
    yaott2020
        4
    yaott2020  
       349 天前 via Android
    只是一个内网穿透,为啥要 250M 的大小,我为啥不选择只有 10M 的 frp 呢
    gps949
        5
    gps949  
       349 天前
    这使用的技术栈够新颖
    使用的内网穿透原理方便简介下吗?像 frp 、n2n 、Tailscale 这样大家已经熟悉的产品穿透原理都比较透明,你提到使用了 MQTT 又提到全链路使用 CDN 加速,是不是在穿透原理上有些新颖之处?
    jifengg
        6
    jifengg  
       349 天前
    楼主你好,首先表示支持。
    不知是否有性能方面的相关数据,比如穿透到一台机器上的 nginx ,http 请求相比直接访问 nginx 的对比?
    以及,与 frp 等工具的性能对比?
    不是杠,主要是之前我也用 nodejs 写过 tcp 的穿透,后来发现性能下降很多。
    rockey543400
        7
    rockey543400  
    OP
       349 天前
    @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  
       349 天前
    @rockey543400 有没有 TG 可以联系下?
    gps949
        9
    gps949  
       349 天前
    @rockey543400
    那我理解你目前还只是实现了个“内网服务代理”而不是“内网穿透”?
    rockey543400
        10
    rockey543400  
    OP
       349 天前
    @gps949 是内网穿透 方案不同 距离我最终方案还差点
    @humbass 我的 V2EX 名字就是我的 tg
    suyuyu
        11
    suyuyu  
       349 天前
    感觉 nodejs 应该不会很高性能
    suyuyu
        12
    suyuyu  
       349 天前
    @suyuyu 忘记狗头了
    star7th
        13
    star7th  
       349 天前
    我的 内网穿透 搞一下 也是 nodejs 写的

    https://www.gaoyixia.com/
    qwq11
        14
    qwq11  
       349 天前
    我有个疑惑,这种工具不应该叫做流量中继或者反向代理吗,我理解的内网穿透应该是打洞这种类型的
    atpking
        15
    atpking  
       346 天前
    好吧 思路完全不同, 我做了一个类似的, 但是出发点完全不同

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

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

    www.1apm.com 我自己用的很 happy
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   930 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:13 · PVG 06:13 · LAX 15:13 · JFK 18:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.