【发布时间】:2012-03-07 22:59:17
【问题描述】:
基本上,我想编写一个内核模块,为 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 规则,但没有一个能改变任何东西。
附:这座桥本身就可以工作。我确信 ebtables 也有效,因为如果我添加一个丢弃包的策略,我不会在最终计算机上收到它们。我想不通的是如何告诉 ebtables 也考虑我的过滤器。
【问题讨论】:
标签: linux kernel iptables netfilter ebtables