基本上,我想编写一个内核模块,为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(&reg);
}

void cleanup_module(void)
{
    xt_unregister_match(&reg);
}

我成功加载了模块。但这好像不存在。我没有在matchcheck函数中获取日志,因此网桥显然没有考虑我的过滤器。我究竟做错了什么?

我尝试了很多组合,这些组合包括先加载过滤器,先设置网桥或先设置ebtables规则,但是它们都没有改变任何内容。

附言桥梁本身起作用。我确信ebtables也是有效的,因为如果我添加了删除软件包的策略,那么我不会在最终计算机上收到它们。我不知道如何告诉ebtables也考虑我的过滤器。

最佳答案

要使用内核模块,还需要为用户空间程序编写一个合适的插件,然后插入一个调用它的规则。

如果没有任何选项,请不要在.matchsize中指定任何struct xt_match参数(等于指定0)。

10-06 06:50