netfilter
what?
(1) Netfilter是Rusty Russell提出的Linux 2.4 内核防火墙框架,框架既简介又灵活,可实现安全策略的很多功能,如DNAT、SNAT、数据包过滤,数据包处理等等。
(2) Netfilter与IP协议栈的关系:Netfilter是嵌入内核IP协议栈的一系列调用入口,设置在报文处理的路径上。Linux网络内核内置了5条链PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING, 其实就是在内核的五个位置嵌入了NF_HOOK函数,然后通过NF_HOOK进入Netfilter框架处理(进入不同的钩子函数)。
(3)与Netfilter的五个钩子
在内核协议栈中,有5个跟netfilter有关的钩子,数据包经过每个钩子时,都会检查上面是否注册有函数,如果有的话,就会调用相应的函数处理该数据包,它们的位置见下图:
|
| Incoming
↓
+-------------------+
| NF_IP_PRE_ROUTING |
+-------------------+
|
|
↓
+------------------+
| | +----------------+
| routing decision |-------->| NF_IP_LOCAL_IN |
| | +----------------+
+------------------+ |
| |
| ↓
| +-----------------+
| | local processes |
| +-----------------+
| |
| |
↓ ↓
+---------------+ +-----------------+
| NF_IP_FORWARD | | NF_IP_LOCAL_OUT |
+---------------+ +-----------------+
| |
| |
↓ |
+------------------+ |
| | |
| routing decision |<----------------+
| |
+------------------+
|
|
↓
+--------------------+
| NF_IP_POST_ROUTING |
+--------------------+
|
| Outgoing
↓
从上面的流程中,我们还可以看出,不考虑特殊情况的话,一个数据包只会经过下面三个路径中的一个:
本机收到目的IP是本机的数据包: NF_IP_PRE_ROUTING -> NF_IP_LOCAL_IN
本机收到目的IP不是本机的数据包: NF_IP_PRE_ROUTING -> NF_IP_FORWARD ->
NF_IP_POST_ROUTING本机发出去的数据包: NF_IP_LOCAL_OUT -> NF_IP_POST_ROUTING
注意: netfilter所有的钩子(hooks)都是在内核协议栈的IP层,由于IPv4和IPv6用的是不同的IP层代码,所以iptables配置的rules只会影响IPv4的数据包,而IPv6相关的配置需要使用ip6tables。
iptables
what?
iptables是用户态下的命令行前台,用于操作netfilter.netfilter真正完成内核态下的数据包的处理。
iptables用表(table)来分类管理它的规则(rule),根据rule的作用分成了好几个表,比如用来过滤数据包的rule就会放到filter表中,用于处理地址转换的rule就会放到nat表中,其中rule就是应用在netfilter钩子上的函数,用来修改数据包的内容或过滤数据包。
链接
http://wiki.dreamrunner.org/public_html/Linux/Networks/netfilter.html
https://www.ibm.com/developerworks/cn/linux/l-ntflt/
https://segmentfault.com/a/1190000009043962