如何使用 nftables 复制端口范围上的所有 UDP 流量

如何使用 nftables 复制端口范围上的所有 UDP 流量

我试图将端口 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

参考:https://talosintelligence.com/daemon

答案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 不会显示更新后的目标地址。

Wireshark日志

相关内容