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 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(®); } void cleanup_module(void) { xt_unregister_match(®); } 我成功加载了模块.但就好像它不存在一样.我没有得到匹配和检查功能的日志,所以桥梁显然没有考虑我的过滤器.我究竟做错了什么? 我已经尝试了许多加载我的过滤器的组合,首先设置桥接器或首先设置ebtables规则,但它们都没有改变任何东西. 附:桥本身有效.我确信ebtables也有效,因为如果我添加一个删除包的策略,我不会在最终的计算机上收到它们.我无法弄清楚的是如何告诉ebtables也考虑我的过滤器. 解决方法
要使用内核模块,还需要为用户空间程序编写适当的插件,然后插入调用它的规则.
如果您没有任何选项,请不要在struct xt_match中指定任何.matchsize参数(等于指定0). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |