SSHトンネルを介したUDPトラフィック


66

タイトルはほとんどそれを要約しています。SSHトンネルを介してUDPトラフィックを送信したいと思います。具体的には、トンネルを介してUDPパケットを送信し、サーバーがそれらを相手側に返送できるようにする必要があります。TCP接続でそれを行う方法を知っています。これはUDPで可能ですか?

回答:


36

この小さなガイドでは、ほとんどのUNIXライクなオペレーティングシステムに標準装備されているツール(ssh、nc、mkfifo)を使用して、SSH経由でUDPトラフィックを送信する方法を説明します。

SSH接続を介したUDPトンネリングの実行

ステップバイステップSSH接続でTCP転送ポートを開く

ローカルマシン(ローカル)で、追加の-Lオプションを使用してSSHで遠隔マシン(サーバー)に接続し、TCPポートフォワードを使用したSSHを実行します。

local# ssh -L 6667:localhost:6667 server.foo.com

これにより、ローカルマシンのポート番号6667のTCP接続が、安全なチャネルを通じてserver.foo.comのポート番号6667に転送されます。サーバーでTCPからUDPへの転送をセットアップする

サーバーで、TCPポート6667でリスナーを開き、指定されたIPのUDPポート53にデータを転送します。私のようなDNS転送を行いたい場合は、/ etc / resolv.confにある最初のネームサーバーのIPを取得できます。ただし、最初にfifoを作成する必要があります。fifoは、2つのチャネル間で双方向通信を行うために必要です。単純なシェルパイプは、左プロセスの標準出力と右プロセスの標準入力のみを通信します。

server# mkfifo /tmp/fifo
server# nc -l -p 6667 < /tmp/fifo | nc -u 192.168.1.1 53 > /tmp/fifo

これにより、サーバーのポート6667のTCPトラフィックが192.168.1.1のポート53のUDPトラフィックに転送され、応答が返されます。マシンでUDPからTCPへの転送を設定します

ここで、ローカルマシンの上部で行われたものと反対のことを行う必要があります。UDPポート53をバインドするには、特権アクセスが必要です。

local# mkfifo /tmp/fifo
local# sudo nc -l -u -p 53 < /tmp/fifo | nc localhost 6667 > /tmp/fifo

これにより、ローカルマシンのポート53のUDPトラフィックがローカルマシンのポート6667のTCPトラフィックに転送されます。ローカルDNSサーバーをお楽しみください:)

ご想像のとおり、ローカルマシン(ローカルUDPポート53など)でDNSクエリが実行されると、ローカルTCPポート6667、サーバーのTCPポート6667、サーバーのDNSサーバーの順に転送されます。 、192.168.1.1のUDPポート53。ローカルマシンでDNSサービスを利用するには、/ etc / resolv.confの最初のネームサーバーとして次の行を追加します。

nameserver 127.0.0.1

28
この解決策は安全ではありません。TCPストリームはメッセージの境界を保持することが保証されていないため、単一のUDPデータグラムが部分的に分割され、プロトコルが破損する場合があります。
ジュホオスマン

2
また、IRCが使用する6667(man SSHの例から)の代わりにポート1153を使用するのも良いでしょう。
フィルピロシコフ

1
@JuhoÖstmanこの落とし穴を指摘してくれてありがとう。問題に気づいて...あなたは解決策を実行しましたか?十分に小さいメッセージが機能する可能性を高める方法でしょうか?
humanityANDpeace

4
解決策は、TCPストリームを介して送信される前に各パケットに長さを追加し、そこから元のパケットを再構築することです。そのためのCスクリプトを作成するのは簡単ですが、すぐに利用できるソリューションが存在するかどうかはわかりません。実際には、この場合、TCPは通常メッセージ境界を保持しているように見えますが、いつでも奇妙な障害が発生する可能性があります。
ジュホオスマン

私はこれに関して別の問題に直面しました:パイプとfifoがバッファリングされるため、フレーム境界が失われます。したがって、多くのUDPフレームを1つのTCPフレームに連結できます。
フリオ・ゲラ

26

この(Johnの答えは別の場所で同じことを指していると思います)は、TCP / SSH接続を介して別のマシンのUDP / DNSサービスにアクセスする方法を説明します。

ローカルUDP / 53トラフィックをTCPに転送してから、SSHのポート転送メカニズムを使用してTCPトラフィックを他のマシンに転送し、次にTCPを相手側のUDP / 53に転送します。
通常、openvpnを使用して実行できます。
ただし、ここでは、opensshとnetcatのみを使用して、よりシンプルなツールを使用します。

そのページの最後に、「socat」への参照を含む別のコメントがあります
。同じUDP / DNSアクセスが行われ、

