ネットワークパケットに対応するものは何ですか? [閉鎖]

ネットワークパケットに対応するものは何ですか? [閉鎖]

これはおそらく非常に基本的な質問です。

teeコマンドのように動作しますが、TCP / UDPパケットを渡すコマンドがLinuxにあるかどうか疑問に思います。デフォルトでは、1つのポートでリッスンする必要があり、この「ティー」などのコンポーネントの背後にある他のすべてのホストに同じデータ/パケットを「ティー」/転送する必要があります。

コマンドでない場合の推奨設定は何ですか?

netcatやsocatはこれを行うことができますか?

答え1

ネットワーク通信は通常双方向ですが、teeシェルパイプは一方向でのみ動作します。

zshただし、データを再送信せずに受信するだけのネットワークサービスがある場合は、次のように+を使用してTCPを介してすべてのサービスに同じバイトストリームを送信できますsocat

generate-stream > >(socat -u - tcp:host:8001) > >(socat -u - tcp:host:8002)

または、プロセスの交換をサポートしているが複数のオペレーティングシステムをサポートしていない他のシェルを使用してください。

generate-stream | tee >(socat -u - tcp:host:8001) | socat -u - tcp:host:8002

着信接続を受け入れ、受信したトラフィックをそのように転送するサービスに接続するには、tee次のようにします。

CODE='
  cat > >(socat -u - tcp:host:8001) > >(socat -u - tcp:host:8002)
' socat -u tcp-listen:8000,fork,reuseaddr \
           exec:'zsh -c eval\\ $CODE',nofork

ここでは、TCPポート8000​​を介して一方向にトラフィックを受信し、それをTCPポート8001および8002を介してサーバーに転送するサービスが開始されますhost

必須ではありません。これは標準入力を最適化noforkする最適化のみです。zshはいネットワークソケット。

またはないzsh場合bash

CODE='
  tee >(socat -u - tcp:host:8001) | socat -u - tcp:host:8002
' socat -u tcp-listen:8000,fork,reuseaddr \
           exec:'bash -c eval\\ \\\"$CODE\\\"',nofork

に適用できますsocat

zshこれを行うには、ヘルパー関数を作成できます。たとえば、次のようになります。

ntee() (
  src=$1; shift
  export CODE=cat
  for dst do
    CODE+=" > >(socat -u - ${(qq)dst})"
  done
  socat -u "$src" exec:'zsh -c eval\\ $CODE',nofork
)

次のように使用してください。

ntee tcp-listen:8000,reuseaddr,fork \
       tcp:host1:8001 \
       udp-sendto:host2:8002 \
       file:file.log,creat,append

例えば。

答え2

netcat または socat ツールは、アプリケーション層のデータフローを処理するのに理想的です。ネットワークパケットのコピーをLinuxシステムの他の宛先に転送するには、カーネルレベルを確認する必要がありますiptables

お探しのティー機能はTEE拡張を使用して取得できます。iptables TEE 拡張ドキュメント

設定する特定のルールは、iptablesネットワークインターフェイス、転送するポートの数などによって異なります。

関連情報