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_ROUTING | PREROUTING | 数据包刚进入网卡,还没做路由判断之前 | 高速路入口收费站,还没决定走哪条路 |
| NF_IP_LOCAL_IN | INPUT | 路由判断后,目标是本机,即将进入用户空间 | 进入市区的检查站,目的地是本地 |
| NF_IP_FORWARD | FORWARD | 路由判断后,目标不是本机,要转发给其他机器 | 绕城高速过境检查站,只是路过不停留 |
| NF_IP_LOCAL_OUT | OUTPUT | 本机用户空间的程序产生的数据包,刚发出来,还没做路由 | 市区车辆出城检查站,从本地出发 |
| NF_IP_POST_ROUTING | POSTROUTING | 所有数据包,即将离开网卡之前 | 高速路出口收费站,马上要离开系统 |
核心逻辑:数据包一定会按顺序经过对应的钩子点,我们在对应的链上写规则,就能在对应位置拦截处理数据包。
二、iptables 的核心架构:四表五链
很多新手听到「四表五链」会觉得复杂,其实它是两个维度的分类,逻辑非常清晰:
- 链(Chain):按「位置」分类 —— 你要在数据包的哪个阶段处理它(对应上面 5 个钩子点)。
- 表(Table):按「功能」分类 —— 你要对数据包做什么类型的操作,同类功能的规则放在同一张表里。
简单说:表是功能分组,链是位置分组;每张表可以挂载在多条链上,每条链上可以有多张表的规则。
1. 四张表的功能与优先级
四张表按优先级从高到低排序,数据包到达一个钩子点时,会按这个顺序依次执行不同表的规则:raw>mangle>nat>filter
(1)filter 表:过滤表(新手 99% 的场景都用它)
- 核心功能:判断数据包要不要放行、要不要丢弃,也就是传统意义上的「防火墙功能」。
- 支持的链:
INPUT、FORWARD、OUTPUT - 通俗类比:安检口,只负责判断「能不能过」,不修改数据包内容。
- 特点:最常用、最基础,我们之前讲的端口放行、IP 拉黑,全都是在 filter 表里操作。
- 注意:
iptables命令不写-t 表名时,默认操作的就是 filter 表。
(2)nat 表:地址转换表
- 核心功能:修改数据包的源 IP / 目标 IP、源端口 / 目标端口,也就是网络地址转换(NAT)。
- 支持的链:
PREROUTING、OUTPUT、POSTROUTING - 常见场景:
- SNAT(源地址转换):让内网机器通过一个公网 IP 上网,在
POSTROUTING链做。 - DNAT(目标地址转换):把公网端口映射到内网机器,在
PREROUTING链做。 - 端口转发、IP 映射都属于 nat 表的功能。
- SNAT(源地址转换):让内网机器通过一个公网 IP 上网,在
(3)mangle 表:修改数据包表
- 核心功能:修改数据包本身的属性,比如修改 TTL、TOS、给数据包打标记(mark)。
- 支持的链:所有 5 条链都支持
- 特点:功能很底层,新手很少直接用,一般是高级路由、QoS 流量整形的时候才会用到。
(4)raw 表:原始状态表
- 核心功能:最高优先级,用来给特定数据包跳过连接跟踪机制,也就是不做状态检测。
- 支持的链:
PREROUTING、OUTPUT - 特点:非常少用,只有在特殊高性能场景下,不想让系统做状态跟踪的时候才用。
新手入门阶段,只需要掌握 filter 表,了解 nat 表即可,另外两张表日常几乎碰不到。
2. 五链与四表的对应关系
总结一下:每条链上挂载了哪些表的规则(按执行优先级排序):
| 链名 | 挂载的表(优先级从高到低) | 触发场景 |
|---|---|---|
| PREROUTING | raw → mangle → nat | 所有入站数据包,刚进网卡还没路由 |
| INPUT | mangle → filter | 目标是本机的入站数据包,即将进用户空间 |
| FORWARD | mangle → filter | 目标不是本机,需要转发的数据包 |
| OUTPUT | raw → mangle → nat → filter | 本机产生的出站数据包,刚发出来 |
| POSTROUTING | mangle → nat | 所有出站 / 转发数据包,即将离开网卡 |
三、最关键:数据包的完整流转路径
理解了表和链,现在把它们串起来,看一个数据包在系统里到底是怎么走的。一共分三种典型场景,我们逐个走一遍流程。
场景 1:入站流量(目标是本机的数据包)
比如外面有人 SSH 连接你的服务器,数据包目标 IP 是本机地址。完整路径:
网卡进来 → PREROUTING 链(raw → mangle → nat) → 路由判断:目标是本机 → INPUT 链(mangle → filter) → 到达本机用户空间的程序(比如 sshd)逐步骤解释:
- 数据包从物理网卡进入系统,首先到
PREROUTING链,依次执行 raw、mangle、nat 表的规则(比如做 DNAT 端口映射)。 - 内核做路由判断:看目标 IP 是不是本机的,确认是本机流量。
- 数据包进入
INPUT链,依次执行 mangle、filter 表的规则。- filter 表就是我们平时写的端口放行、IP 拦截规则,在这里决定「允许通过」还是「丢弃」。
- 通过 INPUT 检查后,数据包交给上层应用程序处理。
场景 2:转发流量(目标不是本机,只是路过)
比如你的 Linux 机器当路由器,内网机器访问外网,数据包只是经过它转发。完整路径:
网卡进来 → PREROUTING 链(raw → mangle → nat) → 路由判断:目标不是本机,需要转发 → FORWARD 链(mangle → filter) → POSTROUTING 链(mangle → nat) → 从网卡发出去逐步骤解释:
- 同样先经过
PREROUTING链处理。 - 路由判断:目标 IP 不是本机,需要转发给其他机器。
- 进入
FORWARD链,执行 mangle、filter 表的规则 —— 在这里控制哪些转发流量允许通过。 - 转发前最后一关:
POSTROUTING链,执行 mangle、nat 表规则(比如做 SNAT 源地址转换,把内网 IP 换成公网 IP)。 - 从出口网卡发出去。
场景 3:出站流量(本机程序主动发出去的数据包)
比如你在服务器上执行ping baidu.com,数据包是本机产生的,发往外部。完整路径:
用户空间程序产生数据包 → OUTPUT 链(raw → mangle → nat → filter) → 路由判断:选哪个网卡、下一跳地址 → POSTROUTING 链(mangle → nat) → 从网卡发出去逐步骤解释:
- 本机程序生成数据包,首先进入
OUTPUT链,依次执行 raw、mangle、nat、filter 表的规则。- filter 表在这里控制本机能不能往外发数据。
- 路由决策:确定从哪个网卡发出去,下一跳地址是多少。
- 最后经过
POSTROUTING链处理,然后从网卡发出。
新手记忆技巧:
- 只要是进来的包,必过 PREROUTING
- 只要是出去的包,必过 POSTROUTING
- 发给本机的,走 INPUT
- 本机发出去的,走 OUTPUT
- 路过转发的,走 FORWARD
四、规则的匹配与执行逻辑
每条链上可以写很多条规则,这些规则的执行逻辑非常明确,新手一定要记住两个核心原则。
1. 顺序匹配,命中即停
同一张表的同一条链上,规则是从上到下按顺序逐条匹配的:
- 数据包匹配到第一条规则:如果命中,就执行这条规则的动作(ACCEPT/DROP 等),不再往下匹配后面的规则。
- 如果没命中,就继续匹配下一条规则。
- 如果所有规则都没命中,就执行这条链的默认策略(Policy)。
举个例子: INPUT 链从上到下写了三条规则:
- 允许 192.168.1.100 访问 22 端口
- 拒绝 192.168.1.200 所有访问
- 允许所有 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-persistent、firewalld、ufw,本质都是开机时把规则重新加载进内核。
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对应原理拆解:
- 表:没写
-t,默认操作filter表(过滤功能)。 - 链:
INPUT链,也就是「目标是本机的入站数据包」这个位置。 - 操作:
-A追加,把规则加到链的末尾。 - 匹配条件:
-p tcp匹配 TCP 协议,--dport 22匹配目标端口 22。 - 动作:
-j ACCEPT,匹配到就放行。 - 生效位置:当外部访问本机 22 端口的数据包,经过 INPUT 链的 filter 表时,会匹配到这条规则,直接放行。
