`iptables` 中的数据包处理按照一定的顺序流经不同的表,每张表有不同的用途和优先级。理解这些表的顺序和它们各自的作用对于网络管理和安全配置至关重要。
### 数据包处理的表顺序
在 `iptables` 中,数据包按以下顺序流经各个表:
1. **raw 表**: 这个表最先被处理,用于配置数据包的连接跟踪状态(NOTRACK)。
2. **mangle 表**: 用于修改数据包的属性,例如标记数据包、修改服务类型(TOS)和 TTL 等。
3. **nat 表**: 主要用于网络地址转换(NAT),包括源 NAT(SNAT)和目标 NAT(DNAT)。
4. **filter 表**: 最常用的表,用于数据包的过滤(接受、拒绝、丢弃)。
### 处理顺序中的链
每张表包含不同的链,数据包会按照这些链的顺序进行处理。具体来说,每个链在数据包的生命周期中的不同阶段起作用。下面是各个表和链的处理顺序示意:
1. **raw 表**
- PREROUTING: 数据包进入网络栈前处理
- OUTPUT: 本地生成的数据包在路由前处理
2. **mangle 表**
- PREROUTING: 数据包进入网络栈前处理
- INPUT: 数据包被路由到本地系统处理前
- FORWARD: 数据包被转发时处理
- OUTPUT: 本地生成的数据包在路由前处理
- POSTROUTING: 数据包路由后处理
3. **nat 表**
- PREROUTING: 数据包进入网络栈前处理(主要用于目标 NAT)
- OUTPUT: 本地生成的数据包在路由前处理(用于本地目标 NAT)
- POSTROUTING: 数据包路由后处理(主要用于源 NAT)
4. **filter 表**
- INPUT: 数据包被路由到本地系统处理前
- FORWARD: 数据包被转发时处理
- OUTPUT: 本地生成的数据包在路由前处理
### 具体处理流程示例
假设一个数据包从外部网络进入并被转发到另一个网络,处理流程如下:
1. **raw 表** - PREROUTING 链
2. **mangle 表** - PREROUTING 链
3. **nat 表** - PREROUTING 链
4. **filter 表** - FORWARD 链
5. **mangle 表** - FORWARD 链
6. **nat 表** - POSTROUTING 链
7. **mangle 表** - POSTROUTING 链
如果数据包是本地生成的并发往外部网络,则处理流程如下:
1. **raw 表** - OUTPUT 链
2. **mangle 表** - OUTPUT 链
3. **nat 表** - OUTPUT 链
4. **filter 表** - OUTPUT 链
5. **mangle 表** - POSTROUTING 链
6. **nat 表** - POSTROUTING 链
### 总结
数据包在 `iptables` 中的处理顺序是 `raw` -> `mangle` -> `nat` -> `filter`。每个表在数据包处理的不同阶段起作用,确保数据包可以被正确标记、转换和过滤。这种顺序和各表的特性让管理员能够灵活地控制和管理网络流量,满足复杂的网络需求。