web-dev-qa-db-ja.com

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

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

63
heavyd

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

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

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

ローカルマシン(local)で、SSHでTCP port-forwardとなるように追加の-Lオプションを指定して、離れたマシン(server)に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 forwardに設定します

今、私たちはローカルマシンの上で行われたことの反対をする必要があります。 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サーバーをお楽しみください:)

あなたがおそらく今推測したように、DNSクエリがローカルマシン上で実行される時、例えばローカルUDPポート53では、ローカルTCPポート6667、次にサーバーのTCPポート6667、次にサーバーのDNSサーバー(192.168.1.1のUDPポート53)に転送されます。ローカルマシンでDNSサービスを利用するには、/ etc/resolv.confの最初のネームサーバとして次の行を追加します。

nameserver 127.0.0.1
35
John T

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

ローカル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の例 を参照してください。

24
nik

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

20
grawity

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


クライアント側:

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

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


あなたはssfサーバが必要になるでしょう(代わりに - または - の隣に - あなたのsshサーバ):

#>./ssfs

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

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

詳細、詳細、使用方法、またはダウンロードについては、 https://securesocketfunneling.github.io/ssf/ を参照してください。

14
ssf-developers

SNMPクライアントは新しい送信元UDPポートを選択し続け、同時にいくつかがアクティブになる可能性があるため、私はSNMPに対してncを機能させることができませんでした。

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

overview

第1ターミナル:

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

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

ターミナル2:

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

それはクライアントにsocatを設定します。それはそれをするべきです。

9
Peter V. Mørch

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

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

4
Michael