Linux系统基础11:iptables 基本原理 新手超详细详解 Linux iptables 基本原理 新手超详细详解目录Linux iptables 基本原理 新手超详细详解一、底层核心netfilter 的 5 个钩子点二、iptables 的核心架构四表五链1. 四张表的功能与优先级1filter 表过滤表新手 99% 的场景都用它2nat 表地址转换表3mangle 表修改数据包表4raw 表原始状态表2. 五链与四表的对应关系三、最关键数据包的完整流转路径场景 1入站流量目标是本机的数据包场景 2转发流量目标不是本机只是路过场景 3出站流量本机程序主动发出去的数据包四、规则的匹配与执行逻辑1. 顺序匹配命中即停2. 默认策略兜底规则3. 常见处理动作Target五、进阶核心连接跟踪机制conntrack1. 什么是连接跟踪2. 四种常见连接状态3. 最经典的实用规则六、原理层面的补充说明1. iptables 规则存在哪里2. 和新一代 nftables 的关系3. 为什么嵌入式 Linux 都用 iptables七、结合之前的命令对应原理复盘很多新手会混淆一个概念iptables 本身不是防火墙它是一个用户态的配置工具真正在内核里执行流量拦截、过滤的核心是netfilter框架。简单说netfilterLinux 内核内置的数据包处理框架在网络协议栈的关键位置埋了「钩子点」可以拦截、修改、丢弃数据包是真正干活的「执行层」。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. 四张表的功能与优先级四张表按优先级从高到低排序数据包到达一个钩子点时会按这个顺序依次执行不同表的规则rawmanglenatfilter1filter 表过滤表新手 99% 的场景都用它核心功能判断数据包要不要放行、要不要丢弃也就是传统意义上的「防火墙功能」。支持的链INPUT、FORWARD、OUTPUT通俗类比安检口只负责判断「能不能过」不修改数据包内容。特点最常用、最基础我们之前讲的端口放行、IP 拉黑全都是在 filter 表里操作。注意iptables命令不写-t 表名时默认操作的就是 filter 表。2nat 表地址转换表核心功能修改数据包的源 IP / 目标 IP、源端口 / 目标端口也就是网络地址转换NAT。支持的链PREROUTING、OUTPUT、POSTROUTING常见场景SNAT源地址转换让内网机器通过一个公网 IP 上网在POSTROUTING链做。DNAT目标地址转换把公网端口映射到内网机器在PREROUTING链做。端口转发、IP 映射都属于 nat 表的功能。3mangle 表修改数据包表核心功能修改数据包本身的属性比如修改 TTL、TOS、给数据包打标记mark。支持的链所有 5 条链都支持特点功能很底层新手很少直接用一般是高级路由、QoS 流量整形的时候才会用到。4raw 表原始状态表核心功能最高优先级用来给特定数据包跳过连接跟踪机制也就是不做状态检测。支持的链PREROUTING、OUTPUT特点非常少用只有在特殊高性能场景下不想让系统做状态跟踪的时候才用。新手入门阶段只需要掌握 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逐步骤解释数据包从物理网卡进入系统首先到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源地址转换natPOSTROUTING修改数据包的源 IP内网共享上网用DNAT目标地址转换natPREROUTING修改数据包的目标 IP / 端口端口映射用LOG记录日志所有表不处理数据包只把匹配信息写到系统日志里然后继续匹配下一条规则调试排错用五、进阶核心连接跟踪机制conntrackiptables 不只是静态的端口过滤它是有状态的防火墙核心就是内核里的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 表时会匹配到这条规则直接放行。