1_iptables全景认知

如果你的工作涉及 Linux 服务器管理、容器化部署、网络排障中的任何一项,iptables 都是绑定在底层的核心知识。

场景举例涉及的核心能力
服务器安全加固只允许 SSH + HTTP 访问,拒绝其他一切流量filter 表、INPUT 链
内网共享上网多台内网机器通过一台有公网 IP 的网关上网nat 表、SNAT/MASQUERADE
端口转发外网访问网关 8080 → 内网 Web 服务器 80nat 表、DNAT
限流防攻击限制每秒最多 10 个新连接,防止 SYN Floodlimit/connlimit 扩展模块
容器网络Docker -p 8080:80 端口映射,底层就是 DNAT理解 Docker 自动生成的规则
K8s Servicekube-proxy iptables 模式下,ClusterIP → Pod 路由全靠 iptables理解 K8s 网络链路
策略路由不同来源的流量走不同出口线路mangle 表、MARK

1. 防火墙分类

1.1 按作用范围

  • 主机防火墙:保护单台机器,比如你的云服务器。本文重点。
  • 网络防火墙:部署在网络边界,保护整个内网。iptables 也能胜任(通过 FORWARD 链)。

两者不冲突。类比:小区有大门保安(网络防火墙),每户还有自己的门锁(主机防火墙)。

1.2 按实现方式

  • 硬件防火墙:专用设备芯片级处理,性能高、价格贵(如 Cisco ASA、华为 USG)。
  • 软件防火墙:运行在通用服务器上,性能低但成本低。iptables 属于这类。

2. Iptables 和 Netfilter 的关系

这是初学者最容易搞混的概念。

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#3B82F6', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#2563EB', 'lineColor': '#60A5FA', 'secondaryColor': '#10B981', 'tertiaryColor': '#F59E0B'}}}%%
flowchart TD
    subgraph US [用户空间]
        A["iptables 命令行工具"]
    end

    subgraph KS [内核空间]
        B["netfilter 框架"]
    end

    A -->|"通过 netlink 下发规则"| B

    classDef userspace fill:#3B82F6,stroke:#2563EB,color:#fff
    classDef kernel fill:#10B981,stroke:#059669,color:#fff

    class A userspace
    class B kernel

一句话:netfilter 是干活的(内核模块),iptables 是指挥的(命令行工具)。

类比:netfilter 像小区保安团队,iptables 像物业管理软件。你在软件里设置 “ 不让外卖进小区 “,保安团队负责执行。卸掉管理软件,保安还在,只是无法方便地下达指令。

service iptables start 启动的不是守护进程。netfilter 作为内核模块始终在运行,iptables 只是配置工具。

3. Netfilter 的五个钩子

netfilter 在内核网络协议栈的 5 个关键位置埋设了钩子(hook),每个钩子对应 iptables 的一条链。

为什么是 5 个?因为数据包在 Linux 内核的生命周期中恰好有 5 个关键决策点:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#3B82F6', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#2563EB', 'lineColor': '#60A5FA', 'secondaryColor': '#10B981', 'tertiaryColor': '#F59E0B'}}}%%
flowchart TD
    A["网卡接收数据包"] --> B["① PREROUTING"]
    B --> C{"路由判断"}
    C -->|"目标是本机"| D["② INPUT"]
    C -->|"目标是其他主机"| E["③ FORWARD"]
    D --> F["本机应用程序"]
    F --> G["④ OUTPUT"]
    G --> H{"路由判断"}
    E --> I["⑤ POSTROUTING"]
    H --> I
    I --> J["网卡发出数据包"]

    classDef hook fill:#3B82F6,stroke:#2563EB,color:#fff
    classDef routing fill:#F59E0B,stroke:#D97706,color:#fff
    classDef endpoint fill:#10B981,stroke:#059669,color:#fff

    class B,D,E,G,I hook
    class C,H routing
    class A,J,F endpoint

3.1 五条链的设计动机

逐个理解 “ 为什么要在这里设一个检查点 “:

