图2-1 Netfilter/iptables总体框架
三、Hook的实现
1、Netfilter-IPv4中的Hook
Netfilter模块需要使用Hook来启动函数的动态钩接,它在IPv4中定义了五个Hook(位于文件include/linux/netfilter_ipv4.h,Line39),分别对应0-4个hooksum。
简单地说,数据报经过各个Hook的流程如下:
1> 数据报从进入系统,进行IP校验以后,首先经过第一个Hook点NF_IP_PRE_ROUTING进行处理;
2> 然后进入路由代码,其决定该数据报是需要转发还是发给本机的。若该数据报是发给本机的,则该数据报经过Hook点NF_IP_LOCAL_IN处理以后,然后传递给上层协议;若该数据报应该被转发则它被NF_IP_FORWARD处理,经过转发的数据报经过最后一个Hook点NF_IP_POST_ROUTING处理,再传到网络上;
3> 本地产生的数据经过Hook点NF_IP_LOCAL_OUT处理后,进行路由选择处理,然后经过NF_IP_POST_ROUTING处理发送出去;
总之,这五个Hook所组成的Netfilter-IPv4数据报筛选体系如图3-1所示。
图3-1 Netfilter-IPv4数据报筛选体系
详细的说,各个Hook及其在IP数据报传递中的具体位置如图3-2所示。
图3-2 Netfilter-IPv4数据报筛选体系(详)
*NF_IP_PRE_ROUTING(0)
数据报在进入路由代码被处理之前,数据报在IP数据报接收函数ip_rcv()(位于net/ipv4/ip_input.c,Line379)的最后,也就是在传入的数据报被处理之前经过这个Hook。在ip_rcv()中挂接这个Hook之前,进行的是一些与类型、长度、版本有关的检查。
经过这个Hook处理之后,数据报进入ip_rcv_finish()(位于net/ipv4/ip_input.c,Line306),进行查路由表的工作,并判断该数据报是发给本地机器还是进行转发的。
在这个Hook上主要是对数据报作报头检查处理,以捕获异常情况。
涉及功能(优先级顺序):conntrack(-200)、mangle(-150)、DNAT(-100)。
*NF_IP_LOCAL_IN(1)
目的地为本机主机的数据报在IP数据报本地投递函数ip_local_deliver()(net/ipv4/ip_input.c,Line219)的最后经过这个Hook。
经过这个Hook处理之后,数据报进入ip_local_deliver_finish()(位于net/ipv4/ip_input.c,Line219)。
这样,iptables模块就可以利用这个Hook对应的INPUT规则链表来对数据报进行规则匹配的筛选了。防火墙一般建立在这个Hook上。
涉及功能:mangle(-150)、filter(0)、SNAT(100)、conntrack(INT_MAX - 1)。
*NF_IP_FORWARD(2)
目的地非本地主机的数据报,包括被NAT修改过地址的数据报,都要在IP数据报转发函数ip_forward()(位于net_ipv4/ip_forward.c,Line73)的最后经过这个Hook。
经过这个Hook处理之后,数据报进入ip_forward_finish()(位于net/ipv4/ip_forward.c,Line44)。
另外,在net/ipv4/ip_inmr.c中ipmr_queue_xmit()函数(Line1119)最后也会经过这个Hook。(ipmr为多播相关,估计是在需要通过路由转发多播数据时的处理)。
这样,IPTables 模块就可以利用这个HOOK 对应的FORWARD 规则链表来对数据报进行规则匹配的筛选了。
涉及功能:mangle(-150)、filter(0)。
*NF_IP_LOCAL_OUT(3)
本地主机发出的数据报在IP数据报构建/发送函数ip_queue_xmit()(位于net/ipv4/ip_output.c,Line339)、以及ip_build_and_send_pkt()(位于net/ipv4/ip_output.c,Line122)的最后经过这个Hook。(在数据报处理中,前者最为常用,后者用于那些不传输有效数据的SYN/ACK包)。
经过这个Hook处理后,数据报进入ip_queue_xmit2()(位于net/ipv4/ip_output.c,Line281)。
另外,在ip_build_xmit_slow()(位于net/ipv4/ip_output.c,Line429)和ip_build_xmit()(位于net/ipv4/ip_output.c,Line638)中用于进行错误检测;在igmp_send_report()(位于net/ipv4/igmp.c,Line195)的最后也经过了这个HOOK,进行多播时相关的处理。
这样,IPTables 模块就可以利用这个HOOK 对应的OUTPUT 规则链表来对数据报进行规则匹配的筛选了。
涉及功能:Conntrack(-200)、mangle(-150)、DNAT(-100)、filter(0)。
*NF_IP_POST_ROUTING(4)
所有数据报,包括源地址为本地主机和非本地主机的,在通过网络设备离开本地主机之前,在IP 数据报发送函数ip_finish_output()(位于net/ipv4/ip_output.c,Line184)的最后经过这个HOOK。
经过这个HOOK 处理后,数据报进入ip_finish_output2()(位于net/ipv4/ip_output.c,Line160)另外,在函数ip_mc_output()(位于net/ipv4/ip_output.c,Line195)中在克隆新的网络缓存skb 时,也经过了这个HOOK进行处理。
涉及功能:mangle(-150)、SNAT(100)、Conntrack(INT_MAX)。
其中,入口为net_rx_action()(位于net/core/dev.c,Line1035),作用是将数据报一个个地从CPU输入队列中拿出,然后传递给协议处理例程。
出口为dev_queue_xmit()(位于net/core/dev.c,Line1035),这个函数被高层协议的实例使用,以数据结构struct sk_buff *skb的形式在网络设备上发送数据报。
今天先看到这里,明天继续,一定要集中时间先弄一遍,以后可以再慢慢看。
由于不懂里面的东西,所以先完全照搬,当然,也不晓得对错,我想随着分析的深入,肯定会验证正确与错误的。
梦醒潇湘
2012年9月20日