什么是网络数据包的三通等价物?

Vip*_*non 2 linux command-line networking tee

这可能是一个非常基本的问题。

想知道在 Linux 中是否有一个命令可以像 tee 命令一样工作,但用于转发 TCP/UDP 数据包。基本上它应该在一个端口上侦听并“tee”/将相同的数据/数据包转发到此“tee”类组件后面配置的所有其他主机。

如果不是命令,那么推荐的相同设置是什么?

netcat 或 socat 能做到这一点吗?

Sté*_*las 8

网络通信通常是双向的,tee而 shell 管道只能以单向方式工作。

但是,如果您有一些只接收数据而从不发回数据的网络服务,您可以使用zsh+将相同的字节流通过 TCP 发送给所有这些服务,socat例如:

generate-stream > >(socat -u - tcp:host:8001) > >(socat -u - tcp:host:8002)
Run Code Online (Sandbox Code Playgroud)

或者使用其他支持进程替换但不支持 multios 的 shell:

generate-stream | tee >(socat -u - tcp:host:8001) | socat -u - tcp:host:8002
Run Code Online (Sandbox Code Playgroud)

现在将它挂接到一个接受传入连接并转发接收到的流量的服务中 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
Run Code Online (Sandbox Code Playgroud)

这里启动一个服务,通过 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
Run Code Online (Sandbox Code Playgroud)

这可以适应由支持的许多其他传输协议中的任何一个 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
)
Run Code Online (Sandbox Code Playgroud)

并将其用作:

ntee tcp-listen:8000,reuseaddr,fork \
       tcp:host1:8001 \
       udp-sendto:host2:8002 \
       file:file.log,creat,append
Run Code Online (Sandbox Code Playgroud)

例如。