OpenWrt防火墙概念梳理

OpenWrt 的防火墙应用里有很多令人晕头转向的专有名词。特此创建本文,以记录一下我经过学习后,对它们的理解。

由于 OpenWrt 是基于 Linux 的,它的防火墙功能其实是依靠 Linux 内核的 Netfilter 来实现的。只不过在 Netfilter 之上,还有 iptables 和 OpenWrt 的 fw3 作为管理界面(新版本 OpenWrt 中换成了 nftablesfw4)。因此,很多专有名词来自 Netfilter 或 iptables/nftables

规则(Rules)

iptables/nftables 中,规则由两部分组成:匹配条件(match condition)、动作(target/verdict)。

匹配条件可以从多个维度筛选数据包,例如:

  • 源 IP 地址/目的 IP 地址
  • 源端口/目的端口
  • 协议(TCP/UDP/ICMP 等)
  • ……

而动作则决定匹配到的数据包的命运,常见的动作包括:

  • accept:接受(放行)
  • drop:丢弃(静默丢弃,不通知发送方)
  • reject:拒绝(向发送方返回错误)
  • log:记录日志
  • ……

链(Chains)

iptables/nftables 中,链是规则的集合。每条链可以包含多条规则。每条链还会有自己的默认策略(default policy),类似于规则的动作。

一条链在处理一个数据包时,会按规则的先后顺序依次匹配,直到某条规则匹配并返回终止性动作(如 acceptdropreject)为止。如果遍历完所有规则都没有匹配,则执行链的默认策略。

表(Tables)

iptables/nftables 中,表是链的集合,类似命名空间,用于把不同用途的链组织在一起。iptables 内置了 rawmanglenatfilter 等表;nftables 则没有预定义表名,允许用户自行按需创建。

钩子(Hooks)

在 Netfilter 中,钩子类似于一个数据包生命周期中的不同事件。iptables/nftables 将链挂载到这些钩子上,从而介入数据包的处理。

Netfilter 提供了以下钩子:

  • PREROUTING
  • INPUT
  • FORWARD
  • OUTPUT
  • POSTROUTING

如图,当一个数据包到达一个网络接口时,它先会被 PREROUTING 钩子处理。接着,内核结合数据包的目的 IP 地址、各个网络接口的 IP 地址和子网掩码等信息,决定是交由本地进程处理还是转发到其他网络接口。如果是交由本地进程处理,它会被 INPUT 钩子处理,最后到达本地进程;如果是转发到其他网络接口,它会先后被 FORWARDPOSTROUTING 钩子处理,最后到达其他网络接口。

同理,当一个数据包被本地进程发出时,它会先后被 OUTPUTPOSTROUTING 钩子处理,最后到达网络接口。

同一个钩子上可以挂载多条链,这些链按优先级依次处理数据包。如果某条链返回 dropreject,数据包会被直接丢弃,不再由后续链处理;如果返回 accept,则继续交给下一条链处理。

图中每个钩子内都有一个 mangle 方块,它们并不是同一条链,而是来自 mangle 表的 5 条不同的链,分别名为 PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING(和它们所在的钩子同名)。其他方块同理。

iptables 中,每条链所属的表决定了它在钩子中的优先级。iptables 中表的优先级顺序为 raw -> mangle -> nat -> filter。如图,在 INPUT 钩子中,数据包会先经过 mangle 表的 INPUT 链,再经过 filter 表的 INPUT 链,以此类推。

并非每个表在每个钩子中都存在链。如图,filter 表只在 INPUTFORWARDOUTPUT 钩子中有链,raw 表只在 PREROUTINGOUTPUT 钩子中有链……

nftables 中,表只是命名空间,每条链需要显式指定优先级,数值越小优先级越高。在新版本的 nftables 中,也可以使用预定义的名称(如 rawmanglenatfilter 等)代替数字,这些名称对应了 iptables 中表的优先级。比如:

1
2
nft 'add chain inet mytable mangle_input { type filter hook input priority mangle; }'
nft 'add chain inet mytable filter_input { type filter hook input priority filter; }'

区域(Zones)

区域是 OpenWrt fw3/fw4 引入的抽象。它把一个或多个网络接口归为一组(如 lanwan)。

如图是 OpenWrt 防火墙应用中的区域配置页面,每一行代表一个区域,各列含义如下:

  • Zone ⇒ Forwards:允许转发到的目标区域(其余默认拒绝)。
  • Input:从该区域发往路由器本地进程的流量的默认策略。
  • Output:从路由器本地进程发往该区域的流量的默认策略。
  • Intra zone forward:该区域内,不同接口之间转发的流量的默认策略。
  • IPv4 Masquerading:是否对该区域的出站流量启用 SNAT(源地址转换),通常在 wan 区域启用。启用后,内核对于返程流量也会自动启用 DNAT(目的地址转换)。

这里的 Input、Output、Forward 与前文所述的 INPUTOUTPUTFORWARD 钩子相对应。

banIP

banIP 是 OpenWrt 的一个软件包,它也用了一些防火墙相关的专有名词:

  • Chains:即前文所述的链。banIP 会创建独立的 banIP 表并在其中创建几条链,挂载到前文所述的钩子上。例如,wan-input 链挂载到 INPUT 钩子(处理从互联网到路由器本机的流量),wan-forwardlan-forward 都挂载到 FORWARD 钩子(前者处理从互联网到本地网络的流量,后者处理从本地网络到互联网的流量),等等。
  • Setsnftables 中的概念,IP 地址的集合。
  • Rules:即前文所述的规则。banIP 中的规则以 Set 作为匹配条件,动作通常为 dropreject

参考资料


OpenWrt防火墙概念梳理
https://tomzhu.site/2026/06/19/OpenWrt防火墙概念梳理/
作者
Tom Zhu
发布于
2026年6月19日
许可协议