netfilter

来源:互联网 发布:苹果ipad越狱软件 编辑:程序博客网 时间:2024/05/19 19:15

http://www.cnblogs.com/iloveyouforever/archive/2012/09/20/2696019.html

http://www.boyunjian.com/do/article/snapshot.do?uid=net.csdn.blog%2Fwuruixn%2Farticle%2Fdetails%2F7957368


Netfilter是表的容器,表是链的容器,链是规则的容器,最终形成对数据报处理规则的实现。

具体功能模块 1.数据报过滤模块 2.连接跟踪模块(Conntrack)3.网络地址转换模块(NAT)4.数据报修改模块(mangle)5.其它高级功能模块

简单地说,数据报经过各个HOOK的流程如下:     数据报从进入系统,进行IP校验以后,首先经过第一个HOOK函数NF_IP_PRE_ROUTING进行处理;然后就进入路由代码,其决定该数据报是需要转发还是发给本机的;若该数据报是发被本机的,则该数据经过HOOK函数NF_IP_LOCAL_IN处理以后然后传递给上层协议;若该数据报应该被转发则它被 NF_IP_FORWARD处理;经过转发的数据报经过最后一个HOOK函数NF_IP_POST_ROUTING处理以后,再传输到网络上。本地产生的数据经过HOOK函数NF_IP_LOCAL_OUT 处理后,进行路由选择处理,然后经过NF_IP_POST_ROUTING处理后发送出去。





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) 



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
};
enum {
NFPROTO_UNSPEC =  0,
NFPROTO_IPV4   =  2,
NFPROTO_ARP    =  3,
NFPROTO_BRIDGE =  7,
NFPROTO_IPV6   = 10,
NFPROTO_DECNET = 12,
NFPROTO_NUMPROTO,
};




/* Bridge Hooks */
/* After promisc drops, checksum checks. */
#define NF_BR_PRE_ROUTING 0
/* If the packet is destined for this box. */
#define NF_BR_LOCAL_IN 1
/* If the packet is destined for another interface. */
#define NF_BR_FORWARD 2
/* Packets coming from a local process. */
#define NF_BR_LOCAL_OUT 3
/* Packets about to hit the wire. */
#define NF_BR_POST_ROUTING 4
/* Not really a hook, but used for the ebtables broute table */
#define NF_BR_BROUTING 5
#define NF_BR_NUMHOOKS 6


/* There is no PF_ARP. */
#define NF_ARP 0


/* ARP Hooks */
#define NF_ARP_IN 0
#define NF_ARP_OUT 1
#define NF_ARP_FORWARD 2
#define NF_ARP_NUMHOOKS 3


/* Packet types */


#define PACKET_HOST 0/* To us */
#define PACKET_BROADCAST 1/* To all */
#define PACKET_MULTICAST 2/* To group */
#define PACKET_OTHERHOST 3/* To someone else */
#define PACKET_OUTGOING 4/* Outgoing of any type */
/* These ones are invisible by user level */
#define PACKET_LOOPBACK 5/* MC/BRD frame looped back */
#define PACKET_FASTROUTE 6/* Fastrouted frame */

原创粉丝点击