iptables / Netfilter
Netfilter 是 Linux 内核中的数据包过滤框架(内核态),iptables 是它的用户态配置工具。两者合称 iptables/Netfilter,是 Linux 防火墙和网络地址转换(NAT)的核心基础设施。LVS 的 ipvs 模块也构建在 Netfilter 框架之上。
五链四表
五条钩子链(Chain)
数据包经过内核时会依次触发五个挂载点:
PREROUTING → [路由决策] → INPUT(本机)
→ FORWARD(转发)
← [路由决策] ← OUTPUT
→ POSTROUTING
| 链 | 触发时机 | 方向 |
|---|---|---|
| PREROUTING | 包刚进入内核,路由决策前 | 入站 |
| INPUT | 路由决策后,发往本机的包 | 入站 |
| FORWARD | 路由决策后,需要转发的包 | 转发 |
| OUTPUT | 本机发出的包 | 出站 |
| POSTROUTING | 包即将离开内核 | 出站 |
四张规则表(Table)
| 表 | 功能 | 挂载链 | 常用模块 |
|---|---|---|---|
| filter | 包过滤(放行/拒绝) | INPUT, FORWARD, OUTPUT | - |
| nat | 地址转换 | PREROUTING, POSTROUTING, OUTPUT | SNAT, DNAT |
| mangle | 修改包头部 | 所有链 | TOS, TTL |
| raw | 跳过连接跟踪 | PREROUTING, OUTPUT | NOTRACK |
数据包流向完整路径
① PREROUTING (raw/mangle/nat)
↓
② 路由决策(判断目标是否本机)
├→ ❌ 非本机 → FORWARD (mangle/filter) → POSTROUTING (mangle/nat) → 出站
└→ ✅ 本机 → INPUT (mangle/filter) → [本机进程]
↓
OUTPUT (raw/mangle/nat/filter) → POSTROUTING (mangle/nat) → 出站
核心实践
规则管理
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 放行 SSH
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 放行已建立连接
iptables -P INPUT DROP # 默认拒绝(先放行 SSH!)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 公网IP # SNAT 上网共享
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 内网IP:8080 # DNAT 端口映射连接跟踪(Conntrack)
ESTABLISHED/RELATED规则使返回流量自动放行,命中率 >90%- 是防火墙性能优化的关键
- 查看:
cat /proc/net/nf_conntrack
NAT
| 类型 | 方向 | 典型场景 |
|---|---|---|
| SNAT | 源地址转换(出站) | 内网上网共享(MASQUERADE) |
| DNAT | 目标地址转换(入站) | 端口映射、公网→内网 |
与 LVS 的关系
LVS 的 ipvs 模块工作在 Netfilter 框架之上(INPUT 链前置),在 PREROUTING 链之后、INPUT/FORWARD 之前拦截并转发数据包。这也是 LVS 如此高效的原因之一——它在内核层直接操作,不经过完整的协议栈。
相关页面
- 防火墙与系统优化:iptables/firewalld 完整指南、OOM Killer、内核调优
- 进程控制(下):网卡收发包底层(DMA → 硬中断 → 软中断)
- LVS DR 模式:LVS 依赖 Netfilter 框架
- LVS
- Shell 编程 4:Linux 容器的网络隔离(Network Namespace)