我需要将端口 162 中的所有数据包镜像到本地主机上的另一个端口(例如 1162)。
我知道 TEE 可以镜像数据包,但只能镜像到某个 IP 地址。
也许在一条规则中也可以改变目标端口,但我找不到可行的解决方案。
类似这样的:
iptables -t mangle -A PREROUTING -d 0.0.0.0:162 -j TEE --to-destination 0.0.0.0:1162
但根据手册:将克隆的数据包发送到给定 IP 地址可访问的主机。使用0.0.0.0(对于 IPv4 数据包)或 ::(IPv6)无效。
谢谢任何提示。
操作系统:RedHat 6.9
答案1
似乎存在一些误解:
我需要镜像来自端口 162 的所有数据包
你的规则应该包括--sport 162
,或者--dport 162
如果你的意思是“所有到达端口 162 的数据包”
–到目的地 0.0.0.0:1162
实际上与0.0.0.0
localhost 不匹配。您应该使用127.0.0.1
。
最后你可以尝试 TCP 流量:
iptables -t mangle -A PREROUTING -p TCP --dport 162 -j TEE --gateway 127.0.0.2
iptables -t nat -A PREROUTING -d 127.0.0.2 -p TCP --dport 162 -j DNAT --to 127.0.0.1:1162
第一条规则将流量复制到 localhost 127.0.0.2:162。第二条规则将流量从 127.0.0.2:162 转发到 127.0.0.1:1162。
请注意,与适用于 POSTROUTING 链的传统端口转发一样,第二条规则适用于 PREROUTING。这是因为我们处理本地主机地址,以便数据包不会越过 nat 表的 POSTROUTING 链。
对于 UDP 流量:
iptables -t mangle -A PREROUTING -p UDP --dport 162 -j TEE --gateway 127.0.0.2
iptables -t nat -A PREROUTING -d 127.0.0.2 -p UDP --dport 162 -j DNAT --to 127.0.0.1:1162