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规则需要将源IP1.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。