分类: LINUX
2010-05-17 17:23:54
HOOK点 | 说 明 | 函数位置 | 应用举例 |
NF_IP_PRE_ROUTING | 由网卡传入主机的数据包,在没有经过IP层路由之前,会先经过这个点 | ip_rcv() | 过滤拒绝服务攻击\NAT\计算 |
NF_IP_LOCAL_IN | 经过路由选择,要进入本机的数据包,会经过这个点 | ip_local_deliver() 在此处可进行碎片重组 | 防火墙过滤进入本机的包 |
NF_IP_FORWARD |
经过路由,不是发往本机的包,需要向外发送,会经过这个点 |
ip_forward() 之后进入ip_send() | |
NF_IP_LOCAL_OUT |
本机发往外部的数据包在经过路由之前会经过这个点 |
ip_build_and_send_pkt() ip_queue_xmit() ip_build_xmit_slow() ip_buid_xmit() 不同的上层协议会走不同的流程 | 防火墙过滤外发的数据包 |
NF_IP_POST_ROUTING 所有外出包都必须经过的钩子点 |
本机发送出去的包,在路由后会经过此点 |
ip_finish_output() | 包计数功能实现 |
include/linux/netfilter.h #define 0//丢弃数据包#define 1//允许该数据包继续传递 #define 2//接收该数据包,但不再传递,可以用于包的分片重组。 #define 3//将此数据包放入一特定队列,通常用于用户空间的处理。 #define 4//再次调用HOOK函数 #define 5 #define |
include/linux/netfilter.h struct nf_hook_ops { //其中hookfn声明如下: typedef unsigned int (unsigned int ,//具体的hook类型 const struct net_device *, //输入设备(收到包的设备net_device指针) //外发的包为NULL const struct net_device *,//接口(数据包离开所需要的net_device指针) int (*)(struct *));//okfn,所有注册的hook函数都返回NF_ACCEPT时,调用 |
#define (, , , indev, outdev, ) ()() //pf 协议族 //hook 钩子 //skb buff结构的指针 //indev hookfn中的*in //outdev hookfn中的*out //okfn |
int nf_register_hook(struct nf_hook_ops *reg); //注册函数 |
//net/netfilter/core.c int nf_register_hook(struct nf_hook_ops *reg) //根据优先级,将该hook插入合适的位置 //增加一个节点 //解锁互斥量 72 mutex_unlock(&nf_hook_mutex); |