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 */
- Netfilter
- netfilter
- netfilter
- netfilter
- netfilter
- netfilter
- netfilter
- netfilter
- Netfilter
- NetFilter
- Netfilter
- Netfilter
- netfilter
- Netfilter
- NetFilter
- Netfilter使用说明
- Netfilter 学习
- Netfilter分析
- Ubuntu下的系统备份
- POJ 3207 Ikki's Story IV - Panda's Trick 2-SAT
- VS2010编译boost
- 井盖为什么是圆形?
- 在VS2010下如何使用头文件unistd.h
- netfilter
- 北大政法教授的演讲
- 基于jquery-validate实现的校验功能
- CombineFileInputFormat
- 【Cocos2d-X开发学习笔记】第18期:动作类之改变动作对象、函数回调动作以及过程动作的使用
- android 动态显示隐藏listview的headerview和headerview里的控件
- cocos2d-x 学习资源
- HDOJ 2795
- 截图:截取当前程序的界面,并保存到bmp图片中。