本文参考了http://blog.chinaunix.net/uid-23069658-id-3160506.html和http://blog.chinaunix.net/uid-23069658-id-3163999.html作者的思想,对最近的工作做个梳理。
1.大致模型:
2.上图中涉及到的上层协议,应该是网络层及以上,下图为内核和用户空间的交互大致过程:
3.内核中默认维护了三张表(其实是四张,还有一个名为raw的表很少被用到,这里不对其进行分析介绍了):filter,nat和mangle。
1)、filter表
该表是整个过滤系统中真正起“过滤”作用的地方。所有对数据包的过滤工作都在这个表里进行,也就是说用户如果需要对某种类型的数据包进行过滤拦截,那么最好在这个表中进行操作。filter表会在NF_IP_LOCAL_IN、NF_IP_FORWARD和NF_IP_LOCAL_OUT三个hook点注册钩子函数,也就是说所有配置到filer表中的规则只可能在这三个过滤点上进行设置。
2)、nat表
主要用于DNAT和SNAT和地址伪装等操作。用于修改数据包的源、目的地址。目前版本的内核中nat表监视四个hook点:NF_IP_PRE_ROUTING、NF_IP_LOCAL_IN/OUT、NF_IP_POST_ROUTING。但在真正的实际应用中,我们一般仅需要在nat表的PREROUTING和POSTROUTING点上注册钩子函数。该表有个特性:只有新连接的第一个数据包会经过这个表,随后该连接的所有数据包将按照第一个数据包的处理动作做同样的操作,这种特性是由连接跟踪机制来实现的。
3)、mangle表
该表主要用于对数据包的修改,诸如修改数据包的 TOS 、 TTL 等字段。同时该表还会对数据包打上一些特殊的标签以便结合 TC 等工具,实现诸如 Qos 等功能。该表监视所有的 hook 点。4.我们通常用iptables添加规则时使用的结构:
在 Netfilter 中规则是顺序存储的,一条rule规则主要包括三个部分:
- ipt_entry:标准匹配结构,主要包含数据包的源、目的IP,出、入接口和掩码等;
- ipt_entry_match:扩展匹配。一条rule规则可能有零个或多个ipt_entry_match结构;
- ipt_entry_target:一条rule规则有且仅有一个target动作。就是当所有的标准匹配和扩展匹配都符合之后才来执行该target。