iptables 数据包流程图详解:一张图彻底搞懂数据包的完整路径

发布于 2025-10-29 分类: Linux

在上一章,我们认识了iptables的四大核心组件:表(Table)、链(Chain)、规则(Rule)和动作(Target)。我们知道了“门卫”有不同的“工作手册”(表)和固定的“检查站”(链)。

但是,一个数据包究竟会先经过哪个检查站,后经过哪个检查站?在每个检查站,门卫会按什么顺序翻阅他的手册?这些问题是掌握iptables的关键,也是最容易让人困惑的地方。

本章的核心任务,就是通过一张清晰的 iptables 数据包流程图,并结合三大场景进行 详解,彻底解答 数据包如何通过iptables 这个问题,让你在脑海中形成一幅动态的、清晰的路径图。

2.1 iptables 数据包流程图详解(灵魂核心)

这张图是理解iptables数据包流转过程的灵魂,也是本次 iptables 数据包流程图详解 的核心。请务必花时间理解并记住它。它描绘了数据包在Linux内核网络协议栈中流经iptables(Netfilter钩子)的完整过程。

(这里假设会有一张高质量的原创流程图,文字将围绕这张图展开描述)

流程图核心要素解读:

  • 菱形方框:代表内核进行路由决策的点,这是决定数据包走向的关键分叉路。
  • 矩形方框:代表iptables的五大内置链(检查站)。
  • 链内的表:在每个链(检查站)内部,清晰地标出了数据包会依次经过哪些表。这个顺序是固定的!raw -> mangle -> nat -> filter。注意,并非所有链都包含所有表的功能。
  • 箭头:表示数据包的流向。

(请将上面链接替换为实际的流程图URL。在没有实际图片的情况下,我将用文字详细描述图中的流程。)

文字描述流程图:

一个数据包的旅程始于网卡(NIC)的接收。

  1. 入口 -> PREROUTING:

    • 所有进入的数据包,无论目的地是谁,第一站都是 PREROUTING
    • 在这里,会依次经过 raw -> mangle -> nat 表。
    • nat 表的 DNAT (目的地址转换) 操作就在这里发生。
  2. 路由决策 (Routing Decision):

    • 内核检查数据包的目的IP地址。
    • 情况A:目的地是本机 -> 数据包转向 INPUT 链。
    • 情况B:目的地不是本机 (本机只是个路由器) -> 数据包转向 FORWARD 链。
  3. 场景一:访问本机服务 (目的地是本机)

    • PREROUTING 链 -> 路由决策 -> INPUT:
      • 进入 INPUT 链后,依次经过 mangle -> filter 表。
      • filter 表在这里扮演核心角色,决定是否允许数据包访问本机应用。
    • -> 本地应用 (Local Process):
      • 如果被filter表接受,数据包最终被送达本地的应用程序(如SSH、Web服务器)。
  4. 场景二:本机访问外部 (由本机产生)

    • 本地应用 (Local Process) -> OUTPUT:
      • 本机应用产生的数据包,第一站是 OUTPUT 链。
      • 在这里,依次经过 raw -> mangle -> nat -> filter 表。
      • nat 表的 DNAT 也可以在这里对本地产生的包进行操作。
    • -> 再次路由决策:
      • 内核再次对这个即将发出的包进行路由决策。
    • -> POSTROUTING:
      • 这是数据包离开前的最后一站。
  5. 场景三:本机作为路由器转发 (目的地非本机)

    • PREROUTING 链 -> 路由决策 -> FORWARD:
      • 进入 FORWARD 链后,依次经过 mangle -> filter 表。
      • filter 表在这里决定是否允许本机转发这个数据包。这是构建路由防火墙的核心。
    • -> POSTROOUTING:
      • 转发的包通过FORWARD链后,也来到 POSTROUTING 链。
  6. 出口 -> POSTROUTING:

    • 所有即将离开本机的数据包(无论是本机产生的,还是被转发的)都会汇集于此。
    • 在这里,依次经过 mangle -> nat 表。
    • nat 表的 SNAT (源地址转换) 和 MASQUERADE 操作就在这里发生。
    • -> 网卡 (NIC) 发出:
      • 通过 POSTROUTING 链后,数据包正式从网卡发出。

