iptables 数据包流程图详解:一张图彻底搞懂数据包的完整路径
在上一章,我们认识了iptables的四大核心组件:表(Table)、链(Chain)、规则(Rule)和动作(Target)。我们知道了“门卫”有不同的“工作手册”(表)和固定的“检查站”(链)。
但是,一个数据包究竟会先经过哪个检查站,后经过哪个检查站?在每个检查站,门卫会按什么顺序翻阅他的手册?这些问题是掌握iptables的关键,也是最容易让人困惑的地方。
本章的核心任务,就是通过一张清晰的 iptables 数据包流程图,并结合三大场景进行 详解,彻底解答 数据包如何通过iptables 这个问题,让你在脑海中形成一幅动态的、清晰的路径图。
2.1 iptables 数据包流程图详解(灵魂核心)
这张图是理解iptables数据包流转过程的灵魂,也是本次 iptables 数据包流程图详解 的核心。请务必花时间理解并记住它。它描绘了数据包在Linux内核网络协议栈中流经iptables(Netfilter钩子)的完整过程。
(这里假设会有一张高质量的原创流程图,文字将围绕这张图展开描述)
流程图核心要素解读:
- 菱形方框:代表内核进行路由决策的点,这是决定数据包走向的关键分叉路。
- 矩形方框:代表iptables的五大内置链(检查站)。
- 链内的表:在每个链(检查站)内部,清晰地标出了数据包会依次经过哪些表。这个顺序是固定的!raw->mangle->nat->filter。注意,并非所有链都包含所有表的功能。
- 箭头:表示数据包的流向。
(请将上面链接替换为实际的流程图URL。在没有实际图片的情况下,我将用文字详细描述图中的流程。)
文字描述流程图:
一个数据包的旅程始于网卡(NIC)的接收。
- 
入口 -> PREROUTING链:- 所有进入的数据包,无论目的地是谁,第一站都是 PREROUTING。
- 在这里,会依次经过 raw->mangle->nat表。
- nat表的- DNAT(目的地址转换) 操作就在这里发生。
 
- 所有进入的数据包,无论目的地是谁,第一站都是 
- 
路由决策 (Routing Decision): - 内核检查数据包的目的IP地址。
- 情况A:目的地是本机 -> 数据包转向 INPUT链。
- 情况B:目的地不是本机 (本机只是个路由器) -> 数据包转向 FORWARD链。
 
- 
场景一:访问本机服务 (目的地是本机) - PREROUTING链 -> 路由决策 ->- INPUT链:- 进入 INPUT链后,依次经过mangle->filter表。
- filter表在这里扮演核心角色,决定是否允许数据包访问本机应用。
 
- 进入 
- -> 本地应用 (Local Process):
- 如果被filter表接受,数据包最终被送达本地的应用程序(如SSH、Web服务器)。
 
- 如果被
 
- 
场景二:本机访问外部 (由本机产生) - 本地应用 (Local Process) -> OUTPUT链:- 本机应用产生的数据包,第一站是 OUTPUT链。
- 在这里,依次经过 raw->mangle->nat->filter表。
- nat表的- DNAT也可以在这里对本地产生的包进行操作。
 
- 本机应用产生的数据包,第一站是 
- -> 再次路由决策:
- 内核再次对这个即将发出的包进行路由决策。
 
- -> POSTROUTING链:- 这是数据包离开前的最后一站。
 
 
- 本地应用 (Local Process) -> 
- 
场景三:本机作为路由器转发 (目的地非本机) - PREROUTING链 -> 路由决策 ->- FORWARD链:- 进入 FORWARD链后,依次经过mangle->filter表。
- filter表在这里决定是否允许本机转发这个数据包。这是构建路由防火墙的核心。
 
- 进入 
- -> POSTROOUTING链:- 转发的包通过FORWARD链后,也来到POSTROUTING链。
 
- 转发的包通过
 
- 
出口 -> POSTROUTING链:- 所有即将离开本机的数据包(无论是本机产生的,还是被转发的)都会汇集于此。
- 在这里,依次经过 mangle->nat表。
- nat表的- SNAT(源地址转换) 和- MASQUERADE操作就在这里发生。
- -> 网卡 (NIC) 发出:
- 通过 POSTROUTING链后,数据包正式从网卡发出。
 
- 通过 
 
2.2 三大核心场景实战解析
让我们通过三个最常见的网络场景,来重新走一遍 iptables 数据包流程图,加深理解。
场景一:外部主机SSH访问本机 (INPUT路径)
假设你的服务器IP是 1.2.3.4,一台外部电脑 5.6.7.8 尝试SSH连接你的22端口。
- 数据包 (源IP: 5.6.7.8,目的IP: 1.2.3.4,目的端口: 22) 到达你的网卡。
- 进入 PREROUTING链。- raw表检查是否要豁免连接跟踪。
- mangle表检查是否需要做标记。
- nat表检查是否有- DNAT规则(比如把22端口转发到其他端口,这里假设没有)。
 
