回答:
この小さなガイドでは、ほとんどの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
この例(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の例を参照してください。
ssh orig_strm_src socat udp4-listen:4003,reuseaddr,fork STDOUT| socat STDIN udp-sendto:localhost:4003
SSH(少なくともOpenSSH)はシンプルなVPNをサポートしています。クライアントで-w
またはTunnel
オプションを使用すると、両端でデバイスをssh
作成できますtun
。これを使用して、あらゆる種類のIPトラフィックを転送できます。(Tunnel
のマニュアルページも参照してくださいssh_config(5)
。)これには、両端にOpenSSH(およびおそらくルート権限)が必要であることに注意してください。
ip tuntap add
。
tun
次のようにデバイスを事前に作成しました。sudo ip tuntap add mode tun
しかし、次の-w
ようなオプションを使用するときssh $Server -w $port
は、Tunnel device open failed. Could not request tunnel forwarding.
どうすればよいですか?
または、単純なコマンドで、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/
nc
SNMPクライアントは新しい送信元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がセットアップされます。それはそれを行う必要があります。