1_iptables全景认知
如果你的工作涉及 Linux 服务器管理、容器化部署、网络排障中的任何一项,iptables 都是绑定在底层的核心知识。
| 场景 | 举例 | 涉及的核心能力 |
|---|---|---|
| 服务器安全加固 | 只允许 SSH + HTTP 访问,拒绝其他一切流量 | filter 表、INPUT 链 |
| 内网共享上网 | 多台内网机器通过一台有公网 IP 的网关上网 | nat 表、SNAT/MASQUERADE |
| 端口转发 | 外网访问网关 8080 → 内网 Web 服务器 80 | nat 表、DNAT |
| 限流防攻击 | 限制每秒最多 10 个新连接,防止 SYN Flood | limit/connlimit 扩展模块 |
| 容器网络 | Docker -p 8080:80 端口映射,底层就是 DNAT | 理解 Docker 自动生成的规则 |
| K8s Service | kube-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 endpoint3.1 五条链的设计动机
逐个理解 “ 为什么要在这里设一个检查点 “:
| 链 | 内核钩子 | 时机 | 设计动机 |
|---|---|---|---|
| PREROUTING | NF_INET_PRE_ROUTING | 数据包刚进入,未做路由判断 | DNAT 的唯一时机——必须在路由前改目标地址,否则路由判断用的还是原地址 |
| INPUT | NF_INET_LOCAL_IN | 路由判断后,确认发给本机 | 保护本机应用的最后一道关卡 |
| FORWARD | NF_INET_FORWARD | 路由判断后,确认需要转发 | 控制 “ 经过本机但不给本机 “ 的流量,即网络防火墙 |
| OUTPUT | NF_INET_LOCAL_OUT | 本机应用发出数据包 | 控制本机主动对外发送的流量 |
| POSTROUTING | NF_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为什么是这个顺序?按逻辑链推导:
- raw 最先:先决定要不要追踪这个包(不追踪则后续 state 匹配不可用)
- mangle 其次:在地址转换前把标签打好
- nat 再次:改地址要在过滤之前——filter 应该看到转换后的地址
- filter 最后:一切修改完成后,做最终的放行/拒绝决策
4.3 表和链的交叉关系
| PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING | |
|---|---|---|---|---|---|
| raw | ✅ | ✅ | |||
| mangle | ✅ | ✅ | ✅ | ✅ | ✅ |
| nat | ✅ | ✅ | ✅ | ✅ | |
| filter | ✅ | ✅ | ✅ |
阅读方法:比如你想在数据包进入本机时做过滤,就去 filter 表的 INPUT 链加规则。
5. 规则的本质:匹配条件 + 动作
每条 iptables 规则由两部分组成:
1 | 如果数据包满足 [匹配条件],就执行 [动作] |
类比——保安查名单:保安手里有一份清单(规则列表),每来一个人(数据包),从第一行开始逐条对照:
- 名字叫张三 → 拒绝入内(DROP)
- 穿红色衣服 → 登记后放行(LOG + ACCEPT)
- 来自 A 公司 → 放行(ACCEPT)
- ……
- 以上都不匹配 → 执行默认策略(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 表的增删改查、匹配条件和规则持久化。