这可能是一个非常基本的问题。
想知道在 Linux 中是否有一个命令可以像 tee 命令一样工作,但用于转发 TCP/UDP 数据包。基本上它应该在一个端口侦听并“tee”/将相同的数据/数据包转发到此“tee”类似组件后面配置的所有其他主机。
如果不是命令,建议的设置是什么?
netcat 或 socat 可以做到这一点吗?
答案1
网络通信通常是双向的,tee
而 shell 管道只能以单向方式工作。
zsh
但是,如果您有一些只接收而不发回数据的网络服务,您可以使用+通过 TCP 向所有这些服务发送相同的字节流,socat
如下所示:
generate-stream > >(socat -u - tcp:host:8001) > >(socat -u - tcp:host:8002)
或者使用其他支持进程替换但不支持多操作系统的 shell:
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
's stdin 的优化是网络套接字。
或者,如果您没有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 功能可以使用 TEE 扩展来实现:iptables TEE 扩展文档
您想要配置的具体iptables
规则取决于您的网络接口、要转发的端口数量等。