fscarmen

fscarmen

【科學新思路】💡反向回源之 Gost + Lucky STUN

相關資源#

項目地址: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 回源。

image

什麼是 Lucky?#

Lucky 是一款 OpenWrt 平台的內網穿透工具,功能模塊有 端口轉發、動態域名 (DDNS)、Web 服務、Stun 內網穿透、網絡喚醒、計劃任務、ACME 自動證書、
網絡存儲。它可以幫助你將內網服務暴露到公網,實現全球加速訪問。Lucky Stun 支持多種內網穿透方式,包括 TCP、UDP、HTTP 和 HTTPS,安裝和使用都非常簡單。

項目地址:https://github.com/gdy666/luci-app-lucky

項目文檔:https://lucky666.cn//

什麼是 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
image
image
image

開通 Cloudflare DDNS 和 Origin Rules API 權限#

訪問 https://dash.cloudflare.com/profile/api-tokens
image
image
image
image

配置 Lucky DDNS#

image
image
image
image
image
image

配置 Lucky STUN#

image
image
image
image
image

從剛才獲取到兩個地址,分別是:

把它們拼接在一起,中間加 / 分開,形成一個新的地址

修改上面的地址,把 dash 改為 api,而 api 則改為 client,再形成一個正式的 Origin rules 用的 API 地址

image
image
image
image

接口地址:剛才拼接的 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 作轉發,並設置自定義域名

image
image
image
image

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

部署運行截圖#

服務端(本地軟路由)#

  • 部署在軟路由
    image
    image

客戶端(VPS)#

  • 部署在 VPS
    image

應用設置(代理軟件)#

  • image

參考內容#

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。