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

2023-05-05 23:12:08 +08:00
 rockey543400

介绍

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 呢~~ 感谢支持🚀🚀🚀

2621 次点击
所在节点    分享创造
15 条回复
humbass
2023-05-06 00:11:42 +08:00
Nodejs 写的工具比较少见,必须支持。
rockey543400
2023-05-06 04:30:09 +08:00
@humbass 感谢老铁😘
dj721xHiAvbL11n0
2023-05-06 08:44:51 +08:00
第一个 Star
yaott2020
2023-05-06 08:45:16 +08:00
只是一个内网穿透,为啥要 250M 的大小,我为啥不选择只有 10M 的 frp 呢
gps949
2023-05-06 08:57:43 +08:00
这使用的技术栈够新颖
使用的内网穿透原理方便简介下吗?像 frp 、n2n 、Tailscale 这样大家已经熟悉的产品穿透原理都比较透明,你提到使用了 MQTT 又提到全链路使用 CDN 加速,是不是在穿透原理上有些新颖之处?
jifengg
2023-05-06 08:58:17 +08:00
楼主你好,首先表示支持。
不知是否有性能方面的相关数据,比如穿透到一台机器上的 nginx ,http 请求相比直接访问 nginx 的对比?
以及,与 frp 等工具的性能对比?
不是杠,主要是之前我也用 nodejs 写过 tcp 的穿透,后来发现性能下降很多。
rockey543400
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
2023-05-06 11:24:16 +08:00
@rockey543400 有没有 TG 可以联系下?
gps949
2023-05-06 11:24:37 +08:00
@rockey543400
那我理解你目前还只是实现了个“内网服务代理”而不是“内网穿透”?
rockey543400
2023-05-06 11:42:29 +08:00
@gps949 是内网穿透 方案不同 距离我最终方案还差点
@humbass 我的 V2EX 名字就是我的 tg
suyuyu
2023-05-06 13:41:41 +08:00
感觉 nodejs 应该不会很高性能
suyuyu
2023-05-06 13:45:27 +08:00
@suyuyu 忘记狗头了
star7th
2023-05-06 14:52:27 +08:00
我的 内网穿透 搞一下 也是 nodejs 写的

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

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

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

www.1apm.com 我自己用的很 happy

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

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

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

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

© 2021 V2EX