从流中删除一个数据包

从流中删除一个数据包

我正在寻找一种方法来放弃(UDP) 多播流数据包。

这是否可以通过用户空间实用程序实现,或者唯一的方法是将一些代码注入内核 IP 堆栈?

我希望它应该丢弃通过两个桥接接口的数据包(因此从一个 eth 进入,从另一个 eth 离开)。理想情况下,它应该丢弃第一个数据包,这将满足一些要求(以 BPF 过滤器的形式或只是 DST|SRC IP|PORT 的组合),但只丢弃接口上的第一个数据包就足够了。

答案1

好的!正如 @dirkt 在他的评论中所说,可以使用一些 iptables 扩展。一个非常适合此目的的扩展可能是statistic --mode nth。它可以在桥上轻松使用(net.bridge.bridge-nf-call-iptables必须打开,才能进行桥接!)

因此,如果有人想阻止第一个进入的数据包bridge0ethA命令将如下所示:

iptables -N log-and-drop        # create new chain
iptables -A log-and-drop -j LOG --log-level 6 --log-prefix SOMEREALLYUNIQUESTRING     # log received packet into syslog with some string unique enough
iptables -A log-and-drop -j DROP # drop the packet

# rules for every single interface in the bridge
iptables -A FORWARD  -m physdev --physdev-in ethA -m statistic --mode nth --every 1000000 --packet 0 -j log-and-drop

这将创建一个log-and-drop用于记录和丢弃收到的数据包的链。然后,它将接收第一个经过的数据包(然后是每一百万个数据包)并将其丢弃。

我们需要做的最后一件事是创建“监视脚本”,它将等待日志中出现该唯一字符串,然后删除所有 iptables 规则。

if tail /var/log/messages  | grep -m 1 SOMEREALLYUNIQUESTRING ; then
    iptables -D FORWARD  -m physdev --physdev-in ethA -m statistic --mode nth --every 1000000 --packet 0 -j log-and-drop
    iptables -F log-and-drop
    iptables -X log-and-drop
fi

这不是一个真正完美的解决方案,但这是我能想到的唯一解决方案。如果有人能提出更好的解决方案,我期待看到它 :)

相关内容