iptables需要处理两个维度的信息:
- 在什么时候应用配置,这便是iptables中的链(chain),对应于netfilter的hook
- 应用什么配置,即iptables中的表(table)
iptables其实是运行与用户空间的,其本身并不是Linux内核的一部分,真正完成防火墙功能是Linux内核的netfilter模块,iptables通过netfilter所提供的钩子(hook)通知netfilter需要完成哪些功能。
链
iptables在默认情况下包含5个链,分别对应netfilter的5个hook:
Chain | 对应的hook | 作用时机 |
---|---|---|
PREROUTING | NF_IP_PRE_ROUTING | 数据包进入内核网络模块之后,获得路由之前 |
INPUT | NF_IP_LOCAL_IN | 数据包被决定路由到本机之后 |
FORWARD | NF_IP_FORWARD | 数据包被决定路由到其他主机之后 |
OUTPUT | NF_IP_LOCAL_OUT | 离开本机的数据包进入内核网络模块之后 |
POSTROUTING | NF_IP_POST_ROUTING | 对于离开本机或者FORWARD的数据包,当数据包被发送到网络之后 |
链执行顺序
- 对于目的地为本机的数据包:PREROUTING -> INPUT
- 对于目的地为其他主机的数据包:PREROUTING -> FORWARD -> POSTROUTING
- 对于本机产生的数据包:OUTPUT -> POSTROUTING
表
iptables中的表所表示的是防火墙中某一类配置,有些配置可能对所有的chain都生效(比如mangle表),而有些配置能对某些chain生效(比如filter表)。
iptables中包含了以下5张表:
- filter表:估计是iptables里最常用的表了,用于控制到达某个chain的数据包是否可以继续放行。
- nat表:用于修改数据包的源地址和目的地地址。
- mangle表:用于修改数据包的IP头信息。
- raw表:iptables是有状态的,也即iptables对数据包有连接追踪(connection tracking)机制,而raw便是用来去除这种最终机制。
- security表:在数据包上使用SELinux。
至于某个表中包含了哪些chain,请参考:
表与链对应
连接跟踪
数据包通常是属于某个连接(connection)的,当数据包经过iptables时,从iptables的连接跟踪机制可以得知当前数据包所对应的连接的状态,主要有以下状态:
- NEW,请求一个新连接,比如一个全新的HTTP请求
- ESTABLISHED,数据包已经属于某个连接
- RELATED,数据包已经属于某个连接,但是又请求一个新连接
- INVALID,数据包不属于任何连接
iptables配置例子参考这里。
网友评论