Linux系统基础11:iptables 基本原理 新手超详细详解

📅 2026/7/13 8:27:17 👁️ 阅读次数 📝 编程学习
Linux系统基础11:iptables 基本原理 新手超详细详解

Linux iptables 基本原理 新手超详细详解

目录

Linux iptables 基本原理 新手超详细详解

一、底层核心:netfilter 的 5 个钩子点

二、iptables 的核心架构:四表五链

1. 四张表的功能与优先级

(1)filter 表:过滤表(新手 99% 的场景都用它)

(2)nat 表:地址转换表

(3)mangle 表:修改数据包表

(4)raw 表:原始状态表

2. 五链与四表的对应关系

三、最关键:数据包的完整流转路径

场景 1:入站流量(目标是本机的数据包)

场景 2:转发流量(目标不是本机,只是路过)

场景 3:出站流量(本机程序主动发出去的数据包)

四、规则的匹配与执行逻辑

1. 顺序匹配,命中即停

2. 默认策略:兜底规则

3. 常见处理动作(Target)

五、进阶核心:连接跟踪机制(conntrack)

1. 什么是连接跟踪

2. 四种常见连接状态

3. 最经典的实用规则

六、原理层面的补充说明

1. iptables 规则存在哪里?

2. 和新一代 nftables 的关系

3. 为什么嵌入式 Linux 都用 iptables

七、结合之前的命令,对应原理复盘


很多新手会混淆一个概念:iptables 本身不是防火墙,它是一个用户态的配置工具;真正在内核里执行流量拦截、过滤的核心是netfilter框架。

简单说:

  • netfilter:Linux 内核内置的数据包处理框架,在网络协议栈的关键位置埋了「钩子点」,可以拦截、修改、丢弃数据包,是真正干活的「执行层」。
  • iptables:运行在用户态的命令行工具,我们通过它写入规则,iptables 会把规则推送到内核的 netfilter 里生效,是我们操作的「配置层」。

下面我们从内核钩子 → 表链结构 → 数据包流转路径 → 规则匹配逻辑 → 状态机制逐层拆解,全程用类比辅助理解,零基础也能看懂。


一、底层核心:netfilter 的 5 个钩子点

网络数据包从网卡进来,会沿着 TCP/IP 协议栈一层层向上解析;从本机发出去,会一层层向下封装。netfilter 在这条必经之路上,预埋了5 个固定的钩子点(Hook Point),相当于高速公路上的 5 个检查站,所有数据包经过时都会被拦下,执行我们预设的规则。

这 5 个钩子点,对应 iptables 里的 5 条内置链

钩子点(内核)对应 iptables 链位置与触发时机通俗类比
NF_IP_PRE_ROUTINGPREROUTING数据包刚进入网卡,还没做路由判断之前高速路入口收费站,还没决定走哪条路
NF_IP_LOCAL_ININPUT路由判断后,目标是本机,即将进入用户空间进入市区的检查站,目的地是本地
NF_IP_FORWARDFORWARD路由判断后,目标不是本机,要转发给其他机器绕城高速过境检查站,只是路过不停留
NF_IP_LOCAL_OUTOUTPUT本机用户空间的程序产生的数据包,刚发出来,还没做路由市区车辆出城检查站,从本地出发
NF_IP_POST_ROUTINGPOSTROUTING所有数据包,即将离开网卡之前高速路出口收费站,马上要离开系统

核心逻辑:数据包一定会按顺序经过对应的钩子点,我们在对应的链上写规则,就能在对应位置拦截处理数据包


二、iptables 的核心架构:四表五链

很多新手听到「四表五链」会觉得复杂,其实它是两个维度的分类,逻辑非常清晰:

  • 链(Chain):按「位置」分类 —— 你要在数据包的哪个阶段处理它(对应上面 5 个钩子点)。
  • 表(Table):按「功能」分类 —— 你要对数据包做什么类型的操作,同类功能的规则放在同一张表里。

简单说:表是功能分组,链是位置分组;每张表可以挂载在多条链上,每条链上可以有多张表的规则

1. 四张表的功能与优先级

四张表按优先级从高到低排序,数据包到达一个钩子点时,会按这个顺序依次执行不同表的规则:raw>mangle>nat>filter

(1)filter 表:过滤表(新手 99% 的场景都用它)
  • 核心功能:判断数据包要不要放行、要不要丢弃,也就是传统意义上的「防火墙功能」。
  • 支持的链INPUTFORWARDOUTPUT
  • 通俗类比:安检口,只负责判断「能不能过」,不修改数据包内容。
  • 特点:最常用、最基础,我们之前讲的端口放行、IP 拉黑,全都是在 filter 表里操作。
  • 注意:iptables命令不写-t 表名时,默认操作的就是 filter 表
