防火墙 iptables 配置实战
iptables是Linux内核内置的防火墙工具,通过规则链控制网络数据包的流向,是保护服务器安全的第一道防线。虽然现代Linux系统推荐使用firewalld,但深入理解iptables原理对运维工程师依然必不可少。
一、iptables基本原理
iptables使用”表-链-规则”的三层结构:
- Tables(表):filter(过滤)、nat(地址转换)、mangle(包修改)
- Chains(链):INPUT(入站)、OUTPUT(出站)、FORWARD(转发)、PREROUTING、POSTROUTING
- Rules(规则):匹配条件+动作(ACCEPT/DROP/REJECT/LOG)
数据包处理流程:入站数据包 → PREROUTING → INPUT → 本机进程;出站数据包 → OUTPUT → POSTROUTING → 网络;转发数据包 → PREROUTING → FORWARD → POSTROUTING。
二、常用iptables命令
iptables -L -n -v --line-numbers # 查看所有规则(显示行号) iptables -F INPUT # 清空INPUT链所有规则 iptables -X # 删除所有自定义链 iptables -P INPUT DROP # 设置默认策略为拒绝 # 保存和恢复规则 iptables-save > /etc/iptables/rules.v4 iptables-restore < /etc/iptables/rules.v4 # CentOS自动保存 service iptables save
三、Web服务器防火墙配置
#!/bin/bash # 生产Web服务器iptables规则 # 清空现有规则 iptables -F iptables -X iptables -Z # 设置默认策略:拒绝所有 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 -s 192.168.0.0/16 -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 flood iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP # 封禁特定IP iptables -A INPUT -s 10.0.0.1 -j DROP # 记录并丢弃其他所有入站 iptables -A INPUT -j LOG --log-prefix "iptables-DROP: " --log-level 4 iptables -A INPUT -j DROP
四、NAT配置(端口转发)
# 将外部访问8080端口转发到内部服务器80端口 iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80 iptables -t nat -A POSTROUTING -j MASQUERADE # 开启IP转发 echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p
五、防常见攻击规则
# 防止NULL包(扫描探测) iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # 防止XMAS包 iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # 防止IP欺骗 iptables -A INPUT -s 10.0.0.0/8 -i eth0 -j DROP iptables -A INPUT -s 172.16.0.0/12 -i eth0 -j DROP iptables -A INPUT -s 192.168.0.0/16 -i eth0 -j DROP # 端口扫描防护(限制连接尝试速率) iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
六、从iptables迁移到firewalld
现代Linux系统(CentOS 7+、RHEL 7+)默认使用firewalld,建议新服务器使用firewalld,它的Zone概念更直观,动态规则更新不需要flush所有规则:
systemctl disable --now iptables systemctl enable --now firewalld firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload
七、总结
iptables是Linux网络安全的基础,深入理解表链规则模型,才能灵活应对各种安全需求。对于日常运维,建议使用firewalld简化操作;对于需要精细控制的场景,直接使用iptables命令。无论使用哪种工具,默认拒绝、最小开放的原则始终是防火墙配置的核心原则。