基本上,我想编写一个内核模块,为ebtables添加一个可能的过滤器。然后,我需要告诉ebtables在我设置的桥上使用我的过滤器。
我需要编写自己的模块的原因是我想在连续的数据包之间引入延迟(出于某些测试原因)。为了说明,我的网络最初的流量如下:
+++-----------------+++-----------------+++-----------------+++-----------------
其中,+
表示数据包的流量,-
表示该线路上没有数据包。我希望在两者之间搭建一座桥梁,这样数据包模式将变为:
+----+----+---------+----+----+---------+----+----+---------+----+----+---------
这意味着我将确保每个数据包到达之间存在一定的延迟。
现在,我编写了以下简单代码,基本上是从linux-source/net/bridge/netfilter/ebt_ip.c中获取的:
static bool match(const struct sk_buff *skb, const struct xt_match_param *par)
{
printk(KERN_INFO"match called\n");
return true; // match everything!
}
static bool check(const struct xt_mtchk_param *par)
{
printk(KERN_INFO"check called\n");
return true; // pass everything!
}
static struct xt_match reg __read_mostly = {
.name = "any", // I made this up, but I tried also putting ip for example which didn't change anything.
.revision = 0,
.family = NFPROTO_BRIDGE,
.match = match,
.checkentry = check,
.matchsize = XT_ALIGN(4), // don't know what this is, so I just gave it an `int`
.me = THIS_MODULE
};
int init_module(void)
{
return xt_register_match(®);
}
void cleanup_module(void)
{
xt_unregister_match(®);
}
我已经成功加载了模块,但好像它并没有生效。我在match
和check
函数中没有看到日志输出,所以桥明显没有考虑我的过滤器。我做错了什么?
我尝试了许多组合,先加载我的过滤器,先设置桥,或者先设置ebtables规则,但都没有改变什么。
P.S. 桥本身是有效的。 我确定ebtables也在生效,因为如果我添加一个策略来丢弃数据包,我不会在最终计算机上收到它们。 我弄不清楚的是如何告诉ebtables也考虑我的过滤器。