![从流中删除一个数据包](https://linux22.com/image/1577259/%E4%BB%8E%E6%B5%81%E4%B8%AD%E5%88%A0%E9%99%A4%E4%B8%80%E4%B8%AA%E6%95%B0%E6%8D%AE%E5%8C%85.png)
我正在寻找一种方法来放弃一(UDP) 多播流数据包。
这是否可以通过用户空间实用程序实现,或者唯一的方法是将一些代码注入内核 IP 堆栈?
我希望它应该丢弃通过两个桥接接口的数据包(因此从一个 eth 进入,从另一个 eth 离开)。理想情况下,它应该丢弃第一个数据包,这将满足一些要求(以 BPF 过滤器的形式或只是 DST|SRC IP|PORT 的组合),但只丢弃接口上的第一个数据包就足够了。
答案1
好的!正如 @dirkt 在他的评论中所说,可以使用一些 iptables 扩展。一个非常适合此目的的扩展可能是statistic --mode nth
。它可以在桥上轻松使用(net.bridge.bridge-nf-call-iptables
必须打开,才能进行桥接!)
因此,如果有人想阻止第一个进入的数据包bridge0
,ethA
命令将如下所示:
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
这不是一个真正完美的解决方案,但这是我能想到的唯一解决方案。如果有人能提出更好的解决方案,我期待看到它 :)