web-dev-qa-db-ja.com

SSHトンネル/セッションにUDPホールパンチを使用する方法

週末のコテージにRaspberry Piを配備したい。 Raspberry Piは温度をログに記録し、固定IPを持つリモートサーバーに送信して、データを保存し、シンプルなWebサイトに表示します。

しかし、Raspberry Piで何かを変更したいという状況が発生する可能性があります。たとえば、システムの更新や、サーバーなどにデータを送信するプログラムの変更。

提案された設定では、LANの外からRaspberry Piに接続できません。

注:ネットワークを変更したくなく、既存のルーターは変更しませんポート転送、dynDNSまたはVPNの機能がありません。

最近、UDPホールパンチングについて読みました。基本的な考え方は、クライアントが既知のサーバーアドレスにUDPパッケージを送信する(つまり、パブリックIPまたはdynDNSを有効にする)ことです。クライアントAに接続するクライアントBは、サーバーにクライアントAのパブリックIPとポート番号を要求します。

次に、動的なパブリックIPおよびポートでクライアントAに直接接続できます。クライアントAは現在使用中のポートでサーバーに最初に接続しているため、NATはパッケージをクライアントAに転送します。

多かれ少なかれ、アイデアを正しく要約できればと思います…

これはすべていいように聞こえますが、問題は、TCP接続で動作することが保証されていないことです。これは、ルーターがTCP接続。正しく構築されていない場合、パッケージは転送されません。

それでは、クライアントAがdynDNS、固定パブリックIP、またはポート転送機能を備えたルーターの後ろに座っていない状態で、クライアントBからクライアントAへのSSHセッションを開くにはどうすればよいでしょうか。中央の固定IPアドレスまたはドメイン名を持つサーバーを使用するのは難しいでしょう。

21
Christian

pwnat


"..NATの背後にあるpeerへの接続を開始することは簡単ではありません。"

"..ほとんどすべて[〜#〜] nat [〜#〜]実装インバウンドトラフィックの転送を拒否最新の一致するアウトバウンドリクエストに対応していません。 "


"..pwnatツールはGNU/Linux-only、autonomous NAT traversal.に接続した後のスタンドアロン実装NATの背後にあるサーバー、TCPセマンティクス、でチャネルを確立します= UDPパケットを使用します。NATの背後にあるクライアントとサーバーの両方をサポートします(NATの1つがfake [custom] ICMPメッセージの送信を許可する場合)この実装targets end-users. "


  
使用量:./pwnat <-s | -c> <args> 
 
 -c client mode 
 <args>:[local ip] <local port> <proxy Host> [proxy port(def:2222)] <リモートホスト> <リモートポート> 
 
 -sサーバーモード
 <args>:[ローカルIP] [プロキシポート(def:2222)] [[許可されたホスト]: [許可ポート] ...] 
 
 -6 IPv6を使用
 -vデバッグ出力を表示(最大2)
 -hヘルプを表示して終了
 
例:
 
誰でもプロキシできるサーバー側:
 ./pwnat -s 
 
クライアントがgoogle.com:80:
に接続します。/pwnat-c 8000 <pwnat.server.com> google.com 80 
次に、http:// localhost:8000にアクセスしてGoogleにアクセスします! 
 

pwnat; network signal-flow chart


serverクライアントのIPアドレスを学習するために有効にするための重要なアイデアserverからに定期的にメッセージを送信します固定された既知のIPアドレス。ICMP ECHO REQUESTメッセージを使用してunallocated IP address、 1.2.3.4など1.2.3.4が割り当てられていないため、ICMP REQUEST デフォルトのルートがないルーターではルーティングされません。

「1.2.3.4に送信されたメッセージの結果として、NATは、このリクエストへの応答で、応答のルーティングを有効にします。接続クライアントはそのような応答を偽装します。具体的には、クライアントはTTL_EXPIREDを示すICMPメッセージを送信します。そのようなメッセージは合法的である可能性があります任意のインターネットルーターによって送信され、送信者アドレスがサーバーのターゲットIPと一致するとは想定されていません。 "

"サーバーは(偽の)ICMP応答をリッスンしますおよび受信すると、送信者への接続IP ICMP応答で指定クライアントがグローバルにルーティング可能なIPアドレスを使用している場合、 =これはまったく問題なく、両方のTCPまたはUDPを使用して双方向接続を確立できますclient listens on a pre-agreed port. "

"(事前に合意されたポートがない場合、ポート番号は、ほとんどの場合、ペイロードの一部として通信できます ICMP ECHO RESPONSE)。」


ソース:http://samy.pl/pwnat.pdf
https://github.com/samyk/pwnat

9
voices

ここにいくつかの解決策があります:

Raspberry PiをOpenVPNサーバーに接続するように設定すれば、いつでもそれにアクセスできます。

PageKiteをご覧ください。チェック https://pagekite.net/wiki/Howto/SshOverPageKite/

1
Obay

やや汚いが簡単な解決策ですが、netcatの使用についてはどうですか? Raspberry Piでは、コマンドをループするスクリプトを作成できます。

nc <public_ip> <port1> | sh | nc <public_ip> <port2>  

ローカルホストで、次の操作を行います。

nc -l <port1>

そして:

nc -l <port2>  

最初のインスタンスでコマンドを入力し、2番目のインスタンスで応答を確認できます。

0
Paul