(2)nat 表:地址转换表
  • 核心功能:修改数据包的源 IP / 目标 IP、源端口 / 目标端口,也就是网络地址转换(NAT)。
  • 支持的链PREROUTINGOUTPUTPOSTROUTING
  • 常见场景
    • SNAT(源地址转换):让内网机器通过一个公网 IP 上网,在POSTROUTING链做。
    • DNAT(目标地址转换):把公网端口映射到内网机器,在PREROUTING链做。
    • 端口转发、IP 映射都属于 nat 表的功能。
(3)mangle 表:修改数据包表
  • 核心功能:修改数据包本身的属性,比如修改 TTL、TOS、给数据包打标记(mark)。
  • 支持的链:所有 5 条链都支持
  • 特点:功能很底层,新手很少直接用,一般是高级路由、QoS 流量整形的时候才会用到。
(4)raw 表:原始状态表
  • 核心功能:最高优先级,用来给特定数据包跳过连接跟踪机制,也就是不做状态检测。
  • 支持的链PREROUTINGOUTPUT
  • 特点:非常少用,只有在特殊高性能场景下,不想让系统做状态跟踪的时候才用。

新手入门阶段,只需要掌握 filter 表,了解 nat 表即可,另外两张表日常几乎碰不到。

2. 五链与四表的对应关系

总结一下:每条链上挂载了哪些表的规则(按执行优先级排序):

链名挂载的表(优先级从高到低)触发场景
PREROUTINGraw → mangle → nat所有入站数据包,刚进网卡还没路由
INPUTmangle → filter目标是本机的入站数据包,即将进用户空间
FORWARDmangle → filter目标不是本机,需要转发的数据包
OUTPUTraw → mangle → nat → filter本机产生的出站数据包,刚发出来
POSTROUTINGmangle → nat所有出站 / 转发数据包,即将离开网卡

三、最关键:数据包的完整流转路径

理解了表和链,现在把它们串起来,看一个数据包在系统里到底是怎么走的。一共分三种典型场景,我们逐个走一遍流程。

场景 1:入站流量(目标是本机的数据包)

比如外面有人 SSH 连接你的服务器,数据包目标 IP 是本机地址。完整路径

网卡进来 → PREROUTING 链(raw → mangle → nat) → 路由判断:目标是本机 → INPUT 链(mangle → filter) → 到达本机用户空间的程序(比如 sshd)

逐步骤解释:

  1. 数据包从物理网卡进入系统,首先到PREROUTING链,依次执行 raw、mangle、nat 表的规则(比如做 DNAT 端口映射)。
  2. 内核做路由判断:看目标 IP 是不是本机的,确认是本机流量。
  3. 数据包进入INPUT链,依次执行 mangle、filter 表的规则。
    • filter 表就是我们平时写的端口放行、IP 拦截规则,在这里决定「允许通过」还是「丢弃」。
  4. 通过 INPUT 检查后,数据包交给上层应用程序处理。

场景 2:转发流量(目标不是本机,只是路过)

比如你的 Linux 机器当路由器,内网机器访问外网,数据包只是经过它转发。完整路径

网卡进来 → PREROUTING 链(raw → mangle → nat) → 路由判断:目标不是本机,需要转发 → FORWARD 链(mangle → filter) → POSTROUTING 链(mangle → nat) → 从网卡发出去

逐步骤解释:

  1. 同样先经过PREROUTING链处理。
  2. 路由判断:目标 IP 不是本机,需要转发给其他机器。
  3. 进入FORWARD链,执行 mangle、filter 表的规则 —— 在这里控制哪些转发流量允许通过。
  4. 转发前最后一关:POSTROUTING链,执行 mangle、nat 表规则(比如做 SNAT 源地址转换,把内网 IP 换成公网 IP)。
  5. 从出口网卡发出去。

场景 3:出站流量(本机程序主动发出去的数据包)

比如你在服务器上执行ping baidu.com,数据包是本机产生的,发往外部。完整路径

用户空间程序产生数据包 → OUTPUT 链(raw → mangle → nat → filter) → 路由判断:选哪个网卡、下一跳地址 → POSTROUTING 链(mangle → nat) → 从网卡发出去

逐步骤解释:

  1. 本机程序生成数据包,首先进入OUTPUT链,依次执行 raw、mangle、nat、filter 表的规则。
    • filter 表在这里控制本机能不能往外发数据。
  2. 路由决策:确定从哪个网卡发出去,下一跳地址是多少。
  3. 最后经过POSTROUTING链处理,然后从网卡发出。

新手记忆技巧:

  • 只要是进来的包,必过 PREROUTING
  • 只要是出去的包,必过 POSTROUTING
  • 发给本机的,走 INPUT
  • 本机发出去的,走 OUTPUT
  • 路过转发的,走 FORWARD

四、规则的匹配与执行逻辑

每条链上可以写很多条规则,这些规则的执行逻辑非常明确,新手一定要记住两个核心原则。

1. 顺序匹配,命中即停

同一张表的同一条链上,规则是从上到下按顺序逐条匹配的:

  1. 数据包匹配到第一条规则:如果命中,就执行这条规则的动作(ACCEPT/DROP 等),不再往下匹配后面的规则
  2. 如果没命中,就继续匹配下一条规则。
  3. 如果所有规则都没命中,就执行这条链的默认策略(Policy)

