Linux哪个版本没有函数nf_register_hook,nf_hooks_needed与nf_hooks区别
时间: 2023-11-22 12:04:18 浏览: 42
在Linux内核版本3.13之后,函数nf_register_hook被函数nf_register_net_hook所取代。而函数nf_hooks_needed和nf_hooks在所有版本的Linux内核中都存在。
nf_hooks_needed和nf_hooks是网络层钩子的计数器,用于跟踪哪些网络层钩子已经注册。nf_hooks_needed用于跟踪需要注册的网络层钩子的数量,nf_hooks用于跟踪已经注册的网络层钩子的数量。
nf_register_hook函数用于注册网络层钩子,而nf_register_net_hook函数则是在网络命名空间中注册网络层钩子。这两个函数的功能类似,但是nf_register_net_hook可以为每个网络命名空间中的网络层钩子提供单独的注册。
相关问题
nf_register_net_hook和nf_register_hook的区别
`nf_register_net_hook` 和 `nf_register_hook` 都是Linux内核中用于注册netfilter钩子函数的函数,但是它们的作用范围不同。
`nf_register_net_hook` 用于注册网络命名空间中的netfilter钩子函数,而 `nf_register_hook` 用于注册全局的netfilter钩子函数。
在Linux内核中,一个系统可以包含多个网络命名空间,每个网络命名空间都有自己的netfilter钩子函数。因此,如果你需要在指定的网络命名空间中注册netfilter钩子函数,你应该使用 `nf_register_net_hook` 函数。
而如果你需要在全局范围内注册netfilter钩子函数,你可以使用 `nf_register_hook` 函数。但是需要注意的是,使用 `nf_register_hook` 函数注册的钩子函数会在所有网络命名空间中生效,因此可能会对系统的性能产生影响。
因此,如果你想要注册netfilter钩子函数,应该根据具体情况选择合适的函数。
请用linux nf_register_hook接口编写过滤源地址192.168.1.9,端口为8080的报文与请求
好的,以下是一个简单的示例代码:
```c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h>
#include <linux/tcp.h>
static struct nf_hook_ops nfho;
// 匹配IP地址和端口号
static bool match_address_port(struct sk_buff *skb) {
struct iphdr *iph;
struct tcphdr *tcph;
iph = ip_hdr(skb);
if (iph->saddr != htonl(0xc0a80109)) { // 192.168.1.9
return false;
}
tcph = tcp_hdr(skb);
if (tcph->dest != htons(8080)) {
return false;
}
return true;
}
// 回调函数
static unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
if (!skb) {
return NF_ACCEPT;
}
if (match_address_port(skb)) {
printk(KERN_INFO "DROPPED a packet from 192.168.1.9:8080\n");
return NF_DROP;
}
return NF_ACCEPT;
}
static int __init init_module_func(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 loaded\n");
return 0;
}
static void __exit cleanup_module_func(void) {
nf_unregister_hook(&nfho);
printk(KERN_INFO "Module unloaded\n");
}
module_init(init_module_func);
module_exit(cleanup_module_func);
```
上面的代码会在内核预路由阶段拦截 IPv4 报文,并匹配源 IP 地址为 192.168.1.9、目的端口为 8080 的报文。如果匹配成功,则会在内核日志中输出一条信息并丢弃该报文。