iptables 防火墙实战:四表五链与 NAT 转发
iptables 防火墙实战:四表五链与 NAT 转发
iptables 劝退很多人是因为命令又多又碎。但只要先把”四表五链 + 数据包流向”这个架构想明白,规则就是往架构里填句子。这篇从架构讲起,配合两个真实的 NAT 落地方案。
一、架构:四表五链 + 数据包流向
iptables 是操作内核 netfilter 的用户态工具,不是服务。规则存在内核内存,重启丢失,需手动保存。
四张表决定”干什么”:
| 表 | 作用 | 挂的链 |
|---|---|---|
| filter | 过滤(默认表):放行/丢弃 | INPUT, FORWARD, OUTPUT |
| nat | 地址转换:改 IP/端口 | PREROUTING, POSTROUTING, OUTPUT |
| mangle | 改包属性(TTL/TOS/MARK) | 全部链 |
| raw | 绕过连接跟踪(高级优化) | PREROUTING, OUTPUT |
五条链决定”什么时候干”:
| 链 | 触发时机 |
|---|---|
| PREROUTING | 路由判断前(进门) |
| INPUT | 目的=本机,进入进程前 |
| FORWARD | 本机转发(当路由器) |
| OUTPUT | 本机进程发出后 |
| POSTROUTING | 路由判断后、出网卡前(出门) |
数据包两条主干路径必须背下来:
1 | 访问本机:入网卡 → PREROUTING → 路由(本机) → INPUT → 进程 → OUTPUT → POSTROUTING → 出站 |
二、常用规则写法
1 | # 查看(-v 带计数,-n 不反解域名) |
高频概念:
- DROP vs REJECT:DROP 静默丢包(防扫描更安全,但客户端表现是超时);REJECT 明确拒绝(利于调试,报错快)。对外防火墙用 DROP。
- 匹配顺序:链内自上而下,命中即停。具体放行规则放前面,默认策略兜底。
- 看命中次数:
iptables -L -v -n的 pkts/bytes 列。排障时计数器不增长 = 包根本没走到这条规则,往上游找。 - 持久化:
iptables-save > /etc/sysconfig/iptables,开机iptables-restore恢复(或直接装 firewalld 管持久化)。
三、案例 1:SNAT 共享上网
场景:内网 20 台服务器走一台网关机器共享上网,网关双网卡(内网 + 公网)。
1 | # 1. 开启内核转发 |
四、案例 2:DNAT 端口映射
场景:公网访问 100.64.8.1:8080,映射到内网 Web 服务器 10.0.8.11:80。
1 | # 进网关的流量,目标地址改写为内网服务器 |
五、排障要点
- 规则看起来对但不生效:先看
iptables -L -v -n计数器,规则没命中就往上游(PREROUTING/路由)排查;本机访问走 INPUT,转发走 FORWARD,别弄错链。 - NAT 后业务不通:八成忘了回程 SNAT,或没开
ip_forward。 - 重启后规则全没了:没做 save/restore——这句几乎每次踩坑都会被想起。
iptables 上手后,内网隔离、端口映射、共享上网这些场景都能自己搞定,而”包往哪走”的架构感,也是后面学 nftables、云安全组时通用的底层认知。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuminDream's Blogs!


