1. 为什么我们需要深入理解iptables?
在Linux系统管理中,防火墙配置是每个运维人员必须掌握的核心技能。而iptables作为Linux内核中内置的包过滤系统,已经服役超过20年,至今仍是大多数Linux发行版的默认防火墙解决方案。我至今记得第一次接触iptables时那种既兴奋又困惑的感觉——兴奋于它强大的功能,困惑于它复杂的规则链。
提示:虽然现在有firewalld、nftables等新工具出现,但iptables仍然是排查网络问题必须掌握的基础技能,特别是在老旧系统维护和特定场景下。
2. iptables核心架构解析
2.1 四表五链工作机制
iptables的核心设计可以概括为"四表五链":
- Filter表:最常用的表,负责过滤数据包
- NAT表:网络地址转换
- Mangle表:修改数据包头部信息
- Raw表:连接跟踪前的处理
每个表包含不同的链(Chain):
code复制INPUT链 → 处理进入本机的数据包
OUTPUT链 → 处理从本机发出的数据包
FORWARD链 → 处理经过本机转发的数据包
PREROUTING链 → 数据包进入路由决策前
POSTROUTING链 → 数据包离开路由决策后
2.2 规则匹配流程详解
当一个网络数据包到达系统时,iptables的处理流程如下:
- 数据包到达网卡
- 进入PREROUTING链(raw→mangle→nat)
- 路由决策(判断是发给本机还是转发)
- 如果发给本机→INPUT链(mangle→filter)
- 本机处理后的响应→OUTPUT链(raw→mangle→nat→filter)
- 路由决策后→POSTROUTING链(mangle→nat)
- 从网卡发出
这个流程看似复杂,但理解后就能精准控制规则放置位置。
3. 实战:从零配置生产级防火墙
3.1 基础规则配置示例
我们先从一个简单的Web服务器防护配置开始:
bash复制# 清空所有现有规则
iptables -F
iptables -X
# 设置默认策略(默认拒绝所有)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 开放SSH端口(限制源IP更安全)
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 8 -j ACCEPT
# 记录被拒绝的包(调试用)
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: "
3.2 高级防护策略实现
3.2.1 防DDoS攻击配置
bash复制# 限制SSH连接频率
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
# 防SYN洪水攻击
iptables -N SYN_FLOOD
iptables -A INPUT -p tcp --syn -j SYN_FLOOD
iptables -A SYN_FLOOD -m limit --limit 10/s --limit-burst 20 -j RETURN
iptables -A SYN_FLOOD -j DROP
3.2.2 端口转发示例
将外部8080端口转发到内部服务器的80端口:
bash复制iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j SNAT --to-source 本机内网IP
4. 运维实战经验与排错指南
4.1 规则调试技巧
-
查看规则命中计数:
bash复制
iptables -L -v -n观察
pkts和bytes计数,判断规则是否生效 -
日志分析:
- 被LOG规则记录的包会出现在
/var/log/messages或/var/log/kern.log - 使用
dmesg命令可以实时查看
- 被LOG规则记录的包会出现在
-
临时放行所有流量(紧急情况下):
bash复制
iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -F
4.2 常见问题解决方案
问题1:规则不生效
- 检查点:
- 规则顺序是否正确(iptables按顺序匹配)
- 是否放行了RELATED,ESTABLISHED状态
- 表链选择是否正确(NAT规则要写在nat表)
问题2:SSH被自己阻断
- 解决方案:
bash复制# 在拒绝所有前加入: iptables -I INPUT -p tcp --dport 22 -j ACCEPT
问题3:NAT转发失败
- 排查步骤:
- 检查
/proc/sys/net/ipv4/ip_forward是否为1 - 确认SNAT/DNAT规则正确
- 检查FORWARD链是否放行
- 检查
5. 规则持久化与高级管理
5.1 保存与恢复规则
bash复制# 保存当前规则
iptables-save > /etc/iptables.rules
# 恢复规则
iptables-restore < /etc/iptables.rules
# 开机自动加载(在/etc/rc.local中添加)
iptables-restore < /etc/iptables.rules
5.2 使用自定义链优化管理
对于复杂规则集,建议按功能划分:
bash复制# 创建自定义链
iptables -N WEB_SERVICES
iptables -N BLOCK_LIST
# 将自定义链挂接到主链
iptables -A INPUT -j WEB_SERVICES
iptables -A INPUT -j BLOCK_LIST
# 向自定义链添加规则
iptables -A WEB_SERVICES -p tcp --dport 80 -j ACCEPT
iptables -A BLOCK_LIST -s 192.168.1.100 -j DROP
5.3 结合ipset提升性能
当需要处理大量IP时,使用ipset效率更高:
bash复制# 创建ipset集合
ipset create blacklist hash:ip
# 添加IP到集合
ipset add blacklist 192.168.1.100
# 在iptables中引用
iptables -A INPUT -m set --match-set blacklist src -j DROP
6. 从iptables到nftables的过渡
虽然iptables仍然广泛使用,但nftables作为其替代者已经成熟。两者主要区别:
- 统一语法:nftables使用更简洁一致的命令格式
- 性能提升:特别是处理大量规则时
- 原生支持集合和映射
转换示例:
bash复制# iptables规则:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 等效nftables规则:
nft add rule ip filter input tcp dport 22 accept
建议新项目可以直接使用nftables,但维护旧系统仍需精通iptables。