防火墙 iptables 配置

防火墙 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命令。无论使用哪种工具,默认拒绝、最小开放的原则始终是防火墙配置的核心原则。