防火墙配置基础 - iptables与firewalld实战

防火墙是服务器安全的第一道防线,合理配置防火墙可以有效防止未授权访问和网络攻击。本文将详细介绍Linux系统下iptables和firewalld两种主流防火墙工具的配置方法。

一、防火墙基础概念

什么是防火墙

防火墙是一种网络安全系统,根据预设的安全规则监控和控制进出网络流量。它可以基于IP地址、端口号、协议类型等条件过滤数据包。

防火墙的工作原理

  • 包过滤:检查每个数据包的源/目标IP、端口、协议
  • 状态检测:跟踪连接状态,允许已建立连接的响应流量
  • NAT转换:网络地址转换,隐藏内部网络结构
  • 应用层代理:深度检测应用层数据

二、iptables详解

iptables简介

iptables是Linux系统经典的防火墙工具,基于Netfilter框架,功能强大但配置相对复杂。适用于CentOS 6、Debian等系统。

iptables四表五链

四张表

  • filter表:默认表,用于数据包过滤
  • nat表:网络地址转换
  • mangle表:修改数据包头部信息
  • raw表:配置 exemptions

五条链

  • PREROUTING:数据包进入路由前
  • INPUT:到达本机的数据包
  • FORWARD:需要转发的数据包
  • OUTPUT:本机产生的数据包
  • POSTROUTING:数据包离开路由后

iptables基本命令

# 查看规则 iptables -L -n -v # 查看特定表的规则 iptables -t nat -L -n -v # 清空所有规则 iptables -F iptables -X iptables -Z # 保存规则(CentOS) service iptables save # 保存规则(Ubuntu) iptables-save > /etc/iptables/rules.v4

iptables常用规则示例

# 允许本地回环 cmd iptables -A INPUT -i lo -j ACCEPT # 允许已建立连接 cmd iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允许SSH(端口22) cmd iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许HTTP(端口80) cmd iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许HTTPS(端口443) cmd iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许特定IP访问 cmd iptables -A INPUT -s 192.168.1.100 -j ACCEPT # 拒绝特定端口 cmd iptables -A INPUT -p tcp --dport 3306 -j DROP # 拒绝所有其他入站连接 cmd iptables -A INPUT -j DROP

iptables完整配置脚本

#!/bin/bash # 清空现有规则 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 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 # 允许Ping(可选) iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT # 保存规则 service iptables save

三、firewalld详解

firewalld简介

firewalld是CentOS 7+和RHEL 7+默认的防火墙管理工具,采用动态管理方式,支持区域(Zone)概念,配置更加灵活。

firewalld区域

  • public:公共区域,仅接受选定的连接
  • home:家庭网络,信任大部分连接
  • work:工作网络,信任大部分连接
  • internal:内部网络,信任大部分连接
  • dmz:隔离区域,仅接受特定服务
  • block:拒绝所有连接
  • drop:丢弃所有连接

firewalld基本命令

# 启动/停止/重启 systemctl start firewalld systemctl stop firewalld systemctl restart firewalld # 查看状态 systemctl status firewalld firewall-cmd --state # 查看当前区域 firewall-cmd --get-default-zone # 查看所有区域配置 firewall-cmd --get-active-zones # 查看区域详细信息 firewall-cmd --zone=public --list-all # 重新加载配置 firewall-cmd --reload

firewalld常用规则配置

# 允许服务(永久生效) firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --permanent --add-service=ssh # 允许端口 firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --permanent --add-port=1000-2000/tcp # 允许特定IP firewall-cmd --permanent --add-source=192.168.1.100 # 拒绝特定IP firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.200" reject' # 删除规则 firewall-cmd --permanent --remove-service=http firewall-cmd --permanent --remove-port=8080/tcp # 重新加载生效 firewall-cmd --reload

firewalld富规则(Rich Rules)

富规则提供更精细的控制能力:

# 允许特定IP访问特定端口 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="3306" accept' # 限制连接速率 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept limit value="10/m"' # 允许特定时间访问 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept limit value="3/m"' # 端口转发 firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080

四、iptables与firewalld对比

特性 iptables firewalld
配置方式 命令行,需保存 动态配置,即时生效
学习曲线 较陡峭 较平缓
区域概念 不支持 支持
IPv6支持 需单独配置(ip6tables) 原生支持
适用系统 CentOS 6, Debian CentOS 7+, RHEL 7+
运行时修改 不支持 支持

五、安全最佳实践

⚠️ 配置防火墙前的注意事项

  • 配置前确保有替代访问方式(如IPMI、VNC)
  • 先测试规则,确认无误后再设为默认策略
  • 不要直接屏蔽SSH端口,否则会被锁在服务器外
  • 建议先添加允许规则,最后添加拒绝规则

最小权限原则

  • 只开放必要的端口
  • 限制特定IP访问敏感端口
  • 使用非标准端口增加安全性
  • 定期审查和清理规则

常用安全规则

# 防止SYN Flood攻击 iptables -A INPUT -p tcp --syn -m limit --limit 1/second --limit-burst 3 -j ACCEPT # 防止Ping Flood iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # 防止端口扫描 iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -m limit --limit 1/second -j ACCEPT iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP # 记录并丢弃可疑流量 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 LOG --log-prefix "SSH_BRUTE_FORCE: " iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

六、故障排查

常见问题1:规则不生效

  • 检查规则顺序,匹配即停止
  • 确认默认策略设置
  • 检查是否有其他防火墙冲突
  • 验证规则语法是否正确

常见问题2:无法连接SSH

  • 检查SSH端口是否被允许
  • 确认INPUT链的默认策略
  • 检查是否误封了自己的IP
  • 通过控制台或IPMI登录修复

常见问题3:firewalld与iptables冲突

# 停止iptables服务 systemctl stop iptables systemctl disable iptables # 使用firewalld管理 systemctl enable firewalld systemctl start firewalld

七、测试防火墙规则

配置完成后,使用以下工具测试防火墙效果:

八、总结

防火墙配置是服务器安全的基础,建议:

  • 根据系统选择合适的防火墙工具
  • 遵循最小权限原则配置规则
  • 定期审查和更新防火墙规则
  • 结合其他安全措施(如Fail2ban)增强防护
  • 配置前做好备份,避免误操作导致无法访问

通过合理配置防火墙,可以有效保护服务器免受未授权访问和常见网络攻击。