- 路由决策:内核发现目的IP 1.2.3.4就是本机,决定将数据包送往INPUT链。
- 进入 INPUT链。- mangle表再次检查。
- filter表开始工作,这是关键!它会查找规则:- iptables -A INPUT -p tcp --dport 22 -s 5.6.7.8 -j ACCEPT
- 如果找到匹配的 ACCEPT规则,数据包通过。
- 如果被 DROP或REJECT,旅程到此结束。
 
 
- 本地进程:数据包成功抵达SSH服务程序,连接建立。
路径总结:
网卡 -> PREROUTING -> INPUT -> 本机应用
核心检查点:INPUT链的filter表。
场景二:本机 ping baidu.com (OUTPUT路径)
你的服务器 (1.2.3.4) 执行 ping baidu.com。
- 本地进程 (ping程序) 生成一个ICMP请求包 (源IP: 1.2.3.4,目的IP: 百度服务器IP)。
- 数据包被交给内核,进入 OUTPUT链。- raw,- mangle,- nat表依次检查。
- filter表检查是否有规则阻止本机发出ICMP包。比如,一条- iptables -A OUTPUT -p icmp -j DROP规则就会在这里拦下它。
 
- 路由决策:内核决定通过哪个网卡(如 eth0)将数据包发出。
- 进入 POSTROUTING链。- mangle表最后一次检查。
- nat表检查是否有- SNAT规则需要将源IP- 1.2.3.4修改成其他地址(通常在家庭网关场景下)。
 
- 网卡:数据包从网卡发出,飞向互联网。
路径总结:
本机应用 -> OUTPUT -> POSTROUTING -> 网卡
核心检查点:OUTPUT链的filter表。
场景三:本机作为家庭网关,内网电脑上网 (FORWARD路径)
你的Linux主机有两个网卡:eth0 (连接外网,IP 1.2.3.4) 和 eth1 (连接内网,IP 192.168.1.1)。内网电脑 (192.168.1.100) 想要访问 baidu.com。
- 内网电脑的数据包 (源IP: 192.168.1.100,目的IP: 百度IP) 到达网关的eth1网卡。
- 进入 PREROUTING链。raw,mangle,nat表依次检查。
- 路由决策:内核发现目的IP不是本机,但根据路由表,知道可以从 eth0发出。于是决定将数据包送往FORWARD链。
- 进入 FORWARD链。- mangle表检查。
- filter表工作,这是路由防火墙的核心!你需要有规则允许转发:- iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
- 如果 FORWARD链的默认策略是DROP,且没有上述ACCEPT规则,内网电脑将无法上网。
 
 
- 进入 POSTROUTING链。- mangle表检查。
- nat表工作,这是实现共享上网的关键!它会查找- SNAT或- MASQUERADE规则:- iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- 这条规则会将数据包的源IP 192.168.1.100伪装 成网关的外网IP1.2.3.4。
 
 
- 网卡:被修改了源IP的数据包从 eth0网卡发出。
路径总结:
网卡A -> PREROUTING -> FORWARD -> POSTROUTING -> 网卡B
核心检查点:FORWARD链的filter表和POSTROUTING链的nat表。
2.3 “四表五链”关系与优先级总结
现在,我们可以更深刻地理解一些关键问题了。这份 iptables 数据包流程图详解 旨在让你不仅知其然,更知其所以然。
深度分析: PREROUTING和POSTROUTING的区别
- 时机:PREROUTING是 “进来时” 的第一站,在路由决策之前。POSTROUTING是 “出去时” 的最后一站,在所有路由决策之后。
- 功能:
- DNAT(目的地址转换) 必须在- PREROUTING。因为内核需要根据转换后的真实目的IP来决定数据包是送给- INPUT还是- FORWARD。如果等到路由之后再改目的地址,黄花菜都凉了。
- SNAT(源地址转换) 必须在- POSTROUTING。因为内核需要根据原始的源IP进行路由决策(比如决定从哪个口出去)。只有在数据包即将离开的最后一刻,才把它的内网源IP换成公网IP,这样不会影响中间的路由过程。
 
总结表格:表与链的对应关系
为了方便你查阅,这里有一个清晰的表格,总结了哪些表作用于哪些链:
| 表 (Table) | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING | 
|---|---|---|---|---|---|
| raw表 | ✅ | ✅ | |||
| mangle表 | ✅ | ✅ | ✅ | ✅ | ✅ | 
| nat表 | ✅ | ✅ | ✅ | ||
| filter表 | ✅ | ✅ | ✅ | 
处理优先级:在任何一个链中,表的处理顺序都是固定的:raw -> mangle -> nat -> filter。