これはおそらく非常に基本的な質問です。
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
ネットワークインターフェイス、転送するポートの数などによって異なります。