ユースケが NAT に穴を開ける
免責事項: これは、本番環境に対応したチャット アプリケーションではありません。 AES 暗号化接続client <-> client
およびclient <-> server
作成しますが、このコードはセキュリティ専門家によって監査またはテストされていません。これは、私が P2P ネットワーキングとテクノロジについてさらに学び、学習に興味がある他の人に使用されているテクノロジの例をいくつか提供するための単なる演習です。さらに、udp クライアントはメッセージの正常な配信を保証するプロトコルを実装していないため、不安定な接続では一部が失われます。
上の画像をクリックすると、チャット アプリの動作の YouTube ビデオがご覧になれます。右上隅のターミナルは、ランデブー サーバーを実行する VPS に SSH 接続されています。右下の端末が端末UIです。左側の Web アプリは GUI です。
go get github.com/wilfreddenton/udp-hole-punching
メインのパッケージはランデブー サーバーです。 VPS などを見つけてホストします。すべてをローカルで実行できますが、同じマシン上にあるため、ホールパンチが機能するかどうかを実際にテストすることはできません。サーバーの TCP ポートと UDP ポートが 0 ~ 65535 の受信トラフィックに対して開いていることを確認してください。
実行するには:
go install
利用できるUIはWeb UIであるgui
とターミナルUIであるterm-ui
の2つです。 UI は任意に組み合わせて使用できます。
これを使用する前に、 main.go
ファイルを開いて、 serverTCPIP
定数とserverUDPIP
定数をランデブー サーバーの IP アドレス (ポートなし) に切り替える必要があります。
Web UIを実行するには
cd gui/ui
npm install
npm run build
cd ..
go install
gui
、またはgui -serverIP=<server IP here>
localhost:8000
を指定します。切断して新しいチャットを開始するには、更新するだけです。
ターミナル UI を実行するには
cd term-ui
go install
term-ui
ランデブー サーバーがローカルで実行されている場合term-ui -serverIP=<server IP here>
切断して新しいチャットを開始するにはctrl-c
プログラムを終了し、再度実行します。
友人でない場合は、別のルーターの背後にあるコンピューターにアクセスし、そこにクライアントをセットアップします。
クライアントを実行し、一方のクライアントの PeerID をもう一方のクライアントに提供します。ネットワーク トポロジでホール パンチが許可されている場合は、クライアント間に暗号化された接続を確立します。
ID
送信するランデブー サーバーに「確立」リクエストを送信します。ホールパンチの実装をもう少し簡単にするために、クライアントは互いのプライベート IP アドレスへの接続を試行しません。同じ NAT の背後にあるクライアントも引き続き接続できますが、プライベート IP アドレスではなくパブリック IP アドレスを使用して接続します。私がテストしたルーターは、ピアがローカル ネットワーク上にあることを認識しているようで、外部のインターネットにアクセスすることなく接続を容易にしました。