iptables反向代理与流量清洗本质是nat、raw、filter三表协同:nat表通过DNAT+SNAT/MASQUERADE完成流量转发,raw表用NOTRACK绕过连接跟踪提升性能,filter表实现IP封禁、速率限制与攻击特征过滤,并需启用ip_forward及规则持久化。

iptables 配置反向代理和流量清洗,本质是分层协同:nat 表负责地址转换与流量导向,raw 表绕过连接跟踪提升性能,filter 表实现精准过滤与安全控制。关键不在堆砌规则,而在明确每条规则的执行时机、作用范围和副作用。
反向代理:用 nat 表完成流量转发
核心是 DNAT + SNAT/MASQUERADE 组合,确保请求能进、响应能回。
- 启用 IP 转发(必须):echo 1 > /proc/sys/net/ipv4/ip_forward,并写入 /etc/sysctl.conf 持久化
- DNAT 规则放在 PREROUTING 链,改写目标地址:iptables -t nat -A PREROUTING -d 203.0.113.45 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
- SNAT 或 MASQUERADE 规则放在 POSTROUTING 链,确保后端返回时源地址可路由:iptables -t nat -A POSTROUTING -s 192.168.1.100 -j MASQUERADE(适用于动态出口 IP)
- 别漏掉 filter 表放行:iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT,否则内核会默认 DROP
高性能流量清洗:raw 表跳过 conntrack
对高并发 HTTP/HTTPS 流量,禁用连接跟踪可显著降低 CPU 和内存压力,避免 nf_conntrack 表溢出。
- 在 raw 表 PREROUTING 链中匹配并跳过跟踪:iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK;同理加 443 端口
- NOTRACK 后,该连接不再出现在 conntrack -L 中,但 filter 表规则(如 INPUT 放行)仍生效
- 若需对特定 CDN 回源 IP 的 UDP 流量也跳过(如 QUIC、DNS),可追加:iptables -t raw -A PREROUTING -p udp --dport 443 -s 192.0.2.0/24 -j NOTRACK
- 同步检查 sysctl net.netfilter.nf_conntrack_max,调大只是缓兵之计,NOTRACK 才是治本
基础防护与清洗:filter 表做精准拦截
这是最直接的“清洗”层,用于屏蔽恶意源、限制速率、封禁异常行为。
- 按 IP 段或单 IP 封禁:iptables -I INPUT -s 198.51.100.0/24 -j DROP
- 限制连接频率(防扫描):iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
- 封禁常见攻击特征(如空 User-Agent、SQL 注入关键词)需配合 string 模块:iptables -A INPUT -p tcp --dport 80 -m string --string "union select" --algo bm -j DROP
- 务必允许 ESTABLISHED/RELATED 连接:iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT,否则 SSH 会断连
规则持久化与调试要点
临时规则重启即失效,生产环境必须固化;调试时注意链执行顺序和包走向。
- 保存规则:iptables-save > /etc/iptables/rules.v4(Debian/Ubuntu)或 iptables-save > /etc/sysconfig/iptables(RHEL/CentOS)
- 加载规则:iptables-restore
- 排查不通时,先用 tcpdump -i any port 80 确认包是否到达网卡,再查 raw → nat → filter 各链命中情况(iptables -t raw -L -v 看计数器)
- NOTRACK 后无法用 conntrack 排查,应转向应用日志、tcpdump 或 ss -tn 查连接状态










