iptables链式处理逻辑基于netfilter固定流转路径,五链(PREROUTING→INPUT→FORWARD→OUTPUT→POSTROUTING)不可跳过或逆序;四表(raw>mangle>nat>filter)按优先级绑定特定链,规则按序匹配并遵循“首次命中即执行”原则,支持自定义链实现策略分层与复用。

iptables 的链式处理逻辑不是简单堆砌规则,而是依赖数据包在内核 netfilter 框架中的固定流转路径。构建多层级防火墙策略,关键在于理解“表→链→规则”的执行顺序与分工,把不同安全目标拆解到对应层级,避免规则冲突或遗漏。
数据包必须经过的五条内置链
每个网络数据包进入 Linux 内核后,会按固定顺序穿越五条钩子点(即五链),不可跳过、不可逆序:
- PREROUTING:刚抵达网卡,路由决策前。适合做 DNAT(如端口映射)、标记或跳过连接跟踪(raw 表)
- INPUT:确认目标是本机后进入。这是服务器防护主战场,所有入站服务(SSH、HTTP、数据库等)都从此链控制
- FORWARD:目标非本机、需转发时经过。云主机、路由器、Docker 宿主机必须严格管控此链
- OUTPUT:本机主动发出的数据包出口。常被忽略,但可限制恶意程序外连或强制走代理
- POSTROUTING:离开网卡前最后关口。主要用于 SNAT(如共享上网)、MASQUERADE 或 QoS 标记
四表分工决定规则该写在哪条链上
不是所有链都能在所有表里存在——表和链有明确绑定关系。写错表,规则根本不会生效:
- filter 表只管 INPUT/OUTPUT/FORWARD,专注“放行还是拦截”,是绝大多数安全策略的落脚点
- nat 表只含 PREROUTING(DNAT)、POSTROUTING(SNAT)和 OUTPUT(本地发起的 DNAT),不做过滤,仅改地址/端口
- mangle 表理论上支持全部链,但常用在 PREROUTING(标记流量)、OUTPUT(设置 TOS)、POSTROUTING(修改 TTL)
-
raw 表仅 PREROUTING 和 OUTPUT,用
-j NOTRACK跳过连接状态跟踪,提升高性能场景(如负载均衡器)吞吐
规则匹配顺序决定策略是否生效
每条链内部规则从上到下逐条匹配,一旦命中就执行目标动作并停止匹配。这意味着:
- 具体规则要放在宽泛规则前面。例如先允许 192.168.1.100 的 SSH,再拒绝所有 INPUT,否则后者会拦截前者
- 默认策略(
iptables -P INPUT DROP)是链的“兜底动作”,只在所有规则都不匹配时触发 - 使用
-I INPUT 1插入顶部,比-A INPUT追加到末尾更可控,尤其调试阶段 - 配合
-v --line-numbers查看规则序号和匹配计数,能快速定位哪条规则拦住了合法流量
用自定义链实现策略分层与复用
当规则超过 20 条,直接写在 INPUT 里会难读难维护。此时应拆出功能型自定义链:
- 创建:
iptables -N ssh_whitelist(命名建议见名知义) - 填充:
iptables -A ssh_whitelist -s 203.0.113.5 -j ACCEPT,再加几条可信 IP - 调用:
iptables -I INPUT -p tcp --dport 22 -j ssh_whitelist - 好处:SSH 策略独立管理;多个服务可共用同一白名单链;临时禁用某层只需
-X ssh_whitelist

