サーバー側:socat tcp4-listen:5353,reuseaddr,fork UDP:nameserver:53
クライアント側:socat udp4-listen:53,reuseaddr,fork tcp:localhost:5353

詳細については、socatの例を参照してください。


3
これは、受け入れられた答えよりも私にとってはるかに便利なようです。ビデオストリームの単方向リダイレクト(TS / UDP)が必要でした ssh orig_strm_src socat udp4-listen:4003,reuseaddr,fork STDOUT| socat STDIN udp-sendto:localhost:4003
...-nhed

FWIW、ホームページで、UDP転送用にSSH経由でsocatをセットアップする方法を説明するより詳細なガイドを作成しました。例としてSNMPを使用します。
ピーターV.モーヒ

20

SSH(少なくともOpenSSH)はシンプルなVPNをサポートしています。クライアントで-wまたはTunnelオプションを使用すると、両端でデバイスをssh作成できますtun。これを使用して、あらゆる種類のIPトラフィックを転送できます。(Tunnelのマニュアルページも参照してくださいssh_config(5)。)これには、両端にOpenSSH(およびおそらくルート権限)が必要であることに注意してください。


これには、非特権ポートのUDPトンネリングやPermitRootLoginが「no」に設定されていない場合でも、リモートマシンのルート特権が必要です。残念な。
フィルピロシコフ

@grawity philpirozhkovが指摘したように、必要なルートログインである場合でも、このオプションを指摘していただきありがとうございます。ルートを必要としないようにそれをだます方法があるのだろうか?
humanityANDpeace

4
@humanityANDpeace:を使用して、tun / tapデバイスを事前作成し、特定のユーザーが所有させることができますip tuntap add
荒廃

こんにちは@grawity。私はあなたのソリューションが好きですが、それを機能させることはできません。tun次のようにデバイスを事前に作成しました。sudo ip tuntap add mode tunしかし、次の-wようなオプションを使用するときssh $Server -w $portは、Tunnel device open failed. Could not request tunnel forwarding.どうすればよいですか?
ルーカスアイマレット

16

または、単純なコマンドで、ssf(このユースケースを処理するために設計された)を使用することもできます。


クライアント側:

#>./ssfc -U 53:192.168.1.1:53 server.foo.com

このコマンドは、localhostとserver.foo.com間の安全なトンネルを介して、ローカルポート53(dns)を192.168.1.1ポート53にリダイレクトします。


(sshサーバーの代わりに-またはその隣に)ssfサーバーが必要になります。

#>./ssfs

ちなみに、ssfのクライアント側とサーバー側の両方がWindows / Linux / Macで動作します。これはユーザーランドアプリケーションであるため、tun / tapまたはVPNは必要ありません。

ポート53をリダイレクトするには、使用しているツールに関係なく、管理者権限が必要です。

詳細、詳細、ユースケース、またはダウンロードについては、https//securesocketfunneling.github.io/ssf/


「こちらは私の製品です」、境界線スパムであることに慎重に答えてください。ヘルプセンターのガイドラインを読んでそれに従うことをお勧めします。
15年

7
せいぜい、それは恥知らずのプラグです。とにかく、ソリューションはあなたの要求に合うかもしれません。ところで、SSFはオープンソースであり、非営利です。
ssf-developers

11
@heavyd:彼が大量のハックスクリプトを投稿した場合、それは受け入れられますが、成熟したオープンソースツールを作成したため、そうではありませんか?元の質問に完全に答えます。
Synthead

恥知らずのプラグであったとしても、これがまさに私が探していたツールであることを不承不承に認めなければなりません。
therealrootuser

9

ncSNMPクライアントは新しい送信元UDPポートを選択し続けるため、複数のSNMPを同時にアクティブにできるため、SNMPで作業することができませんでした。

代わりに、SNMPを例として使用してsocat、このブログ投稿でそれを行う方法を説明する投稿を書きました。基本的に、2つの端末を使用して、概要から始めます。

概要

ターミナル1:

client$ ssh -L 10000:localhost:10000 server
server$ socat -T10 TCP4-LISTEN:10000,fork UDP4:switch:161

これにより、TCPポート10000のSSH転送が作成され、サーバーでsocatが実行されます。socatコマンドラインでスイッチのIPアドレスが「スイッチ」と記載されていることに注意してください。

ターミナル2:

client$ sudo socat UDP4-LISTEN:161,fork TCP4:localhost:10000

これにより、クライアントにsocatがセットアップされます。それはそれを行う必要があります。


これは私のために働いた:)
ポールフェニー

4

UDPポートにアクセスできる場合、VPNはより良いソリューションです。

TCP SSHポートにのみアクセスできる場合、SSHトンネルは、少なくともpingとパケットバックトラッキングのためにVPNと同じくらい優れています。

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