linux – 如何为ebtables编写自定义模块?

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

我成功加载了模块.但就好像它不存在一样.我没有得到匹配和检查功能的日志,所以桥梁显然没有考虑我的过滤器.我究竟做错了什么?

我已经尝试了许多加载我的过滤器的组合,首先设置桥接器或首先设置ebtables规则,但它们都没有改变任何东西.

附:桥本身有效.我确信ebtables也有效,因为如果我添加一个删除包的策略,我不会在最终的计算机上收到它们.我无法弄清楚的是如何告诉ebtables也考虑我的过滤器.

最佳答案
要使用内核模块,还需要为用户空间程序编写适当的插件,然后插入调用它的规则.

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

转载注明原文:linux – 如何为ebtables编写自定义模块? - 代码日志