内核钩子时机设计动机
PREROUTINGNF_INET_PRE_ROUTING数据包刚进入,未做路由判断DNAT 的唯一时机——必须在路由前改目标地址,否则路由判断用的还是原地址
INPUTNF_INET_LOCAL_IN路由判断后,确认发给本机保护本机应用的最后一道关卡
FORWARDNF_INET_FORWARD路由判断后,确认需要转发控制 “ 经过本机但不给本机 “ 的流量,即网络防火墙
OUTPUTNF_INET_LOCAL_OUT本机应用发出数据包控制本机主动对外发送的流量
POSTROUTINGNF_INET_POST_ROUTING数据包即将离开,路由已确定SNAT 的唯一时机——必须在出去前改源地址,否则对端回包找不到你

类比——公司收发室:

  • PREROUTING = 收发室收到信件,发现收件人已离职,把收件人改成接替者(→ DNAT)
  • INPUT = 前台把信交给本公司员工,先检查是否安全
  • FORWARD = 信不是寄给本公司的,收发室直接转寄到下一站(经手但不拆封)
  • OUTPUT = 本公司员工寄出一封信,前台检查内容合规
  • POSTROUTING = 信即将投出,把寄件人从 “ 张三 “ 改成 “XX 公司前台 “(→ SNAT),这样回信寄到前台,再由前台转给张三

3.2 三条典型路径

理解了五个钩子,数据包的路径就清晰了:

路径一:外部 → 本机进程(比如访问你的 Web 服务)

1
网卡 → PREROUTING → 路由判断 → INPUT → 应用程序

路径二:本机转发(比如网关帮内网机器上网)

1
网卡 → PREROUTING → 路由判断 → FORWARD → POSTROUTING → 网卡

路径三:本机进程 → 外部(比如服务器发 HTTP 请求)

1
应用程序 → OUTPUT → 路由判断 → POSTROUTING → 网卡

4. 四张表:按功能分组

上一节讲了五条链是 “ 在哪里检查 “,这一节讲 “ 检查什么 “——也就是表。

iptables 把规则按功能分到 4 张表里。为什么不放在一起?

继续用公司收发室的例子。一封信到了收发室,不同岗位的人各管一件事:

  • 保安(filter):这封信能不能放行?有没有可疑物?
  • 地址改写员(nat):信封上的收件人或寄件人要不要改?
  • 标签员(mangle):要不要贴 “ 加急 “” 机密 “ 标签,改变处理优先级?
  • 前台登记员(raw):这封信要不要登记来往记录?VIP 部门间的内部信,可以跳过登记。

如果这四件事全让一个人干,速度慢还容易出错。分岗就清晰了。

4.1 四张表详解

Filter 表——保安岗(最常用)

保安只管一件事:这封信放不放行。

  • 功能:决定数据包放行、拒绝或丢弃
  • 内核模块:iptables_filter
  • 可用链:INPUT、FORWARD、OUTPUT
  • 使用频率:最高,90% 的日常操作在这张表

为什么 filter 没有 PREROUTING 和 POSTROUTING?保安要先知道信是寄给谁的(路由判断后),才能决定放不放行。信刚到收发室(PREROUTING)时还没拆分去向,保安无从判断。

Nat 表——地址改写员

改写员负责改信封上的地址:收件人改写(DNAT)或寄件人改写(SNAT)。

  • 功能:修改数据包的源地址或目标地址
  • 内核模块:iptable_nat
  • 可用链:PREROUTING、INPUT(CentOS 7+)、OUTPUT、POSTROUTING
  • 典型场景:内网共享上网(SNAT)、端口转发(DNAT)

为什么 nat 没有 FORWARD?FORWARD 是保安决定 “ 转不转寄 “ 的岗位,不是改地址的地方。改收件人必须在分拣前(PREROUTING),改寄件人必须在投递前(POSTROUTING)。

Mangle 表——标签员

标签员不管信的内容,只管在信封上贴标签、改优先级。

  • 功能:修改数据包 IP 头字段(TTL、TOS、MARK)
  • 内核模块:iptable_mangle
  • 可用链:全部 5 条链
  • 典型场景:策略路由(给包打 MARK,按 MARK 选择路由表)

mangle 能用于所有 5 条链——贴标签这件事,在收发流程的任何环节都可能需要。

Raw 表——登记豁免

前台默认会给每封信登记来往记录(conntrack),方便追踪回信。但有些信不需要追踪(比如大量的广告邮件),raw 表决定哪些信跳过登记。

  • 功能:决定数据包是否被 conntrack 系统追踪
  • 内核模块:iptable_raw
  • 可用链:PREROUTING、OUTPUT
  • 典型场景:高流量服务器上,对不需要跟踪的流量(如 DNS)跳过 conntrack 以节省资源

