我试图将端口 8000-8900/udp 上的所有流量复制到另一个端口范围或另一个虚拟设备,以测量多个源之间的延迟。
我知道iptables
有 TEE 选项,但是我发现的示例对我不起作用。
答案1
您可以使用守护进程记录器,由 Sourcefire 创始人 Martin Roesch 开发的工具。基本上,该工具创建一个软 TAP,您可以将数据包复制到其中。在您的情况下,重要的开关将用于-i
嗅探输入接口和-o
向其吐出数据包的输出接口。
如果您不想使用环回,您可以创建一个虚拟接口,我认为建议您特别是当您想避免污染数据包捕获以进行分析时。在此示例中,我将创建一个名为 的虚拟接口dummy0
,并分配 IP 地址为192.168.1.150/24
。
$ sudo modprobe dummy
$ sudo sh -c 'echo "dummy" >> /etc/modules'
$ sudo sh -c 'echo "
auto dummy0
iface dummy0 inet static
address 192.168.1.150
netmask 255.255.255.0" >> /etc/network/interfaces'
然后您现在可以运行daemonlogger
,假设您的物理接口是eth0
$ sudo daemonlogger -i eth0 -o dummy0
答案2
解决方案是创建另一个目标地址来将数据包复制到其中。
sudo ip addr add 10.0.0.1/24 dev lo
在此示例中,我们匹配来自任何非环回接口的端口 8000 至 8100 上的 udp 数据包,以避免无限数据包循环。数据包被复制并转发到路由到 10.0.0.1 的接口。请注意,此时数据包尚未被修改,并且仍然保留原始的源地址和目标地址。
之后,我们单独过滤Loopback接口上的所有数据包,并将目标IP地址设置为其自身,这样调试工具就可以监听10.0.0.1:8000-8100并接收数据包。
#!/usr/sbin/nft -f
table ip mangle {
chain prerouting {
type filter hook prerouting priority mangle; policy accept;
iifname != lo udp dport 8000-8100 dup to 10.0.0.1 device lo notrack
}
chain input {
type filter hook input priority mangle; policy accept;
iifname lo udp dport 8000-8100 ip daddr set 10.0.0.1 notrack
}
}
监听数据包的命令示例:nc -v -k -u -l 10.0.0.1 8000
要清理,请运行
sudo ip addr delete 10.0.0.1/24 dev lo
sudo nft flush ruleset
在屏幕截图中,主机 192.168.1.50 向 192.168.1.2:8000 发送了一个数据包,并且该数据包是重复的。 192.168.1.2:8000 上的应用程序响应了发件人。请注意,wireshark 不会显示更新后的目标地址。