タイトルはほぼそれをまとめたものです。 SSHトンネルを介してUDPトラフィックを送信したいのですが。具体的には、トンネルを介してUDPパケットを送信できるようにする必要があり、反対側でサーバーにそれらを送信できるようにする必要があります。私はTCP接続のためにそれをする方法を知っています。これはUDPでも可能ですか?
この小さなガイド は、ほとんどの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
この 例 (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の例 を参照してください。
SSH(少なくともOpenSSH)は単純なVPNをサポートしています。 Tunnel
クライアントで-w
またはssh
オプションを使用すると、両端にtun
デバイスを作成できます。これを使用して、あらゆる種類のIPトラフィックを転送できます。 ( ssh_config(5)
のマニュアルページのTunnel
も参照してください。)これには両端にOpenSSH(そしておそらくroot権限)が必要です。
あるいは、単純なコマンドで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/ を参照してください。
SNMPクライアントは新しい送信元UDPポートを選択し続け、同時にいくつかがアクティブになる可能性があるため、私はSNMPに対してnc
を機能させることができませんでした。
代わりに、私はこの ブログ記事 でsocat
でそれを行う方法を説明する記事をSNMPを例にして書きました。基本的に、概要から始めて、2つの端末を使用します。
第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を設定します。それはそれをするべきです。
UDPポートにアクセスできるのであれば、VPNはより良いソリューションです。
TCP SSHポートにしかアクセスできない場合は、少なくともpingとパケットのバックトラックに関しては、SSHトンネルはVPNと同じくらい優れています。