Chinaunix首页 | 论坛 | 博客
  • 博客访问: 289347
  • 博文数量: 102
  • 博客积分: 230
  • 博客等级: 入伍新兵
  • 技术积分: 477
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-13 15:58
文章存档

2014年(23)

2013年(2)

2012年(45)

2011年(32)

分类:

2012-04-11 16:25:12

原文地址:[原创]Netfilter基础 作者:HereItIs

Netfilter基础

  本博客Netfilter/IPtables系列文章均基于Linux2.6.30内核。
  本文档版权归hereitis所有,可以自由拷贝/转载,转载时请保持文档的完整性并且注明来源,禁止用于任何商业用途。
  hereitis.cu@gmail.com
  1. Netfilter基本框架


       上图描述了Netfilter基本框架。从高层次的意义上讲,Netfilter通过在协议栈中增加一些Hook点并且在这些HOOk点上挂载一些HOOK函数,即“钩子函数”,实现对数据报文的各种操作,如过滤,地址转换,日志记录等。通常情况下,数据包会是经由下面三种路径中的一种:
  1. Path 1: 发往本机的数据包,它会先后经由两个HOOK点:PRE_ROUTING_HOOK, LOCAL_IN_HOOK.
  2. Path 2: 发往另一台主机的数据包,经由本机转发,它会先后经由三个HOOK点:PRE_ROUTING_HOOK, FORWARD_HOOK, POST_ROUTING_HOOK.
  3. Path 3: 本机发出的数据包,它会先后经由两个HOOK点:LOCAL_OUT_HOOK, POST_ROUTING_HOOK.
      
        数据包到达每一个HOOK点时,都会遍历该HOOK点上持载的“钩子函数”,这些“钩子函数”拥有不同的优先级,从而保证数据包依次遍历高优先级到低优先级的“钩子函数”。每一个“钩子函数”的执行结果决定了对于该数据包的下一步操作:
  1. NF_DROP: 丢弃该数据包,停止对于该数据包的任何处理
  2. NF_ACCEPT: 继续遍历该HOOK点上的其他“钩子函数”
  3. NF_STOLEN: 告诉Netfilter不要再对这个数据包进行任何操作(包括释放该数据包的空间),该“钩子函数”将对该数据包进行接下来的处理,停止遍历该HOOK点上的其他“钩子函数”
  4. NF_QUEUE: 将该数据包送到用户空间做进一步的处理
  5. NF_REPEAT: 再次调用目前的“钩子函数”
        可以看出,Netfilter框架提供了非常好的扩展性,用户只需要在每一个HOOK上注册“钩子函数”即可实现对于数据包的相关处理。
  1. Netfilter中的内置Table/Hook



  1. Tables(IPtables)


      • Raw表:可以挂载到NF_INET_LOCAL_IN和NF_INET_LOCAL_OUT点,用于避免数据包被conntrack进行状态跟踪。
      • Filter表: Filter表的NF_INET_LOCAL_IN, NF_INET_FORWARD以及NF_INET_LOCAL_OUT这三个HOOK点挂机载“钩子函数”,这样对于任何一个数据包,将会只有一个HOOK点执行Filter操作。
      • NAT表
        • 对于non-local的数据包,NF_INET_PRE_ROUTING和NF_INET_POST_ROUTING点可以分别进行DNAT和SNAT操作。
        • 每一个连接的第一个数据包将经过NAT表进行相应处理,该处理将会应用到该连接接下来的所有数据包。
        • Masquerading: 一种特殊的SNAT,将自动检测将要使用的IP,可用于DHCP或PPPOE连接的情况。
        • Port Forwarding: 一种特殊的DNAT。
        • Transparent Proxying: 一种特殊的DNAT。
      • Mangle表: 可以持载到所有的5个HOOK点上,可以用于修改数据包的信息。
      • Security表:可以挂载到NF_INET_LOCAL_IN, NF_INET_FORWARDC以及NF_LOCAL_OUT三个HOOK点上。
    1. 钩子函数及其优先级:每一个钩子函数都具有相应的优先级,同一个HOOK点的钩子函数以优先级顺序从高到低进行排序。


阅读(489) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~