プログラミング
Gonc – P2P NATトラバーサル対応のNetcat
Gonc – Netcat with P2P Nat Traversal (github.com)
要約
Goncは、NATトラバーサル機能を備えたGolangベースのNetcatツールです。パスフレーズを共有するだけで、複雑な設定なしにP2P接続を自動で確立できます。TLS/DTLSによるエンドツーエンド暗号化や相互認証もサポートしており、リモートシェル、SOCKS5プロキシ、HTTPファイルサーバーなど、柔軟なサービス設定が可能です。
全文翻訳
gonc README の紹介 (中文、English)
gonc は、ピアツーピア通信を容易にするために設計された Golang ベースの netcat ツールです。主な機能は以下の通りです。
🔁 自動NATトラバーサル: 設定不要。両方のサイドはパスフレーズに合意するだけで済みます。 -p2p パラメータを使用することで、ピアはアドレス交換のために公開されている STUN および MQTT サービスを活用し、互いのネットワークアドレスを自動的に検出し、NATトラバーサルを通じてポイントツーポイント接続を確立できます。
🔒 相互認証付きエンドツーエンド暗号化: TCP 用に TLS、UDP 用に DTLS による暗号化された伝送をサポートし、パスフレーズベースの相互ID認証を備えています。
🧩 柔軟なサービス設定: -e パラメータを使用すると、各接続にサービスを提供するアプリケーションを柔軟に設定できます。例えば、-e /bin/sh はリモートの cmd シェルを提供できます。便利な SOCKS5 サービス、HTTP ファイルサービス、トラフィック転送のために、組み込みの仮想コマンドを使用することもできます。
最新バージョンのダウンロード
ドキュメント
関連プロジェクト
gonc-gui — gonc をベースにしたデスクトップ (Windows) および Android アプリ: デバイス間、ネットワーク間のP2P直接接続とセキュアなファイル転送を便利に行えます。コマンドラインは不要で、パスフレーズを共有する(またはQRコードをスキャンする)だけです。
使用例
基本使用法
nc のように使用します:
gonc www.baidu.com 80
gonc -tls www.baidu.com 443
IPアドレスとポートに基づいたポイントツーポイント接続を確立できます。現在では、共有パスフレーズに基づいたポイントツーポイント接続も可能で、自動NATトラバーサルを備えています。以下の図は、ホームブロードバンドネットワーク (ハードNAT) とモバイルネットワーク (シンメトリックNAT) 上のピアとの間で gonc が P2P 接続を確立するプロセスを示しています。両方のサイドが IPv6 を持っているため、NATトラバーサルを実証するために両方のエンドで -4 オプションを使用して IPv4 を強制しています。
P2PトンネルとHTTPファイルサーバー
両方のサイドは同じパスフレーズに合意します。送信側では、共有したいファイルやディレクトリを公開するために HTTP ファイルサーバーを起動します。 -httpserver オプションは複数のパスを受け入れ、それぞれが単一のファイルまたはディレクトリになります:
gonc -p2p <パスフレーズ> -httpserver c:/RootDir1 c:/RootDir2
受信側には 2 つのオプションがあります:
ディレクトリ全体を自動ダウンロード
以下のコマンドを実行すると、すべてのファイルが再帰的にローカルマシンにダウンロードされます。プロセスが中断された場合、コマンドを再実行すると中断したところから自動的に再開されます:
gonc -p2p <パスフレーズ> -download c:/SavePath
ブラウザ経由で選択的にダウンロードして閲覧
このオプションは自動的にダウンロードを開始しません。代わりに、ブラウザを手動で開き http://127.0.0.1:9999 にアクセスして、ピアのファイルリストを表示し、必要に応じてファイルをダウンロードする必要があります:
gonc -p2p <パスフレーズ> -httplocal-port 9999
特定のサブディレクトリをダウンロードする必要がある場合、ブラウザは不便ですが、次のように行うことができます:
gonc -http-download c:/SavePath http://127.0.0.1:9999/subdir
セキュアな暗号化P2P通信
パスフレーズに合意することで、2つの異なるネットワーク間でセキュアな暗号化P2P通信を確立します (高エントロピーのパスフレーズを生成するには gonc -psk . を使用し、passphrase を置き換えてください)。このパスフレーズは、相互検出と証明書導出に使用され、TLS 1.3 による通信セキュリティを保証します。
gonc -p2p passphrase
反対側では、同じパラメータを使用します (プログラムは自動的に TCP または UDP 通信を試行し (TCP が優先)、ロール (TLS クライアント/サーバー) をネゴシエートし、TLS プロトコルを完了します):
gonc -p2p passphrase
注意: 他方のエンドが実行時間を遅らせた場合、約半分の時間内に相互作用する情報を見つけられないと終了します。したがって、MQTT メッセージサブスクリプションに基づいた待機メカニズムもサポートしており、-mqtt-wait および -mqtt-hello を使用して、両当事者の P2P 開始タイミングを同期させます。例えば、以下は継続的に待機するために -mqtt-wait を使用しています:
gonc -p2p passphrase -mqtt-wait
反対側では:
gonc -p2p passphrase -mqtt-hello
NATタイプを確認する
gonc -nat-checker
これにより、IPv6 および IPv4 TCP および UDP NAT アドレスを確認し、NAT 後のポート変更を分析します。TCP6 または UDP6 アドレスがリストされていない場合、IPv6 がないことを意味します。各プロトコルアドレスは "(easy)" で終わっており、ホールパンチングの成功率が最も高いことを示しています。"(hard)" は成功率が高いことを示し、"(symm)" は最も困難です。Symm の場合、P2P が機能するには、相手方が "easy" または "hard" である必要があります。
リバースシェル (UNIXライクシステム向けの疑似端末サポート)
リスナー ( -keep-open は使用せず、1つの接続のみを受け入れます。-psk なしでの認証はありません):
gonc -tls -exec ":sh /bin/bash" -l 1234
シェルを取得するために接続します (TAB、Ctrl+C などに対応):
gonc -tls -pty x.x.x.x 1234
P2P をリバースシェルに使用します (パスフレーズは認証に使用され、TLS 1.3 によるセキュアな通信を保証します):
gonc -exec ":sh /bin/bash" -p2p passphrase
反対側:
gonc -pty -p2p passphrase
伝送速度テスト
データを送信し、伝送速度を測定します (組み込みの /dev/zero および /dev/urandom):
gonc.exe -send /dev/zero -P x.x.x.x 1234
例の出力:
IN: 76.8 MiB (80543744 バイト), 3.3 MiB/s | OUT: 0.0 B (0 バイト), 0.0 B/s | 00:00:23
受信側:
gonc -P -l 1234 > NUL
P2PトンネルとSOCKS5 / HTTPプロキシ
トンネルが確立されるのを待ちます:
gonc -p2p passphrase -linkagent
反対側では、リモートネットワークにアクセスするためにポート 3080 でローカル SOCKS5 / HTTP プロキシサービスを開始します:
# link オプションは、ローカルおよびリモートのプロキシエンドポイントがどのように作成されるかを制御します。
# リスニングポートが開かれないことを示すために none を使用します:
gonc -p2p passphrase -link "3080;none"
次に、例えばリモートネットワークの 10.0.0.1:3389 に接続したい場合、ローカルリモートデスクトップクライアントに次のアドレスを入力するだけです:
10.0.0.1-3389.gonc.cc:3080
このドメインは 127.b.c.d の形式の IP に解決されます。結果として、リモートデスクトップクライアントはポート 3080 のローカル SOCKS5 プロキシに接続し、その後 gonc は 127.b.c.d アドレスを逆解析して、ドメイン名から 10.0.0.1-3389 の情報を抽出します。
link 設定フォーマット
# 確立されたトンネルに基づき、ローカルとリモートの両方のサイドがポート 1080 でリッスンします。
# プロキシは HTTP と SOCKS5 の両方のプロトコルをサポートし、透過プロキシ機能が有効になっています。
gonc -p2p <パスフレーズ> -link "1080;1080"
# 以下は URL フォーマットの設定方法です。-link のパラメータ値は引用符で囲む必要があります。そうしないと、解析の問題が発生する可能性があります。
# 左側の x://0.0.0.0:1080?tproxy=1 は、単に 1080 と書くのと同じです。
# 右側は、透過プロキシサポートなしで、リモートホストでポート 1080 を有効にします。
gonc -p2p <パスフレーズ> -link "x://0.0.0.0:1080?tproxy=1;x://127.0.0.1:1080"
# 左側の f://127.0.0.1:1080?to=1.2.3.4:80
# は、ローカルでポート 1080 でリッスンし、リモート側の 1.2.3.4:80 にトラフィックを転送することを意味します。
# 右側の 'none' は、リモートでポートが開かれないことを示します。
gonc -p2p <パスフレーズ> -link "f://127.0.0.1:1080?to=1.2.3.4:80;none"
# 右側の f://0.0.0.0:80?to=127.0.0.1:80
# は、リモート側でポート 80 でリッスンし、ローカルの 127.0.0.1:80 にトラフィックを転送することを意味します。
gonc -p2p <パスフレーズ> -link "none;f://0.0.0.0:80?to=127.0.0.1:80"
# 左側の x+tls は TLS 暗号化付きのプロキシプロトコルを意味し、証明書設定が可能です。右側は `outbound_bind` を介してアウトバウンド IP アドレスを指定します (マルチIP環境に適しています)。
gonc -p2p <口令> -link "x+tls://user:pass@0.0.0.0:1080?cert=ca.pem&key=key.pem;none?outbound_bind=10.0.0.5"
柔軟なサービス設定
-exec を使用して、各接続にサービスを提供するアプリケーションを柔軟に設定できます。例えば、シェルコマンドに /bin/bash を指定する代わりに、ポートフォワーディングにも使用できます。ただし、以下の例では接続ごとに新しい gonc プロセスを開始します:
gonc -keep-open -exec "gonc -tls www.baidu.com 443" -l 8000
複数の子プロセスを生成するのを避けるには、組み込みの nc モジュールを使用します:
gonc -keep-open -exec ":nc -tls www.baidu.com 443" -l 8000
Socks5 プロキシ