文档介绍:Netfilter源代码分析详解
一、概述
1. Netfilter/IPTables框架简介
          Netfilter/、)的最后经过这个HOOK。
    经过这个HOOK处理之后,数据报进入ip_local_deliver_finish()(位于net/ipv4/,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/,Line73)的最后经过这个HOOK。
    经过这个HOOK处理之后,数据报进入ip_forward_finish()(位于net/ipv4/,Line44)
    另外,在net/ipv4/()函数(Line1119)最后也会经过这个HOOK。(ipmr为多播相关,估计是在需要通过路由转发多播数据时的处理)
    这样,IPTables模块就可以利用这个HOOK对应的FORWARD规则链表来对数据报进行规则匹配的筛选了。
涉及功能:mangle(-150)、filter(0)
NF_IP_LOCAL_OUT (3)
    本地主机发出的数据报在IP数据报构建/发送函数ip_queue_xmit()(位于net/ipv4/,Line339)、以及ip_build_and_send_pkt()(位于net/ipv4/,Line122)的最后经过这个HOOK。(在数据报处理中,前者最为常用,后者用于那些不传输有效数据的SYN/ACK包)
    经过这个HOOK处理后,数据报进入ip_queue_xmit2()(位于net/ipv4/,Line281)
    另外,在ip_build_xmit_slow()(位于net/ipv4/,Line429)和ip_build_xmit()(位于net/ipv4/,Line638)中用于进行错误检测;在igmp_send_report()(位于net/ipv4/,Line195)的最后也经过了这个HOOK,进行多播时相关的处理。
    这样,IPTables模块就可以利用这个HOOK对应的OUTPUT规则链表来对数据报进行规则匹配的筛选了。
涉及功能:Conntrack(-200)、mangle(-150)、DNAT(-100)、filter(0)
NF_IP_POST_ROUTING (4)
    所有数据报,包括源地址为本地主机和非本地主机的,在通过网络设备离开本地主机之前,在IP数据报发送函数ip_finish_output()(位于net/ipv4/,Line184)的最后经过这个HOOK。
    经过这个HOOK处理后,数据报进入ip_finish_output2()(位于net/ipv4/,Line160)另外,在函数ip_mc_output()(位于net/ipv4/,Line195)中在克隆新的网络缓存skb时,也经过了这个HOOK进行处理。
涉及功能:mangle(-150)、SNAT(100)、Conntrack(INT_MAX)
    其中,入口为net_rx_action()(位于net/core/,Line1602),作用是将数据报一个个地从CPU的输入队列中拿出,然后传递给协议处理例程。
    出口为dev_queue_xmit()(位于net/core/,Line1035),这个函数被高层协议的实例使用,以数据结构struct sk_buff *skb的形式在网络设备上发送数据报。
2. HOOK的调用
        HOOK的调用是通过宏NF_HOOK实现的,其定义位于include/linux/,Line122:
#define NF_HOOK(pf, hook