私の質問で議論したように、質問はこの点に到達します:
UDPホールパンチング技術を介してTCP接続を確立できますか?
ファイアウォールの背後にあるSSHサーバーに接続するために、OpenSSHのリバーストンネル機能を使用しています。
これで、server-behind-firewall
を発行して、ssh me@my-known-server -p 12345
マシンに接続できます。
このようにして、my-laptop
のすべてのトラフィックはmy-known-server
にルーティングされ、my-known-server
はこのトラフィックをserver-behind-firewall
マシンにルーティングします。これは非効率的だと思います。
私が探しているのは、同じ機能を提供するが、bittorrentの手法を使用する手法です(つまり、ピアはmy-known-server
(トラッカー)へのUDP接続を作成し、パケットを相互に直接送信します)
この機能を実現する方法はありますか?
BitTorrent接続は、「UDPホールパンチング」技術を介して作成されます。
どうやら私が探していたのは、NATトラバーサル技術を使用するソフトウェアのように、「Hamachi」を介してSSH接続を確立することです。
ssh-p2pはあなたがやろうとしていたことを正確に行い、は直接を作成しますトランスポートとしてRTCDataChannel/WebRTCを使用するピアツーピアssh接続(ICE NAT穴あけにトランスバーサルを使用)。
クライアントまたはサーバーのいずれかが本当に制限されたネットワーク内にある場合、直接接続は失敗します。通常、ピアツーピア接続はプロキシサーバーを使用するためにフォールバックします(RTC TURNサーバーの場合))が、ssh-p2p 直接接続が不可能な場合、失敗します。
したがって、ssh-p2p が接続に失敗する場合、プロキシサーバーを使用する必要があります。説明した「リバースプロキシ」方式を使用することも、サードパーティのプロキシを ngrok または serveo として使用することもできます。
あなたの質問に答えるために、SSHはUDPではなくTCPベースのプロトコルであるため、最初にこのような機能はないと確信しています。
ゲートウェイの背後にあるホストに到達するための標準的な方法は、~/.ssh/config
ファイルでProxyCommand
オプションを使用することです。
トンネルについては別の場所で説明しています ただし、基本的には、次の機能として機能できるリモートホストへのTCP:22接続を開くコマンドを指定するだけで、プロキシを介してSSHを「ホップ」できます。 SSHホップ。 (多くの場合、必要なプロキシは1つだけです。)
たとえば、質問で言及したホスト名を使用して、my-laptop
の.ssh/configファイルに次を追加できます。
Host server-behind-firewall
ProxyCommand ssh -xaqW%h:22 my-known-server
次に、server-behind-firewall
にsshすると、ラップトップのsshクライアントがmy-known-server
への接続を確立します。これにより、ファイアウォールで保護されたサーバーへの接続が確立され、トラフィックがプロキシされます。これは、my-known-server
にSSHアカウントがあることを意味します。プロキシはおそらくデータを管理する最も効率的な方法ではありませんが、これは安全で、十分に文書化されており、この種の接続を確立するための受け入れられた方法です。
「UDP接続をピアリング[作成]し、パケットを相互に直接送信する」という考え方は、マシンが実際に相互に直接接続できる場合にのみ機能します。ファイアウォールで保護されたマシンには直接到達できないため、到達する唯一の方法は、ゲートウェイ上のプロキシを経由することです。
ファイアウォールで保護されたサーバーがNATを使用して外部に到達するネットワーク上にある場合、サーバーがファイアウォールをバイパスするために外部の場所への独自の独立した接続を確立する可能性があります。ただし、注意してください。ネットワーク管理者はファイアウォールバイパス戦略を非常に真剣に受け止めています。物事へのアクセスを維持するには、ネットワーク管理者と協力して解決策を見つける必要があります。それらの周りではありません。
pwnat
というツールを使用して、サードパーティのサーバー(トラッカーなど)がなくてもこれを行う方法があるようです。
詳細については、 このスーパーユーザーの投稿 または pwnat github page および publication を参照してください。