GNU/Linux >> Linux の 問題 >  >> Linux

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

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.crt のようなもの machine2 で

(socat ssl の詳細)


メッセージパッシングは上位層で実装する必要があります。 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 内のファイル記述子を使用して、スクリプトの本体とコプロセスの間で双方向通信がどのように実現されるかを確認してください .


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

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


Linux
  1. Linux – SysfsとDevtmpfs?

  2. Unixシステムの文字特殊ファイルとブロック特殊ファイルとは何ですか?

  3. Linux –ブロックデバイスにファイルをコピーした後のデータ回復?

  1. Linux での echo コマンドの例

  2. LinuxでUSB電源を制御(オン/オフ)する

  3. データを保持しながら Linux の既存のパーティションを暗号化する

  1. Linuxにデバイスドライバーをインストールする方法

  2. Linuxエコーコマンド

  3. Linux でデバイスをマウントするには?