地说,各个 HOOK 及其在 IP 数据报传递中的具体位置如图 blog.chinaunix.net/photo/24896_061206192340.jpg
?
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,Line290)的最后经过这个 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/ipmr.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,Line1602),作用是将 数据报一个个地从 CPU 的输入队列中拿出,然后传递给协议处理例程。 出口为 dev_queue_xmit()(位于