Chisel を介したクライアント間のポート転送: L3 を使用しない必要最低限​​のトンネル

2 つのデバイスが NAT または厳格なファイアウォールの内側にあり、お互いを直接「見る」ことができない場合、VPN が標準的なソリューションであるようです。しかし、本格的な L3 トンネル (WireGuard や OpenVPN など) は多くの場合冗長です。root 権限が必要で、仮想インターフェイスの設定が必要で、既存のルートと競合する可能性があります。

このような場合、HTTP 上で実行され、データ転送に WebSocket を使用する TCP/UDP トンネルである Chisel を使用すると便利です。このノートでは、中間サーバーを介してあるクライアントから別のクライアントにポートを「転送」する方法を説明します。

それはどのように機能しますか?

状況を想像してください。クライアント A (ホーム サーバーなど)、クライアント B (職場のラップトップ)、およびパブリック IP アドレスを持つ VPS があるとします。クライアント A と B は VPS にアクセスできますが、相互にはアクセスできません。

転送スキームは次のようになります。
1.クライアント A は VPS に接続し、サーバー上で「リバース」ポートを開きます。これで、サーバーのポート X に送信されるすべてのものがクライアント A のポート Y に送信されます。
2.クライアント B は VPS に接続し、ローカル マシンからポート Z をサーバーのポート X に転送します。
3. その結果、クライアント B は localhost:Z にアクセスし、最終的に クライアント A:Y に到達します。

このアプローチは、VPS との通信に L3 層が実装されていない場合、またはクライアント間のルーティングを構成する機能がない場合のソリューションの 1 つです。私たちはアプリケーションとポートのレベルのみで作業します。

ステップ 1: サーバーを起動する

VPS では、Chisel をサーバー モードで実行するだけです。 --reverse フラグは、クライアントがサーバー側でポートを開くことができるようにするために必要です。

chisel server --port 8080 --reverse

ステップ 2: クライアント A (ソース) に接続する

クライアント A がポート 3000 でローカル Web サーバーへのアクセスを開きたいとします。彼は VPS に接続し、「サーバー上のポート 2000 を予約して、それを私に 3000 に転送してください」と言います。

chisel client vps-ip:8080 R:2000:127.0.0.1:3000

これで、VPS のポート 2000 (ループバック インターフェイス上) がクライアント A につながります。

ステップ 3: クライアント B (コンシューマー) の接続

現在、クライアント B はこのリソースにアクセスしたいと考えています。同じ VPS に接続し、ローカル ポート 8080 をサーバーのポート 2000 に転送します。

chisel client vps-ip:8080 8080:127.0.0.1:2000

準備ができて!ここで、クライアント B で http://localhost:8080 を開くと、クライアント A でサービスが実行されていることがわかります。

安全性とニュアンス

Chisel は、--auth フラグによる認証をサポートしています。これは、パブリック サーバーを介して作業する場合に強く推奨されます。 TLS 証明書を使用してトラフィックを暗号化することもできます。

このアプローチの主な利点は、TUN/TAP デバイスや複雑なルーティング テーブルが必要ないことです。これは、WebSocket 接続を介してポートをバインドするという 1 つのことだけを実行する必要最低限​​のトンネルです。 Chisel がポート 443 経由で動作するように設定されている場合、これは企業プロキシ経由でも機能します。

出力

Chisel は、特定のネットワーク タスク用のユーティリティです。本格的な VPN を設定せずに分離されたノード間でポートを転送する必要がある場合、リレー サーバーを介した順方向トンネルと逆方向トンネルの組み合わせが完全に実行可能なソリューションであることがわかります。

リンク

https://github.com/jpillora/chisel