举个例子: INPUT 链从上到下写了三条规则:

  1. 允许 192.168.1.100 访问 22 端口
  2. 拒绝 192.168.1.200 所有访问
  3. 允许所有 IP 访问 80 端口

如果 192.168.1.100 来访问 22 端口,匹配到第一条就直接放行了,不会再检查后面两条。

2. 默认策略:兜底规则

所有规则都没匹配中时,就执行链的默认策略,一般只有两种:

  • ACCEPT:默认全部放行(黑名单模式,只拦指定的)
  • DROP:默认全部丢弃(白名单模式,只放指定的)

安全最佳实践:生产环境一律用白名单模式,默认策略设为 DROP,只手动开放需要的端口和 IP,安全性最高。 ⚠️ 再次提醒:远程操作时,一定要先加放行 SSH 的规则,再把默认策略改成 DROP,不然会把自己关在外面。

3. 常见处理动作(Target)

匹配到规则后,执行的动作,新手常用的有这几个:

动作含义适用表说明
ACCEPT放行数据包所有表允许通过,不再匹配后续规则
DROP静默丢弃所有表直接丢掉数据包,不给对方任何回应,对方表现为连接超时,更安全
REJECT拒绝并返回错误filter拒绝的同时给对方发「连接被拒绝」的包,对方立刻知道端口不通,适合调试
SNAT源地址转换nat(POSTROUTING)修改数据包的源 IP,内网共享上网用
DNAT目标地址转换nat(PREROUTING)修改数据包的目标 IP / 端口,端口映射用
LOG记录日志所有表不处理数据包,只把匹配信息写到系统日志里,然后继续匹配下一条规则,调试排错用

五、进阶核心:连接跟踪机制(conntrack)

iptables 不只是静态的端口过滤,它是有状态的防火墙,核心就是内核里的conntrack(连接跟踪)模块。

1. 什么是连接跟踪

内核会记录所有经过的网络连接的状态,比如:

  • 这个连接是刚发起的?
  • 还是已经建立好的?
  • 还是相关联的辅助连接?

我们可以直接根据「连接状态」来写规则,而不用逐个端口写。

2. 四种常见连接状态

状态含义举例
NEW新连接客户端第一次发 SYN 包,发起新的 TCP 连接
ESTABLISHED已建立的连接三次握手完成后,正常通信的连接,双向都算
RELATED相关连接和某个已有连接相关联的新连接,比如 FTP 的数据连接、ICMP 错误回应
INVALID无效连接无法识别状态、格式错误的数据包

3. 最经典的实用规则

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  • 作用:允许所有「已建立的连接」和「相关连接」通过。
  • 为什么好用: 只要是你本机主动向外发起的连接,对方回应的数据包自动属于ESTABLISHED状态,直接就能回来,不用单独给每个服务开入站端口。 比如你在服务器上访问外网、下载软件,回应的数据包自动放行,不用额外写规则。
  • 这是几乎所有标准防火墙配置都会加的一条规则,也是状态防火墙的精髓。

六、原理层面的补充说明

1. iptables 规则存在哪里?

  • 运行时规则:存在内核内存里,重启系统就全部丢失,所以需要用iptables-save保存到文件,开机再加载。
  • 永久保存:不同发行版有不同的工具,比如iptables-persistentfirewalldufw,本质都是开机时把规则重新加载进内核。

2. 和新一代 nftables 的关系

iptables 已经有几十年历史了,新一代的 Linux 内核正在用nftables替代它。

  • nftables 语法更简洁、功能更强、性能更好,支持更复杂的规则。
  • 但目前绝大多数服务器、嵌入式系统(比如你的 OK62xx)依然广泛使用 iptables,原理是相通的,学会 iptables 再转 nftables 非常快。
  • ufw、firewalld 这些上层工具,新版也已经开始底层调用 nftables 了,但对用户透明,你感觉不到变化。

3. 为什么嵌入式 Linux 都用 iptables

因为 iptables 依赖的 netfilter 是内核原生的,不需要额外运行守护进程,占用资源极少,非常适合嵌入式这种资源有限的场景;而 firewalld 需要运行后台服务,占用资源更多,嵌入式很少用。


七、结合之前的命令,对应原理复盘

我们拿之前最常用的一条命令,对应到原理上,帮你把实操和原理串起来:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

对应原理拆解:

  1. :没写-t,默认操作filter表(过滤功能)。
  2. INPUT链,也就是「目标是本机的入站数据包」这个位置。
  3. 操作-A追加,把规则加到链的末尾。
  4. 匹配条件-p tcp匹配 TCP 协议,--dport 22匹配目标端口 22。
  5. 动作-j ACCEPT,匹配到就放行。
  6. 生效位置:当外部访问本机 22 端口的数据包,经过 INPUT 链的 filter 表时,会匹配到这条规则,直接放行。