Linux 防火墙深度实战——iptables 与 nftables 全面解析
一、Netfilter 框架与 iptables 工作原理
Netfilter 是 Linux 内核包过滤框架,提供 Hook 点让数据包经过时被处理。iptables 是用户态工具,用于向 Netfilter 添加规则。
五大表:
- raw:最早处理,连接跟踪豁免(NOTRACK)。
- mangle:修改包(TOS、TTL、MARK)。
- nat:地址转换(SNAT、DNAT、MASQUERADE)。
- filter:核心过滤(ACCEPT/DROP/REJECT)。
主要链(Hook 点):
- PREROUTING:进入路由决策前(nat/mangle/raw)。
- POSTROUTING:离开路由决策后(nat/mangle)。
数据包流程简图(运维必背): 入站:PREROUTING → 路由 → INPUT → 本地进程。 转发:PREROUTING → 路由 → FORWARD → POSTROUTING。 出站:OUTPUT → POSTROUTING。
状态跟踪(conntrack): nf_conntrack 模块记录连接状态(NEW、ESTABLISHED、RELATED、INVALID)。高并发服务器需调整最大值。
二、iptables 基础命令与规则编写
查看与管理:
iptables -t filter -L -n -v --line-numbers # 详细带序号
iptables -t nat -L
iptables-save > /etc/iptables.rules # 备份
iptables-restore < /etc/iptables.rules
常用匹配:
- IP:
-s 192.168.1.0/24、-d 8.8.8.8 - 状态:
-m state --state ESTABLISHED,RELATED
基础安全策略(生产最小化模板):
# 清空并设置默认策略
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许 loopback
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH(限制源 IP 更安全)
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.0/24 -j ACCEPT
# Web 服务
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# ICMP 限制(防 Ping Flood)
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/s -j ACCEPT
# 日志(放在 DROP 前)
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
iptables -A INPUT -j DROP
NAT 实战(共享上网或端口映射):
# SNAT(内网访问外网)
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE
# DNAT(端口转发)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
保存开机自启:
- RHEL:
iptables-save > /etc/sysconfig/iptables - Ubuntu:使用
iptables-persistent 包。
三、高级功能与性能优化
连接跟踪优化:
sysctl -w net.netfilter.nf_conntrack_max=524288
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600
echo"net.netfilter.nf_conntrack_max=524288" >> /etc/sysctl.conf
SYN 代理与洪泛防护:
iptables -A INPUT -p tcp --syn -m limit --limit 5/s -j ACCEPT
# 或启用 syncookies(内核层面)
sysctl -w net.ipv4.tcp_syncookies=1
字符串匹配防 Web 攻击:
iptables -A INPUT -p tcp --dport 80 -m string --string "SQL" --algo bm -j DROP
Rate Limiting: 保护 API:-m limit --limit 100/minute --limit-burst 200
MARK + 策略路由结合(第二篇扩展):
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 10
多表操作:
- raw 表跳过 conntrack 提升性能(UDP 高吞吐)。
性能监控:
watch -n 1 "cat /proc/net/nf_conntrack | wc -l"
iptables -t filter -L -v -n # 查看计数器
四、nftables 迁移与现代实践
iptables 语法复杂、规则多时性能下降,nftables 是推荐替代方案(原子更新、更高效)。
基本语法:
# 安装
apt install nftables # 或 dnf
# 查看
nft list ruleset
# 示例规则集
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet filter input iif lo accept
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input tcp dport 22 accept
批量加载(/etc/nftables.conf):
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
iif "lo" accept
ct state established,related accept
tcp dport {22, 80, 443} accept
counter log prefix "DROP: " drop
}
}
加载:nft -f /etc/nftables.conf 并设置开机自启 systemctl enable nftables。
iptables 到 nftables 转换:
iptables-save | iptables-restore-translate -o /etc/nftables.conf
优势:
五、生产故障排查与案例分析
常见问题:
- 规则顺序错误:ACCEPT 在 DROP 后无效。始终用
--line-numbers 检查。 - conntrack 满:
nf_conntrack: table full → 调大 max 或优化应用连接池。 - NAT 失效:忘记 POSTROUTING MASQUERADE,或接口不对。
- 日志过多:使用 ulogd 或 rsyslog 分离,防止磁盘打满。
- Docker/K8s 冲突:Docker 默认修改 iptables,推荐使用 iptables-legacy 或配置 CNI。
案例1:SSH 暴力破解: 解决:Fail2Ban + iptables 动态 DROP,或直接限速 + 密钥登录。
案例2:Web 服务被 CC 攻击:
# 限制单 IP 并发
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP
案例3:端口转发后后端不可达: 排查:tcpdump -i any port 8080 确认 PREROUTING 是否命中,检查后端防火墙。
调试技巧:
tcpdump -i eth0 -nn "tcp port 22"iptables -t raw -A PREROUTING -j TRACE(慎用,日志爆炸)dmesg | grep -i netfilter
六、安全最佳实践与自动化
定期审计:iptables-save | diff 或脚本巡检。
自动化:Ansible role 管理规则,支持版本控制。 示例 Playbook 片段:
-name:Deployfirewall
template:
src:iptables.j2
dest:/etc/iptables.rules
notify:restoreiptables
监控:Prometheus exporter 监控丢弃包计数。
备份与回滚:变更前快照,失败立即 restore。
SELinux/AppArmor 补充:防火墙之外的 MAC 控制。