#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#define MODULE_NAME "example_hook"
static struct nf_hook_ops nfho;
unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
// 打印日志信息
printk(KERN_INFO MODULE_NAME ": Packet hooked\n");
// 返回 NF_ACCEPT 表示继续处理数据包
return NF_ACCEPT;
}
static int __init example_init(void) {
// 初始化钩子函数
nfho.hook = hook_func;
nfho.hooknum = NF_INET_PRE_ROUTING;
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST;
// 注册钩子函数
nf_register_hook(&nfho);
printk(KERN_INFO MODULE_NAME ": Module loaded\n");
return 0;
}
static void __exit example_exit(void) {
// 注销钩子函数
nf_unregister_hook(&nfho);
printk(KERN_INFO MODULE_NAME ": Module unloaded\n");
}
module_init(example_init);
module_exit(example_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Linux netfilter hook example");
这段代码展示了如何在Linux内核中实现一个简单的网络过滤器钩子(netfilter hook)。以下是关键部分的解释:
包含头文件:
#include <linux/module.h>
:用于模块管理。#include <linux/kernel.h>
:提供内核级别的打印函数等。#include <linux/netfilter.h>
和 #include <linux/netfilter_ipv4.h>
:提供网络过滤器相关的API。定义钩子操作结构体:
struct nf_hook_ops nfho
:用于注册和注销钩子函数。钩子函数:
hook_func
:当数据包到达指定的钩子点时,该函数会被调用。这里只是简单地打印一条日志信息,并返回 NF_ACCEPT
表示继续处理数据包。模块初始化函数:
example_init
:初始化并注册钩子函数。设置钩子点为 NF_INET_PRE_ROUTING
,表示在网络协议栈的预路由阶段触发钩子。模块退出函数:
example_exit
:注销钩子函数,确保模块卸载时不会留下残留的钩子。模块元数据:
MODULE_LICENSE
、MODULE_AUTHOR
和 MODULE_DESCRIPTION
:提供模块的许可证、作者和描述信息。通过这段代码,你可以将自定义的逻辑插入到Linux内核的网络栈中,从而实现对网络流量的监控或修改。
上一篇:linux解压 tar.gz
下一篇:linux查看系统进程
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站