标签:
it |
分类: network |
一 首先看一下netfilter的整体架构
http://s14/middle/694f2ae74cdf8b87345dd&690NF_HOOK执行流程分析一" />
netfilter的具体实现,以NF_IP_PREROUTING为例
二 NF_HOOK的实现原理
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{
}
通过NF_HOOK的宏定义可以看到,NF_HOOK主要是调用nf_hook_slow,那么,nf_hook_slow主要做了哪些东西呢?
nf_hook_slow(pf, hook, skb, indev, outdev, okfn, thresh)
{
next_hook:
}
nf_interate 的作用就是递归调用注册的钩子函数,
unsigned int nf_iterate(struct list_head *head,struct sk_buff *skb,unsigned int hook,const struct net_device *indev,
{
repeat:
#ifdef CONFIG_NETFILTER_DEBUG
#endif
}
三 filter NAT mangle链的具体实现
先看一下下面的结构体
struct nf_hook_ops {
};
其实nf_iterate就是递归搜索list 执行hook函数。
使用# iptables –nvL,可以看到有如下的输出,这三个表是怎么注册上去的呢?
http://s9/middle/694f2ae74cdf8b87e4df8&690NF_HOOK执行流程分析一" />
http://s11/middle/694f2ae74cdf8b87cbf3a&690NF_HOOK执行流程分析一" />
static int __init iptable_filter_init(void)
{
}
http://s12/middle/694f2ae74cdf8b88b3bfb&690NF_HOOK执行流程分析一" />
防火墙分别在(1 << NF_INET_LOCAL_IN) | \ (1 << NF_INET_FORWARD) | \ (1 << NF_INET_LOCAL_OUT))注册HOOK函数,并执行iptable_filter_hook函数。
http://s9/middle/694f2ae7300bb735c2fe8&690NF_HOOK执行流程分析一" />
到了这里大体就明白了,NF_HOOK执行相应额HOOK函数,例如在IP_PREROUTING里面执行防火墙注册的HOOK函数,也就是到了iptables_filter_hook,然后遍历FILTER里面的各个table,执行相应的动作。那么table是怎么跟一条规则相对应的呢,那得先看一下ipt_do_table是怎么实现的。我把ipt_do_table执行的大体流程粘帖如下
http://s14/middle/694f2ae74cdf8b8a1312d&690NF_HOOK执行流程分析一" />
http://s15/middle/694f2ae707aff45a8692e&690NF_HOOK执行流程分析一" />
ipt_do_table 就是遍历entry匹配IP五元组,然后执行相应的target动作,如下图所示:
http://s9/middle/694f2ae74cdf8b89cd9e8&690NF_HOOK执行流程分析一" />
举例:
如果执行如下的命令,在执行上述的步骤后,匹配好无元组之后,会跳转到REJECT target,
iptables -A PREROUTING -s 10.10.10.1 -j REJECT
http://s8/middle/694f2ae74cdf8b8afcb77&690NF_HOOK执行流程分析一" />
然后调用reject_ta_reg,采取必要的步骤后,将包丢掉。