Linux相关
iptables 实战指南:从原理到生产环境防火墙配置
📅 2026/3/23👁️ 11 次阅读🕐 更新于 2026/3/23
iptables 实战指南:从原理到生产环境防火墙配置
前言
iptables 是 Linux 系统中最经典的防火墙工具,虽然近年来 nftables 逐渐成为主流,但仍有大量生产环境在使用 iptables。本文将从原理到实战,带你全面掌握 iptables 的配置技巧。
一、iptables 核心概念
1.1 四表五链
iptables 的核心架构由"四表五链"组成:
四表:
- filter 表:默认表,用于数据包过滤
- nat 表:网络地址转换
- mangle 表:修改数据包内容
- raw 表:连接跟踪处理
五链:
- INPUT:处理入站数据包
- OUTPUT:处理出站数据包
- FORWARD:处理转发数据包
- PREROUTING:路由前处理
- POSTROUTING:路由后处理
1.2 数据包流向
入站数据包 → PREROUTING → INPUT → 本地进程
↓
转发数据包 → PREROUTING → FORWARD → POSTROUTING
↓
出站数据包 → OUTPUT → POSTROUTING → 网络
二、常用命令速查
2.1 查看规则
bash
# 查看所有表的规则
iptables -L -n -v
# 查看指定表
iptables -t nat -L -n -v
# 查看规则带行号
iptables -L -n --line-numbers
2.2 添加规则
bash
# 添加规则到链末尾
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 插入规则到指定位置
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
# 追加到指定链
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
2.3 删除规则
bash
# 按行号删除
iptables -D INPUT 1
# 按规则删除
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# 清空链所有规则
iptables -F INPUT
# 清空所有表
iptables -F && iptables -t nat -F && iptables -t mangle -F
2.4 设置默认策略
bash
# 设置默认 DROP(谨慎操作!)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
三、生产环境配置实例
3.1 基础安全配置
bash
#!/bin/bash
# 清空现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t mangle -F
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许回环接口
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH (22 端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许 ICMP (ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 防止 SYN 洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# 保存规则 (CentOS/RHEL)
service iptables save
# 保存规则 (Ubuntu/Debian)
iptables-save > /etc/iptables/rules.v4
3.2 Docker 环境配置
Docker 会修改 iptables 规则,需要注意:
bash
# 允许 Docker 网桥
iptables -A FORWARD -i docker0 -j ACCEPT
iptables -A FORWARD -o docker0 -j ACCEPT
# 或者禁用 Docker 自动修改 iptables
# 在 /etc/docker/daemon.json 中添加:
# {"iptables": false}
3.3 端口转发配置
bash
# 开启 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 将 8080 端口转发到 80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
# 转发到其他服务器
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A POSTROUTING -j MASQUERADE
3.4 限制 IP 访问
bash
# 封禁单个 IP
iptables -A INPUT -s 192.168.1.100 -j DROP
# 封禁网段
iptables -A INPUT -s 192.168.1.0/24 -j DROP
# 只允许特定 IP 访问 SSH
iptables -A INPUT -p tcp -s 10.0.0.0/24 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
四、故障排查技巧
4.1 查看连接状态
bash
# 查看连接跟踪
conntrack -L
# 查看 NAT 表
iptables -t nat -L -n -v
# 实时查看匹配的数据包
watch -n 1 'iptables -L -n -v | grep -E "^Chain|pkts"'
4.2 日志记录
bash
# 添加日志记录
iptables -A INPUT -j LOG --log-prefix "IPT_INPUT_DROP: " --log-level 4
# 查看日志
tail -f /var/log/messages | grep IPT
# 或
tail -f /var/log/syslog | grep IPT
4.3 常见问题
问题 1:规则不生效
- 检查规则顺序(iptables 从上到下匹配)
- 确认默认策略
- 检查是否有其他防火墙(firewalld、ufw)冲突
问题 2:重启后规则丢失
- 确保执行了保存操作
- 检查 iptables 服务是否开机自启
问题 3:影响 Docker 容器网络
- Docker 依赖 iptables 进行 NAT
- 修改前备份规则,或在 Docker 配置中禁用 iptables 管理
五、最佳实践建议
- 先放行后限制:先配置允许的规则,最后设置默认 DROP
- 保留 SSH 会话:修改防火墙时保持 SSH 连接,避免被锁在外面
- 定期审计规则:使用
iptables -L -n --line-numbers定期检查 - 版本控制:将规则保存到文件中,纳入版本管理
- 测试环境验证:生产环境变更前先在测试环境验证
- 备份恢复方案:
bash
# 备份 iptables-save > /backup/iptables-$(date +%Y%m%d).rules # 恢复 iptables-restore < /backup/iptables-20260323.rules
六、从 iptables 迁移到 nftables
如果你考虑升级到 nftables:
bash
# 查看是否支持 nftables
nft --version
# 使用 nftables 语法实现相同功能
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 tcp dport 22 accept
总结
iptables 作为成熟的防火墙解决方案,在生产环境中依然有重要价值。掌握其核心原理和配置技巧,能够帮助你构建安全的网络环境。
关键要点:
- 理解四表五链和数据包流向
- 遵循"最小权限原则"配置规则
- 做好规则备份和恢复预案
- 定期审计和优化规则集
参考资料:
本文首发于漫辰夕 BLOG,转载请注明出处。