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


21

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

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

提案されたセットアップでは、LANの外部からRaspberry Piに接続できません。

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

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

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

多かれ少なかれ、アイデアを正しく要約したいです…

これはすてきに聞こえますが、問題は、ルーターがTCP接続のハンドシェイクを「理解」できるため、TCP接続で動作するように隔離されておらず、正しく構築されないと転送されないことです。パッケージ。

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


UDPホールパンチングはできるがTCPはできないインターネットに面したデバイスがありますか?より良いNATデバイスを入手してください。
cpt_fink

私はudpでsshを実行していませんが、ここにリンクがありますzarb.org/~gc/html/udp-in-ssh-tunneling.html
barlop

私は知りませんが、私はsshの第一人者に尋ねました、彼らはsshがudpを転送できると言いました、しかしそれがvpnのように振る舞って、それのためのスイッチがある場合のみ、彼はそれ-wが言ったが、彼はtcp上のudpを言ったsshでudpを転送しようとする試みが含まれます)、高遅延などの問題が含まれ、不要になったものを再送信します。それでも試してみるのはまだ面白いことだと思います。ssh経由でこのvpnが表示され、ここでも言及されている-w wiki.archlinux.org/index.php/VPN_over_SSH
barlop

インバウンドポートを開きたくない理由について興味がありますか?-これは、非常に優れたセキュリティを必要とするシナリオのように聞こえません...または、クライアントAに、クライアントBがアクセスできるサーバーへのリバースポートバインドを使用してアウトバウンドSSH接続を維持させることもできます。そうすれば、仲介人サーバー経由で接続できます。しかし、これらの種類のアレンジメントは失敗する傾向があり、そのため、物理的なアクセスが制限されているため、うまくいかない場合はそれを整理するのは望ましくありません。
カバディシャ

回答:


8

pwnat


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

「..ほぼすべてのNAT実装は、最近の一致する発信要求に対応しない着信トラフィックの転送を拒否します。


」..The pwnatツールですGNU / Linuxは-のみ、スタンドアローンの実装自律NATトラバーサルを。接触させた後、NATの背後にあるサーバーを、それが持つチャネルを確立TCPのセマンティクスを、使用してUDPパケットを。これは、両方のサポートNATの背後にあるクライアントとサーバーを(NATのの1が許すならば偽を[カスタム]のICMPメッセージが送信される)。この実装のターゲットがエンドユーザーに。


  
使用法:./pwnat <-s | -c> <引数>

  -cクライアントモード
    <args>:[local ip] <local port> <proxy host> [proxy port(def:2222)] <remote host> <remote port>

  -sサーバーモード
    <args>:[local ip] [proxy port(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;  ネットワーク信号フローチャート


「有効にするためのキーアイデアサーバーを、クライアントのIPアドレスを知るには、ためにあるサーバー定期的に固定され、知られているIPアドレスにメッセージを送信します。最も簡単な方法は、にICMPエコー要求メッセージを使用して、未割り当てのIPアドレスなど1.2.3.4として1.2.3.4が割り当てられていないので、ICMP要求は、デフォルトルートなしでルータによってルーティングされることはありません。

「1.2.3.4に送信されたメッセージの結果、NATはこの要求に応じ応答のルーティングを有効にします。接続クライアントはそのような応答を偽造します。具体的には、クライアントはICMPメッセージを送信しますTTL_EXPIRED。メッセージは、合法的に任意のインターネットルータによって送信することができ、送信元アドレスは、サーバのターゲットIPと一致することが期待されていません。 "

サーバーは(偽の)ICMP応答リッスンし、受信時にICMP応答で指定された送信者IPへの接続を開始します。クライアントがグローバルにルーティング可能なIPアドレスを使用している場合、これはまったく問題なく、TCPまたはUDPの両方を使用できます双方向接続を確立する場合、クライアントがリスニング事前に合意されたポート。

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


出典:http : //samy.pl/pwnat.pdf
https://github.com/samyk/pwnat


pwnatは、localhostからlocalhostへの接続でもほとんど機能しません。いくつかのパケットを送受信できますが、堅牢な接続を確立するにはあまり役に立ちません。
スコット

@Scottまあ、それは興味深いハックですが、実際にはICMPのようなネットワークプロトコルの誤用と悪用に基づく概念実証にすぎません。私はそれに依存しません。古いものでメンテナンスされていないので、使用することはお勧めしません。質問がUDPホールパンチを具体的に規定していなければ、私もそれを言及しませんでした。信頼性が必要な場合は、VPNトンネルを接続します。

私は文句を言っていませんが、「このソリューションは実稼働環境で使用するためのものではありません」は、潜在的に安定したソリューションを探している人にとって有用な情報だと思います。
スコット

@Scottそんな環境で使用するためではありません。独自の製品の多くは、これらの手法を採用しています。とにかく、ここに人々が彼ら自身の決定をするのに十分な情報があります。お勧めしません。しかし、私はVPNトンネルを使用しています。一方、一部のネットワークはVPNトラフィックをフィルタリングするため、ケースバイケースで物事を行う必要があります。NATルーターを経由するのに助けが必要ですか?

現在、リバースsshトンネルを使用して2つのNATされたマシンをリンクする実行可能なソリューションがあります。ただし、静的IPを持っているか、ルーターでポート転送を構成できる「ミドルマン」マシンが必要です。これにより、その仲介者を排除することができたでしょう。しかたがない。
スコット


0

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

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

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

nc -l <port1>

そして:

nc -l <port2>  

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


これは「UDPホールパンチング」と どのように関連していますか?
音声

?これはどのようにNATを通過しますか??
ZEE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.