NF是netfilter的缩写,直接翻译过来就是"网络数据过滤器",其实它就是我们常说的防火墙。这个模块在Linux-2.4.x以后结构上作了个简单的修改,现在的模样长得如下:
===》路由前检查 ===》针对转发的数据包过滤 ===》 路由后检查 ===》
|| /\
\/ ||
进入本地的数据包过滤 从本地发出的数据包过滤
\/ /\
图上画出的五个检查和过滤点就是NF模块的五个钩子。所谓钩子就是在数据包的原有处理流程上增加额外的处理并把相应的处理函数插入到流程的特定地方。这些"钩子函数"使用用户设定的防火墙规则进行数据包的检查和过滤。而防火墙规则的设定是通过IPtables工具来做到的,比如可以使用下面这样的命令来设定在转发过滤钩子上的默认(缺省)规则:
bash # iptables -P FORWARD -j DROP
当然,如果在Linux的网络处理协议栈里插入这个五个NF钩子函数,是会影响处理性能的,测试经验告诉我编译进NF模块后Linux内核的网络处理吞吐率是编译进NF模块前的一半。同是网络处理吞吐率还受规则数目的影响,因为在NF模块里对防火规则的查找是线性进行的,就是从第一条开始逐步往下查找,如果找遍了所以的规则都没有匹配的,就是使用上面设置的缺省规则。这里iptables和NF模块的相互关系大概我们可以这样描述:
用户空间 用户空间 | 内核空间
iptables 工具 --> 规则表 | NF模块
设定规则 --> 规则 ---------> 钩子函数处理