2.2 三大核心场景实战解析

让我们通过三个最常见的网络场景,来重新走一遍 iptables 数据包流程图,加深理解。

场景一:外部主机SSH访问本机 (INPUT路径)

假设你的服务器IP是 1.2.3.4,一台外部电脑 5.6.7.8 尝试SSH连接你的22端口。

  1. 数据包 (源IP: 5.6.7.8, 目的IP: 1.2.3.4, 目的端口: 22) 到达你的网卡。
  2. 进入 PREROUTING
    • raw 表检查是否要豁免连接跟踪。
    • mangle 表检查是否需要做标记。
    • nat 表检查是否有 DNAT 规则(比如把22端口转发到其他端口,这里假设没有)。
  3. 路由决策:内核发现目的IP 1.2.3.4 就是本机,决定将数据包送往 INPUT
  4. 进入 INPUT
    • mangle 表再次检查。
    • filter开始工作,这是关键!它会查找规则:
      • iptables -A INPUT -p tcp --dport 22 -s 5.6.7.8 -j ACCEPT
      • 如果找到匹配的 ACCEPT 规则,数据包通过。
      • 如果被 DROPREJECT,旅程到此结束。
  5. 本地进程:数据包成功抵达SSH服务程序,连接建立。

路径总结网卡 -> PREROUTING -> INPUT -> 本机应用
核心检查点INPUT 链的 filter 表。

场景二:本机 ping baidu.com (OUTPUT路径)

你的服务器 (1.2.3.4) 执行 ping baidu.com

  1. 本地进程 (ping 程序) 生成一个ICMP请求包 (源IP: 1.2.3.4, 目的IP: 百度服务器IP)。
  2. 数据包被交给内核,进入 OUTPUT
    • raw, mangle, nat 表依次检查。
    • filter检查是否有规则阻止本机发出ICMP包。比如,一条 iptables -A OUTPUT -p icmp -j DROP 规则就会在这里拦下它。
  3. 路由决策:内核决定通过哪个网卡(如 eth0)将数据包发出。
  4. 进入 POSTROUTING
    • mangle 表最后一次检查。
    • nat 表检查是否有 SNAT 规则需要将源IP 1.2.3.4 修改成其他地址(通常在家庭网关场景下)。
  5. 网卡:数据包从网卡发出,飞向互联网。

路径总结本机应用 -> OUTPUT -> POSTROUTING -> 网卡
核心检查点OUTPUT 链的 filter 表。

场景三:本机作为家庭网关,内网电脑上网 (FORWARD路径)

你的Linux主机有两个网卡:eth0 (连接外网,IP 1.2.3.4) 和 eth1 (连接内网,IP 192.168.1.1)。内网电脑 (192.168.1.100) 想要访问 baidu.com

  1. 内网电脑的数据包 (源IP: 192.168.1.100, 目的IP: 百度IP) 到达网关的 eth1 网卡。
  2. 进入 PREROUTINGraw, mangle, nat 表依次检查。
  3. 路由决策:内核发现目的IP不是本机,但根据路由表,知道可以从 eth0 发出。于是决定将数据包送往 FORWARD
  4. 进入 FORWARD
    • mangle 表检查。
    • filter工作,这是路由防火墙的核心!你需要有规则允许转发:
      • iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
      • 如果 FORWARD 链的默认策略是 DROP,且没有上述 ACCEPT 规则,内网电脑将无法上网。
  5. 进入 POSTROUTING
    • mangle 表检查。
    • nat工作,这是实现共享上网的关键!它会查找 SNATMASQUERADE 规则:
      • iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      • 这条规则会将数据包的源IP 192.168.1.100 伪装 成网关的外网IP 1.2.3.4
  6. 网卡:被修改了源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


-- 感谢阅读 --