最看内核网络相关的资料,有几个宏总是混在一起,NF_IP_PRE_ROUTING(或NF_IP6_PRE_ROUTING)、NF_IP_PRE_ROUTING,另外还有《linux网络体系结构》ipv6那部分中提到的
IP_PRE_ROUTING,这个结构在我的2.6.28内核中没有搜到,估计是这本书编写的较早,名称改换了
在~/include/linux/netfilter_ipv4.h
/* only for userspace compatibility */
#ifndef __KERNEL__
/* IP Hooks */
/* After promisc drops, checksum checks. */
#define NF_IP_PRE_ROUTING 0
/* If the packet is destined for this box. */
#define NF_IP_LOCAL_IN 1
/* If the packet is destined for another interface. */
#define NF_IP_FORWARD 2
/* Packets coming from a local process. */
#define NF_IP_LOCAL_OUT 3
/* Packets about to hit the wire. */
#define NF_IP_POST_ROUTING 4
#define NF_IP_NUMHOOKS 5
#endif /* ! __KERNEL__ */
可见NF_IP_PRE_ROUTING的定义被放在了#ifndef __KERNERL__下,在2.6.22以及以后的内核中, NF_IP_PRE_ROUTING以及NF_IP6_PRE_ROUTING都被放在了用户态, 而在内核态编程
必须统一使用NF_INET_PRE_ROUTING
netfilter实际上是通过在linux的ip协议栈中的5个地方挂载hook函数,来实现对sk_buffer的截取处理。这些hook的类型主要有以下几种
enum nf_inet_hooks {
NF_INET_PRE_ROUTING,
NF_INET_LOCAL_IN,
NF_INET_FORWARD,
NF_INET_LOCAL_OUT,
NF_INET_POST_ROUTING,
NF_INET_NUMHOOKS
};
hook函数由一个全局二维链表数组nf_hooks保存,在nf_hooks中每个节点都是一个nf_hook_ops结构,它实际上存储了钩子函数的内容。
struct nf_hook_ops
{
struct list_head list; //一般可以使用{NULL,NULL}
/* User fills in from here down. */
nf_hookfn *hook; //hook函数,hook函数的定义在随后介绍
struct module *owner; //如果是本module可以使用 THIS_MODULE
u_int8_t pf; //协议族,如果是ipv6则为PF_INET6
unsigned int hooknum; //hooknum 如NF_IP6_PRE_ROUTING
/* Hooks are ordered in ascending priority. */
int priority; //优先级
};
关于优先级priority,目前Netfilter定义了一下几个优先级:
(取值越小优先级越高,我们可以根据需要对各个优先级加减一个常量得到符合我们需要的优先级。)
NF_IP6_PRI_FIRST = INT_MIN
NF_IP6_PRI_CONNTRACK = -200
NF_IP6_PRI_MANGLE = -150
NF_IP6_PRI_NAT_DST = -100
NF_IP6_PRI_FILTER = 0
NF_IP6_PRI_NAT_SRC = 100
NF_IP6_PRI_LAST = INT_MAX
那么接下来便是大家所关心的hook函数,就是这里的nf_hookfn *hook; 我们暂且称之为钩子函数。
钩子函数的返回值是有特殊规定的,它可以是以下几种:
#define NF_DROP 0
#define NF_ACCEPT 1
#define NF_STOLEN 2
#define NF_QUEUE 3
#define NF_REPEAT 4
#define NF_STOP 5
其含义如下:
1. NF_DROP 0:丢弃此数据报,而不进入此后的处理;
2. NF_ACCEPT 1:接受此数据报,进入下一步的处理;
3. NF_STOLEN 2:表示异常分组;
4. NF_QUEUE 3:排队到用户空间,等待用户处理;
5. NF_REPEAT 4:进入此函数再作处理。
钩子函数的函数指针的类型为nf_hookfn。
它的定义为:
typedef unsigned int nf_hookfn (unsigned int hooknum, struct sk_buff *skb,
const struct net_device *in, const struct net_device *out,
int (*okfn)(struct sk_buff *) ),所有的这些参数都是由Netfilter传递给我们的处理函数的。
其中okfn是当对应的钩子的注册函数为空时,Netfilter调用的处理函数,它就是如果我们的处理函数返回Accept时Netfilter调用的处理函数。
参考:
http://student.csdn.net/space.php?uid=44052&do=blog&id=6708
http://topic.csdn.net/u/20090331/12/d14326a3-6be3-4e78-b5bd-a5dce7a94180.html
几个宏的区别
最新推荐文章于 2020-04-01 17:38:26 发布