基本上,我想编写一个内核模块,为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也考虑我的过滤器。
最佳答案
要使用内核模块,还需要为用户空间程序编写一个合适的插件,然后插入一个调用它的规则。
如果没有任何选项,请不要在.matchsize
中指定任何struct xt_match
参数(等于指定0)。