Linux内核模块
Posted
技术标签:
【中文标题】Linux内核模块【英文标题】:Linux Kernel MOdule 【发布时间】:2012-04-11 06:41:00 【问题描述】:是否可以使用 netfilter 来挂钩所有以太网数据包?
我只能从 ipv4 或 ipv6 获取数据包。
编辑:
上面的代码是我的内核模块。我想让所有到达一个以太网接口的数据包重定向到另一个接口。这个模块只打印数据包到达的设备的名称(仅用于测试)。有了这个钩子,我只得到类型是 ipv4 的数据包,但我想得到所有类型。
我在网上搜索,但没有找到如何配置我的钩子以获取所有绕过以太网接口的数据包。
最好的问候
静态结构 nf_hook_ops nfho;
int hook_func(struct sk_buff * skb)
结构 ethhdr *eth;
printk("设备: %s\n,skb->dev->name);
int init_module() printk("钩子模块上线!\n");
nfho.hook =(nf_hookfn *)hook_func;
nfho.hooknum = NF_IP_PRE_ROUTING; nfho.pf = PF_INET; nfho.priority =NF_IP_PRI_FIRST;
nf_register_hook(&nfho);
返回 0;
/* 清理例程 */ void cleanup_module()
printk("结束了!\n"); nf_unregister_hook(&nfho);
【问题讨论】:
对您提出的唯一问题的简短回答是“是”,但如果这是您的全部问题,那么它是最值得关注的(错误的站点 和 一般参考)。如果这不是您的全部问题,您需要更加具体(并且在您这样做之前,这个问题仍然值得关注)。 我重新编辑了我的帖子。如果你能帮助我,我将不胜感激。最好的问候! 不,您不能为此使用 netfilter。你必须使用bridge-netfilter。 嗯。我如何使用网桥网络过滤器?我尝试使用桥来定义钩子,但没有成功。 【参考方案1】:当然, 如果我没问题,您只愿意接受所有经过以太坊验证的数据包并将它们传递到另一个接口。 在这种情况下,只需包含内核文件:
#include <linux/if_ether.h>
您通过以下方式获取标题:
struct ethhdr *hdr = eth_hdr(skb);
// *skb is a ptr !!
并通过检查一些值来确保以太币是有效的 出 ethhdr 结构。 如果您希望其他接口像接受他的数据包一样接受它,则只需由本地主机发送或修改地址。
【讨论】:
以上是关于Linux内核模块的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核Linux 内核特性 ( 组织形式 | 进程调度 | 内核线程 | 多平台虚拟内存管理 | 虚拟文件系统 | 内核模块机制 | 定制系统调用 | 网络模块架构 )