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
2
访问本机:入网卡 → PREROUTING → 路由(本机) → INPUT → 进程 → OUTPUT → POSTROUTING → 出站
帮人转发:入网卡 → PREROUTING → 路由(转发) → FORWARD → POSTROUTING → 出站

二、常用规则写法

1
2
3
4
5
6
7
8
# 查看(-v 带计数,-n 不反解域名)
iptables -L -v -n
# 放行/拒绝
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -s 10.0.8.0/24 -j ACCEPT # 只放行内网网段
iptables -A INPUT -p tcp --dport 80 -j DROP
# 删除规则:-D 或先 -L --line-numbers 看编号再删
iptables -D INPUT -p tcp --dport 80 -j DROP

高频概念:

  • DROP vs REJECT:DROP 静默丢包(防扫描更安全,但客户端表现是超时);REJECT 明确拒绝(利于调试,报错快)。对外防火墙用 DROP。
  • 匹配顺序:链内自上而下,命中即停。具体放行规则放前面,默认策略兜底。
  • 看命中次数iptables -L -v -n 的 pkts/bytes 列。排障时计数器不增长 = 包根本没走到这条规则,往上游找。
  • 持久化iptables-save > /etc/sysconfig/iptables,开机 iptables-restore 恢复(或直接装 firewalld 管持久化)。

三、案例 1:SNAT 共享上网

场景:内网 20 台服务器走一台网关机器共享上网,网关双网卡(内网 + 公网)。

1
2
3
4
5
6
7
8
9
10
# 1. 开启内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久生效:/etc/sysctl.conf 里 net.ipv4.ip_forward=1 后 sysctl -p

# 2. 内网过来的流量出公网时把源地址换成网关公网 IP
iptables -t nat -A POSTROUTING -s 10.0.8.0/24 -o eth0 -j SNAT --to-source 100.64.8.1

# 3. 放行 FORWARD
iptables -A FORWARD -s 10.0.8.0/24 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

四、案例 2:DNAT 端口映射

场景:公网访问 100.64.8.1:8080,映射到内网 Web 服务器 10.0.8.11:80

1
2
3
4
5
6
7
8
9
# 进网关的流量,目标地址改写为内网服务器
iptables -t nat -A PREROUTING -d 100.64.8.1 -p tcp --dport 8080 -j DNAT --to-destination 10.0.8.11:80

# 源地址也换成网关(否则内网服务器回包找不到"公网客户端"路由)
iptables -t nat -A POSTROUTING -d 10.0.8.11 -p tcp --dport 80 -j SNAT --to-source 100.64.8.1

# 放行 FORWARD,验证
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
curl http://100.64.8.1:8080

五、排障要点

  1. 规则看起来对但不生效:先看 iptables -L -v -n 计数器,规则没命中就往上游(PREROUTING/路由)排查;本机访问走 INPUT,转发走 FORWARD,别弄错链。
  2. NAT 后业务不通:八成忘了回程 SNAT,或没开 ip_forward
  3. 重启后规则全没了:没做 save/restore——这句几乎每次踩坑都会被想起。

iptables 上手后,内网隔离、端口映射、共享上网这些场景都能自己搞定,而”包往哪走”的架构感,也是后面学 nftables、云安全组时通用的底层认知。