raw 优先级最高——要不要登记必须在其他一切处理之前决定,否则来不及跳过。

4.2 表的优先级

一条链上同时有多张表的规则时,执行顺序:

%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#3B82F6', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#2563EB', 'lineColor': '#60A5FA', 'secondaryColor': '#10B981', 'tertiaryColor': '#F59E0B'}}}%%
flowchart LR
    R["raw"] --> M["mangle"] --> N["nat"] --> F["filter"]

    classDef step1 fill:#EF4444,stroke:#DC2626,color:#fff
    classDef step2 fill:#F59E0B,stroke:#D97706,color:#fff
    classDef step3 fill:#3B82F6,stroke:#2563EB,color:#fff
    classDef step4 fill:#10B981,stroke:#059669,color:#fff

    class R step1
    class M step2
    class N step3
    class F step4

为什么是这个顺序?按逻辑链推导:

  1. raw 最先:先决定要不要追踪这个包(不追踪则后续 state 匹配不可用)
  2. mangle 其次:在地址转换前把标签打好
  3. nat 再次:改地址要在过滤之前——filter 应该看到转换后的地址
  4. filter 最后:一切修改完成后,做最终的放行/拒绝决策

4.3 表和链的交叉关系

PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING
raw
mangle
nat
filter

阅读方法:比如你想在数据包进入本机时做过滤,就去 filter 表的 INPUT 链加规则。

5. 规则的本质:匹配条件 + 动作

每条 iptables 规则由两部分组成:

1
如果数据包满足 [匹配条件],就执行 [动作]

类比——保安查名单:保安手里有一份清单(规则列表),每来一个人(数据包),从第一行开始逐条对照:

  1. 名字叫张三 → 拒绝入内(DROP)
  2. 穿红色衣服 → 登记后放行(LOG + ACCEPT)
  3. 来自 A 公司 → 放行(ACCEPT)
  4. ……
  5. 以上都不匹配 → 执行默认策略(policy)

关键规则:匹配到第一条就停止。如果张三穿红色衣服且来自 A 公司,会被第 1 条拦下来,不会走到第 2、3 条。

5.1 匹配条件

分两类:

  • 基本匹配:源 IP(-s)、目标 IP(-d)、协议(-p)、网卡(-i / -o
  • 扩展匹配:需加载扩展模块(-m),如端口(--dport)、连接状态(--state)、IP 范围(--src-range

详细用法在 第二篇 逐一实操。

5.2 处理动作

动作作用类比
ACCEPT放行保安挥手放行
DROP静默丢弃,不回应保安假装没看见,来人只能干等
REJECT拒绝并回复 “ 不可达 “保安明确说 “ 你不能进 “
LOG记录日志,继续匹配下一条保安拍照存档,但不阻拦
SNAT修改源地址换信封上的寄件人
DNAT修改目标地址换信封上的收件人
MASQUERADE动态 SNAT(自动用出口网卡 IP)寄件人写 “XX 公司 “ 而非具体某人
REDIRECT本机端口重定向把寄到 1 楼的信转到 3 楼
MARK给数据包打标记(不修改包本身)给包裹贴 “ 加急 “ 便签

DROP vs REJECT 怎么选?

  • 对外用 DROP:攻击者得不到反馈,增加探测成本
  • 对内用 REJECT:内部服务之间出问题时,REJECT 让调用方立刻报错而不是等超时

6. 速查:四表五链一句话总结

一句话
filter决定放行还是拒绝(保安)
nat改写源或目标地址(地址改写员)
mangle修改 IP 头字段、打标记(标签员)
raw决定是否跳过连接追踪(登记豁免)
一句话
PREROUTING数据包刚进入,路由判断前——改目标地址(DNAT)的唯一时机
INPUT路由后确认发给本机——保护本机应用的关卡
FORWARD路由后确认需要转发——网络防火墙的核心
OUTPUT本机应用发出数据包——控制出站流量
POSTROUTING数据包即将离开——改源地址(SNAT)的唯一时机

下一篇:iptables 规则实战 —— 从第一条规则开始,掌握 filter 表的增删改查、匹配条件和规则持久化。