関連リソース#
プロジェクトアドレス: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
プロジェクトドキュメント: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
Cloudflare DDNS と Origin Rules API 権限の開通#
アクセス:https://dash.cloudflare.com/profile/api-tokens
Lucky DDNS の設定#
Lucky STUN の設定#
先ほど取得した 2 つのアドレスは次のとおりです:
- 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 ボットトークンとチャット ID が必要で、取得方法は以下の投稿を参照してください:Telegram でボットトークンとチャット ID を取得する。
- Telegram に直接メッセージを送信できないため、Worker を使用して転送し、カスタムドメインを設定します。
Worker プログラム
// ここにあなたのTelegramボットトークンを設定します
const BOT_TOKEN = '<tgのボットトークンに置き換え>';
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のチャット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