很多在用家庭网络托管网站,以及其他一些内网需要对外公开发布Webhooks的同学可能都用过ngrok。今天虫虫给大家推荐一个类似的开源软件Tunnelmole,是一个免费开源的ngrok软件的平替代,大家可以尝试并使用。 概述Tunnelmole是一个免费且开源的内网隧道软件。与其他一些 ngrok 替代方案不同,Tunnelmole不是使用SSH端口转发,无需NAT/网络配置,并且无需在服务器上运行任何内容就可以使用(当然,也可以完全自建托管自己的Tunnelomole 服务)。 基本演示下面动图演示设置了一个通往本地运行的tunnelmole 网站的公共URL隧道 安装Tunnelmole支持跨平台安装,可以在Linux、Mac、Windows都可以安装: 在Linux,Mac,Windows Cygwin或者Mingw用户可以直接使用其安装脚本一键安装: curl -O install.tunnelmole[dotcom]/n3d5g/install && sudo bash install 安装脚本将自动检测操作系统并安装对应系统的适合的版本。 对于支持NodeJS 16.10或更高版本的环境,可以通过npm包管理器来安装: sudo npm install -g tunnelmole window用户,可以下载使用tmole[.exe]包,然后添加系统PATH路径即可。 使用安装后,可以通过执行tmole命令来确保已经正确安装。 如果遇到错误并且系统曾经安装过npm,则可能安装了旧版本的Node,但是版本低于16.10,则需要检查NodeJS版本 安装正确后,tunnelmole使用非常简单,只需启动本地需要对外发布的Web应用程序并且记下其监听的端口号,然后运行tmole <port number>, <port number>为本地启动Web应用的监听端口,比如8080,则启动tunnelmole代理: 则,可以使用下面提供的URL在公网访问该服务。注意子域名也可以指定为一个固定的: tmole 8080 as <yourdomain>.tunnelmole[dot]net 只需确保<yourdomain>名称为独特的地址即可,注意tunnelmole[dot]net定制化子域名需要定制才能使用。 Tunnelmole开发要使用Tunnelmole用作项目的一类,需要项目使用Node 16.10或更高版本。 添加依赖npm install --save tunnelmole 代码中启动tunnelmole首次导入tunnelmole。ES和CommonJS模块均受支持。 import { tunnelmole } from 'tunnelmole'; const tunnelmole = require('tunnelmole/cjs'); 导入模块后,可以使用以下代码启动tunnelmole,将端口3000可自定义为应用程序侦听的端口。 const url = await tunnelmole({ Tunnelmole将在后台启动,可以在控制台日志中看到类似于Tunnelmole命令行应用程序的输出,其中将包括现在指向应用程序的公共URL。 函数是async异步执行并且不会阻止其余代码的执行。 const url = await tunnelmole({ domain: '< tunnelmole subdomain>' // url = subdomain.tunnelmole[dot]net 自托管作为一个开源的软件,最大的优势就是可以在本地计算机上运行客户端和服务器(换句话说,localhost将“隧道”到localhost)。这将使解决任何配置问题或错误变得更加容易,将能够使用最喜欢的IDE或NodeJS调试器等工具。 对代码进行任何类型的更改时,始终首先在本地运行客户端和服务,以便可以利用内置的开发人员生产力功能,例如热重载和调试器配置。 启动tunnelmole-service和npm start。 该服务需要运行,因为客户端将在启动时启动Websocket连接,并且会失败并显示ECONNREFUSED如果无法连接则报错。 按照说明设置Tunnelmole客户端。一键脚本下载的预构建二进制文其地址被硬编码到为tunnelmole[dot]com的Tunnelmole服务,并且无法更改。 所以自托管版本的客户端,必须使用源码安装tunnelmole-client 可以clone Github tunnelmole-service仓库源码,修改config-instance.toml中的以下部分的ws://部分: endpoint: "ws://localhost:8080" export default instanceConfig node dist/src/index.js <port number to forward to>。 Sending initialise message zd0b3l-ip-127-0-0-1.localhost is forwarding to localhost:3000 zd0b3l-ip-127-0-0-1.localhost is forwarding to localhost:3000 127.0.0.1 zd0b3l-ip-127-0-0-1.localhost 将域名替换为域名中显示的域名tunnelmole-client输出。 如果需要自定义域或其他“高级”功能,则需要将API密钥添加到src/authentication/apiKeys.json。 然后可以运行 node dist/src/index.js --set-api-key <your api key>。 然后运行例如 node dist/src/index.js <port number> as mydomain.localhost获取自定义子域。 使用真实子域名首先,确保编译的代码是最新的,即 npm run build 上传副本 tunnelmole-service到服务器。 打开config-instance.toml并进行个性化域名修改(同上)并选择一个比默认更好的监控密码,即changeme。 启动服务node dist/srv/index.js。 完成后,更新tunnelmole-client的config-instance.ts将其地址指向真实的服务器域名和端口。 endpoint: "wss://realyoudomin:81" export default instanceConfig; npm run build && node dist/src/index.js 3000 zd0b3l-ip-127-0-0-1. realyoudomin is forwarding to localhost:3000 zd0b3l-ip-127-0-0-1. realyoudomin is forwarding to localhost:3000 此时,可以使用浏览器或其他HTTP客户端访问HTTP URL。 总结Tunnelmole是一个免费开源的强大的内网发布软件。可以实现以安全、方便且易于实施的方式将的本地主机暴露给外部网络,从而提高开发、测试等的便捷性。由开源爱好者编写和维护,是ngrok的绝佳替代品。 |