很多在用家庭網絡托管網站,以及其他一些內網需要對外公開發布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 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。
[server]
httpPort = 80
websocketPort = 81
domain = '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:3000
zd0b3l-ip-127-0-0-1. realyoudomin is forwarding to localhost:3000
此時,可以使用浏覽器或其他HTTP客戶端訪問HTTP URL。
總結Tunnelmole是一個免費開源的強大的內網發布軟件。可以實現以安全、方便且易于實施的方式將的本地主機暴露給外部網絡,從而提高開發、測試等的便捷性。由開源愛好者編寫和維護,是ngrok的絕佳替代品。