Tunnelmole——ngrok的开源替代品

安全运维得看我 2024-03-21 13:37:54

很多在用家庭网络托管网站,以及其他一些内网需要对外公开发布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命令来确保已经正确安装。

tmole

该命令会打印帮助,而无任何报错的话,则安装正确。

如果遇到错误并且系统曾经安装过npm,则可能安装了旧版本的Node,但是版本低于16.10,则需要检查NodeJS版本

node -version

确保其版本为16.10及更新版本后重新安装解决。

安装正确后,tunnelmole使用非常简单,只需启动本地需要对外发布的Web应用程序并且记下其监听的端口号,然后运行tmole <port number>,

<port number>为本地启动Web应用的监听端口,比如8080,则启动tunnelmole代理:

tmole 8080

则,可以使用下面提供的URL在公网访问该服务。注意子域名也可以指定为一个固定的:

tmole 8080 as <yourdomain>.tunnelmole[dot]net

只需确保<yourdomain>名称为独特的地址即可,注意tunnelmole[dot]net定制化子域名需要定制才能使用。

Tunnelmole开发

要使用Tunnelmole用作项目的一类,需要项目使用Node 16.10或更高版本。

添加依赖

添加Tunnelmole作为依赖项:

npm install --save tunnelmole代码中启动tunnelmole

首次导入tunnelmole。ES和CommonJS模块均受支持。

ES模块:

import { tunnelmole } from 'tunnelmole';

CommonJS模块:

const tunnelmole = require('tunnelmole/cjs');

导入模块后,可以使用以下代码启动tunnelmole,将端口3000可自定义为应用程序侦听的端口。

const url = await tunnelmole({port: 3000});

Tunnelmole将在后台启动,可以在控制台日志中看到类似于Tunnelmole命令行应用程序的输出,其中将包括现在指向的应用程序的公共URL。 函数是async异步执行并且不会阻止其余代码的执行。

如果想使用自定义子域,可以将域作为选项传递。

const url = await tunnelmole({port: 3000,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://部分:

const instanceConfig = {hostip: {endpoint: "ws://localhost:8080"},runtime: {debug: true,enableLogging: true}}export default instanceConfig

完成后编译客户端

npm run build

然后调用客户端

node dist/src/index.js <port number to forward to>

会看到类似的输出:

Sending initialise messagezd0b3l-ip-127-0-0-1.localhost is forwarding to localhost:3000zd0b3l-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。

[server]httpPort = 80websocketPort = 81domain = 'realyoudomin'password = '********'

启动服务node dist/srv/index.js。

如果一切顺利,服务将正常启动。

完成后,更新tunnelmole-client的config-instance.ts将其地址指向真实的服务器域名和端口。

const instanceConfig = {hostip: {endpoint: "wss://realyoudomin:81"},runtime: {debug: false,enableLogging: true}}export default instanceConfig;

然后,重建并运行客户端,如下所示:

npm run build && node dist/src/index.js 3000

现在将看到服务器域的输出

zd0b3l-ip-127-0-0-1. realyoudomin is forwarding to localhost:3000zd0b3l-ip-127-0-0-1. realyoudomin is forwarding to localhost:3000

此时,可以使用浏览器或其他HTTP客户端访问HTTP URL。

总结

Tunnelmole是一个免费开源的强大的内网发布软件。可以实现以安全、方便且易于实施的方式将的本地主机暴露给外部网络,从而提高开发、测试等的便捷性。由开源爱好者编写和维护,是ngrok的绝佳替代品。

0 阅读:5

安全运维得看我

简介:感谢大家的关注