netfilter 架构与 iptables
在 Linux 生态系统中,iptables
是使用很广泛的防火墙工具之一,它基于内核的包过滤框架(packet filtering framework) netfilter
。
Netfilter Hooks
netfilter 提供了 5 个 hook 点。包经过协议栈时会触发内核模块注册在这里的处理函数 。触发哪个 hook 取决于包的方向(是发送还是接收)、包的目的地址、以及包在上一个 hook 点是被丢弃还是拒绝等等。
下面几个 hook 是内核协议栈中已经定义好的:
- NF_IP_PRE_ROUTING: 接收到的包进入协议栈后立即触发此 hook,在进行任何路由判断 (将包发往哪里)之前
- NF_IP_LOCAL_IN: 接收到的包经过路由判断,如果目的是本机,将触发此 hook
- NF_IP_FORWARD: 接收到的包经过路由判断,如果目的是其他机器,将触发此 hook
- NF_IP_LOCAL_OUT: 本机产生的准备发送的包,在进入协议栈后立即触发此 hook
- NF_IP_POST_ROUTING: 本机产生的准备发送的包或者转发的包,在经过路由判断之后, 将触发此 hook
iptables 表与链
俗称四表五链
4个表的优先级由高到低的顺序为:
raw-->mangle-->nat-->filter
iptables
看名称 table
,是按 table
组织规则,将规则分为不同的 table
。
在每个table
内部,规则进一步组织成chan
,内置的chan
是内置的 hook
触发。
内置 chan
五链
内置的 chain
名字和 netfilter hook
名字是一一对应的:
PREROUTING
: 由NF_IP_PRE_ROUTING hook
触发INPUT
: 由NF_IP_LOCAL_IN hook
触发FORWARD
: 由NF_IP_FORWARD hook
触发OUTPUT
: 由NF_IP_LOCAL_OUT hook
触发POSTROUTING
: 由NF_IP_POST_ROUTING hook
触发
tables 类型
四表
1. Filter
filter
是最常用的 table 之一,用于判断是否允许一个包通过。
2. NAT
nat
用于实现网络地址转换规则。
当包进入协议栈的时候,这些规则决定是否以及如何修改包的源/目的地址,以改变包被路由时的行为。
3. Mangle
mangle
用于修改包的 ip
头。
例如,可以修改包的 TTL
,增加或减少包可以经过的跳数。
这个 table 还可以对包打只在内核内有效的标记
(internal kernel mark
),后续的 table 或工具处理的时候可以用到这些标记。标记不会修改包本身,只是在包的内核表示上做标记。
4. Raw
iptables
有状态的:对每个包进行判断的时候是依赖已经判断过的包。
建立在 netfilter
之上的连接跟踪(connection tracking)特性使得 iptables
将包 看作已有的连接或会话的一部分,而不是一个由独立、不相关的包组成的流。连接跟踪逻 辑在包到达网络接口之后很快就应用了。
raw
定义的功能有限,其目的就是提供一个让包绕过连接跟踪的框架。
iptables 规则
规则放置在特定 table
的特定 chain
里面。当 chain
被调用的时候,包会依次匹配 chain
里面的规则。每条规则都有一个匹配部分和一个动作部分。