加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 00:34:24 所属栏目:Linux 来源:网络整理
导读:基本上,我想编写一个内核模块,为ebtables添加一个可能的过滤器.然后我需要告诉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 calledn");
    return true;  // match everything!
}

static bool check(const struct xt_mtchk_param *par)
{
    printk(KERN_INFO"check calledn");
    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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读