相關資源#
項目地址:https://www.github.com/fscarmen/stun_return
視頻教程:https://youtu.be/nqxA7kFVJi0
Lucky 下載:https://github.com/gdy666/luci-app-lucky/releases
Gost v3 應用下載:https://github.com/go-gost/gost/releases
背景及方案簡介#
在上期 【科學新思路】👏 反向回源之 Gost + Cloudflare Tunnel ,我們介紹了反向 CDN 的原理,以及如何使用 Gost 和 Cloudflare Tunnel 實現反向回源。
本期我們將介紹如何使用 Lucky Stun 插件,配合 Gost ,換另一種玩法,實現 反向 CDN 回源。
什麼是 Lucky?#
Lucky 是一款 OpenWrt 平台的內網穿透工具,功能模塊有 端口轉發、動態域名 (DDNS)、Web 服務、Stun 內網穿透、網絡喚醒、計劃任務、ACME 自動證書、
網絡存儲。它可以幫助你將內網服務暴露到公網,實現全球加速訪問。Lucky Stun 支持多種內網穿透方式,包括 TCP、UDP、HTTP 和 HTTPS,安裝和使用都非常簡單。
項目地址:https://github.com/gdy666/luci-app-lucky
什麼是 Gost?#
Gost (GO Simple Tunnel) v3 是用 GO 語言實現的安全隧道,支持多種網絡協議和代理方式。它的設計目標是提供一個簡單、靈活且高效的網絡代理解決方案。Gost 可以用於構建各種網絡拓撲結構,如正向代理、反向代理、隧道代理等。
項目地址:https://github.com/go-gost/gost
項目文檔:https://gost.run/
STUN 反向回源的優勢#
- 雙棧支持: 同時支持 IPv4 和 IPv6 回源,可以根據需要選擇使用單棧或雙棧模式。
- 無需公網 IP: 通過 STUN 協議實現 NAT 穿透,讓內網設備也能提供服務,工作十分高效。
- 高效轉發: 使用高性能的 GOST v3 作為轉發工具,保證穩定的連接和較低的延遲。
- 輕量運行: 工具依賴少,配置簡單,適合在各種環境下部署。
- ** 靈活配置:** 支持自定義端口、路徑等參數,方便與其他服務集成。
實現原理舉例#
回源到本地的端口是 20000,VPS 的端口是 10000,回源域名是 v4.stun.com,WebSocket 路徑是 /3b451552-e776-45c5-9b98-bde3ab99bf75。
Lucky 使用#
安裝 Lucky#
訪問 https://github.com/gdy666/luci-app-lucky/releases
開通 Cloudflare DDNS 和 Origin Rules API 權限#
訪問 https://dash.cloudflare.com/profile/api-tokens
配置 Lucky DDNS#
配置 Lucky STUN#
從剛才獲取到兩個地址,分別是:
- https://dash.cloudflare.com/api/v4/zones/9e2e0b9615d909773cc9a407f07ea3b5/rulesets/3a0e7a54d59c4be1ba1f528b16da130f
- rules/e06c807701174c43b8c7f9f9240a0969
把它們拼接在一起,中間加 / 分開,形成一個新的地址
修改上面的地址,把 dash 改為 api,而 api 則改為 client,再形成一個正式的 Origin rules 用的 API 地址
接口地址:剛才拼接的 Origin rules 用的 API 地址
請求方法: PATCH
請求頭:
Authorization: Bearer <替換為 API TOKEN>
Content-Type:application/json
請求體 “
{
"expression": "(http.host contains \"<替換為ddns域名>\")",
"action": "route",
"description": "Lucky STUN IPv4 (<替換為ddns域名>)",
"action_parameters": {
"origin": {
"port": #{port}
}
}
}
接口調用成功包含的字符串:
"success": true
配置 STUN 的 Telegram 通知 (可選)#
- 通知需要 TG bot token 和 chat ID,獲取的話可以參照以下貼子: Telegram 獲取機器人令牌和聊天 ID。
- 由於不能直接發信息到 Telegram,所以用 Worker 作轉發,並設置自定義域名
Worker 程序
// 在這裡設置您的Telegram Bot token
const BOT_TOKEN = '<替換為 tg 的 bot token>';
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
// 構建目標URL
const url = new URL(request.url);
const targetUrl = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage${url.search}`;
// 創建新的請求,保持原始請求的方法、頭部和主體
const modifiedRequest = new Request(targetUrl, {
method: request.method,
headers: request.headers,
body: request.body
});
// 發送請求到Telegram API並返回響應
try {
const response = await fetch(modifiedRequest);
// 創建新的響應,複製原始響應的狀態和頭部
const modifiedResponse = new Response(response.body, response);
// 添加CORS頭,如果需要的話
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
return modifiedResponse;
} catch (error) {
return new Response('Error: ' + error.message, { status: 500 });
}
}
接口地址:前面 Worker 的自定義域名
請求方法: POST
請求頭:
Content-Type: application/json
請求體:
{
"chat_id": "<替換為 tg 的 chat ID>",
"text": {
"Device": "Lucky STUN",
"message": {
"time": "#{time}",
"addr": "#{ipAddr}",
"rule name": "#{ruleName}"
}
}
}
接口調用成功包含的字符串:
"ok":true
本地 OpenWRT 運行#
gost -D -L "relay+ws://:20000?path=/3b451552-e776-45c5-9b98-bde3ab99bf75&bind=true"
注意:命令在執行時會佔用前台終端,導致終端被阻塞無法執行其他操作。因此,如果你打算手動執行,建議利用 screen 或類似的終端復用工具。這樣,你可以為該進程分配一個獨立的 screen 會話,使得該進程能夠在後台持續運行,同時你仍然可以自由地訪問並控制,而不會影響到其他終端會話的使用。
命令解析
gost:
-
-D:這個標誌啟用調試模式,提供詳細的日誌以便排除故障。
-
-L "relay+ws://:20000?path=/3b451552-e776-45c5-9b98-bde3ab99bf75&bind=true":這指定了本地監聽的地址和端口,使用 WebSocket 協議。path 參數用於指定 WebSocket 路徑,Relay 服務並開啟了 BIND 功能,採用 UDP-over-TCP 方式。
遠程 VPS 運行#
gost -D -L socks5://[::1]:10000
gost -D -L rtcp://:30000/[::1]:10000 -F "relay+ws://v4.stun.com:80?path=/3b451552-e776-45c5-9b98-bde3ab99bf7&host=v4.stun.com"
命令解析
gost:
-
-D:這個標誌啟用調試模式,提供詳細的日誌以便排除故障。
-
-L socks5://[::1]:10000:這指定了本地監聽的地址和端口,使用 SOCKS5 協議。[::1] 是回環地址,10000 是端口號。
-
-L relay+rtcp://:30000/[::1]:10000:這指定了本地監聽的地址和端口,使用 RTCP 協議。30000 是本地端口(如家裡或者公司使用的軟路由),[::1]:10000 是遠程地址和端口 (VPS 端)。
-
-F "ws://v4.stun.com:80?path=/3b451552-e776-45c5-9b98-bde3ab99bf7&host=v4.stun.com":這指定了轉發地址,使用 WebSocket 協議。path 和 host 參數用於指定 WebSocket 路徑和主機。
項目一鍵腳本部署#
交互式安裝#
服務端和客戶端均使用
bash <(wget -qO- https://raw.githubusercontent.com/fscarmen/stun_return/main/stun_return.sh)
快捷參數安裝#
安裝服務端
bash <(wget -qO- https://raw.githubusercontent.com/fscarmen/stun_return/main/stun_return.sh) \
-s \ # 安裝服務端
-p server-origin-port \ # 指定本地服務的端口
-w your-ws-path \ # 指定 WebSocket 路徑(用於與回源域名通信)
-4 your-IPv4-domain.com \ # IPv4回源域名
-6 your-IPv6-domain.com \ # IPv6回源域名
客戶端安裝
bash <(wget -qO- https://raw.githubusercontent.com/fscarmen/stun_return/main/stun_return.sh) \
-c \ # 安裝服務端
-w your-ws-path \ # 指定 WebSocket 路徑(用於與回源域名通信)
-4 your-IPv4-domain.com \ # IPv4回源域名
-r your-IPv4-return-port \ # IPv4回源端口
-6 your-IPv6-domain.com \ # IPv6回源域名
-e your-IPv6-return-port # IPv6回源端口
卸載方法
bash <(wget -qO- https://raw.githubusercontent.com/fscarmen/stun_return/main/stun_return.sh) -u
更多參數請參照項目 README.md: https://www.github.com/fscarmen/stun_return
部署運行截圖#
服務端(本地軟路由)#
- 部署在軟路由
客戶端(VPS)#
- 部署在 VPS
應用設置(代理軟件)#
參考內容#
- Lucky 動態域名 (DDNS): https://lucky666.cn/docs/modules/ddns
- Lucky STUN 內網穿透: https://lucky666.cn/docs/modules/stun
- Gost v3 轉發鏈: https://gost.run/tutorials/port-forwarding/#_5