LinuxでTCPトンネルを特殊文字デバイスとして公開することは可能ですか?


10

最近、QNXのドキュメントで、シリアルデバイス(dev/serX)を使用して、別々の物理マシン上のプロセス間でメッセージベースのIPCをセットアップできることがわかりました。

Linuxでシステム全体にTCP / UDPトンネル用の特別なデバイスを作成することは可能ですか?nc/ dev / somethingの下で公開されているstdin / stdoutのようなもの。

最後に、私はあるマシンでそのようなファイルに何かを書き、他のエンドでそれを受け取ることができるようにしたいです:

#machine1:
echo "Hello" > /dev/somedev

#machine2:
cat < /dev/somedev

ncmanを調べましたが、stdio以外のioソース/宛先を指定するオプションが見つかりませんでした。



1
立派な言及:tun / tapデバイスは/ devに作成できますが、自分でIPカプセル化を行う必要があります。いくつかの目的に非常に役立ちます。
pjc50 16

回答:


19

socat 「ストリーム」に似たものでこれと他の多くのことを行うことができます

この基本的な考えを使用する何かがあなたのためにそれをするはずです:

Machine1$ socat tcp-l:54321,reuseaddr,fork pty,link=/tmp/netchardev,waitslave

Machine2$ socat pty,link=/tmp/netchardev,waitslave tcp:machine1:54321

例ページから転載

暗号化したい場合はssl-l:54321,reuseaddr,cert=server.pem,cafile=client.crt,fork、machine1のバリエーションとssl:server-host:1443,cert=client.pem,cafile=server.crtmachine2のバリエーションを使用できます。

socat sslの詳細)


7

メッセージパッシングは上位層で実装する必要があります。TCPにはメッセージの概念がありません-TCP接続はオクテットのストリームを転送します。

リクエストしたものnc名前付きパイプのようなものを実現できますman mkfifo。またはsocat、Alex Stragiesが示すように確認してください。

ミドルレイヤーサービスがない場合、基本的な問題は、(1)データをリッスンする相手がいないとデータをネットワークに書き込めないこと、および(2)TCP接続が双方向であることです。

誰かがそれをリッスンしない限り、ネットワークにデータを書き込むことはできないため、データを送信する前に、常にリスナーを起動する必要があります。(メッセージパッシングシステムでは、メッセージを処理するプロセスが何らかのバッファリングを提供します。)

あなたの例は簡単に書き直すことができます:

  • 最初にmachine2(宛先)でリスナーを開始します。

     nc -l 1234 | ...some processing with the received data...
    

    あなたの例では、これは

     nc -l 1234 | cat
    

    これはブロックされ、誰かがデータをポート1234に送信するのを待ちます。

  • 次に、machine1(ソース)からデータを送信できます。

    ...make up some data... | nc machine2 1234
    

    あなたの例では、これは

     echo "Hello" | nc machine2 1234
    

受信したデータを何らかの方法で処理して応答したい場合は、シェルのコプロセッシング機能を使用できます。たとえば、これは非常にシンプルな(そして非常に頑固な)Webサーバーです。

#! /bin/bash

while :; do
  coproc ncfd { nc -l 1234; }
  while :; do
    read line <&${ncfd[0]} || break
    line="$(
      echo "$line" |
      LC_ALL=C tr -cd ' -~'
    )"
    echo >&2 "Received: \"$line\""
    if [ "$line" = "" ]; then
      echo >&${ncfd[1]} "HTTP/1.0 200 OK"
      echo >&${ncfd[1]} "Content-Type: text/html"
      echo >&${ncfd[1]} "Connection: close"
      echo >&${ncfd[1]} ""
      echo >&${ncfd[1]} "<title>It works!</title>"
      echo >&${ncfd[1]} "<center><b>It works!</b></center>"
      echo >&${ncfd[1]} "<center>-- $(date +%Y-%m-%d\ %H:%M:%S) --</center>"
      break
    fi
  done
  kill %%
  sleep 0.1
done

配列内のファイル記述子を使用して、スクリプトの本体とコプロセスの間で双方向通信がどのように行われるかを確認してください$ncfd


あなたは正しい、そして私は答えでそれを認めた。何らかの種類の仲介ソフトウェアがないと、キャラクターデバイスを作成できません。
AlexP 2016

そこにUUOCがあるようです。
マイケルハンプトン

1
@MichaelHampton:それはOPによって提供された例でした。私はそれcatが「stdinのいくつかのプロセスの読み取り」を表していると思います。
AlexP 2016

5

ncのような基本的なプログラムを使用して2台のコンピュータを接続するだけの場合は、から/にリダイレクトできます/dev/tcp/<host>/<port>

これらは実際のデバイスではなく、bashによって作成されたフィクションなので、などcat /dev/tcp/foo/19は機能しませんが、機能しcat < /dev/tcp/foo/19ます。

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