firewalld是CentOS 7及以上版本默认的防火墙管理工具,基于Netfilter框架,支持动态更新规则和区域(zone)管理,相比传统的iptables更适合企业级服务器环境。本文将详细解析firewalld的核心功能、配置方法及实战技巧,帮助你高效管理服务器安全。
一、firewalld基础概念与架构
1. 核心组件
- firewalld服务:运行于用户空间,负责管理防火墙规则
- D-Bus接口:提供与其他程序的通信接口,支持API调用
- 区域(zone):预定义的规则集合,不同区域代表不同安全级别(如
public
、trusted
) - 规则优先级:后添加的规则优先于区域默认规则执行
2. 区域(zone)默认策略
区域名称 | 适用场景 | 默认放行规则 |
---|---|---|
public | 公共网络(如互联网) | SSH(22端口)、DHCP客户端 |
trusted | 可信网络(如内网) | 所有连接 |
home | 家庭网络 | 同public +Samba客户端 |
work | 工作网络 | 同public +MDNS、Samba客户端 |
dmz | 隔离区 | 仅放行已建立的连接 |
二、firewalld基础操作命令
1. 服务管理
# 查看服务状态
systemctl status firewalld
# 启动/停止/重启服务
systemctl start firewalld # 启动防火墙
systemctl stop firewalld # 停止防火墙
systemctl restart firewalld # 重启服务
# 设置开机自启
systemctl enable firewalld # 启用自启
systemctl disable firewalld # 禁用自启
2. 规则生效范围
firewalld规则分为「临时生效」和「永久生效」:
- 临时规则:仅当前会话有效,重启后失效
- 永久规则:需使用
--permanent
参数,配置保存至文件,需重载生效
3. 基础查询命令
# 查看当前活动区域
firewall-cmd --get-active-zones
# 查看指定区域的规则
firewall-cmd --zone=public --list-all
# 查看所有区域
firewall-cmd --get-zones
# 查看规则是否存在(如检查80端口是否放行)
firewall-cmd --zone=public --query-port=80/tcp
三、区域(zone)配置实战
1. 切换默认区域
# 将默认区域设置为trusted(危险操作,仅测试用)
firewall-cmd --permanent --set-default-zone=trusted
firewall-cmd --reload # 重载配置
2. 配置public区域规则
▶ 临时放行80端口(Web服务)
firewall-cmd --zone=public --add-port=80/tcp
▶ 永久放行443端口(HTTPS)
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --reload # 重载配置使规则生效
▶ 放行指定服务(如MySQL)
# 查看可用服务列表
firewall-cmd --get-services
# 永久放行MySQL服务
firewall-cmd --permanent --zone=public --add-service=mysql
firewall-cmd --reload
四、高级规则配置:Rich Language语法
firewalld的Rich Language提供更灵活的规则定义,支持源/目标IP、端口范围、协议等复杂条件。
1. 禁止特定IP访问(黑名单)
# 禁止192.168.1.100访问
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='192.168.1.100' drop"
firewall-cmd --reload
# 禁止整个IP段(如192.168.1.0/24)
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' drop"
firewall-cmd --reload
2. 允许指定IP访问特定端口
# 允许192.168.1.50访问SSH(22端口)
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' source address='192.168.1.50' port protocol='tcp' port='22' accept"
firewall-cmd --reload
3. 端口转发(NAT)配置
# 开启IP转发(临时生效)
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久开启(修改配置文件)
sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sysctl -p # 生效配置
# 将外部8080端口转发到内部80端口
firewall-cmd --permanent --zone=public --add-rich-rule="rule family='ipv4' nat port-forward protocol='tcp' port='8080' to-port='80' to-address='192.168.1.10'"
firewall-cmd --reload
五、服务与端口管理最佳实践
1. 常用服务端口配置
▶ 放行远程桌面(RDP,3389端口)
firewall-cmd --permanent --zone=public --add-port=3389/tcp
firewall-cmd --reload
▶ 放行Redis服务(6379端口)
firewall-cmd --permanent --zone=public --add-port=6379/tcp
firewall-cmd --reload
▶ 放行Docker容器端口(如8080)
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --reload
2. 批量放行端口范围
# 放行10000-20000端口范围(TCP协议)
firewall-cmd --permanent --zone=public --add-port=10000-20000/tcp
firewall-cmd --reload
六、防火墙与SELinux的协同配置
1. 检查SELinux状态
sestatus # 查看SELinux状态
getenforce # 查看当前 enforcing 模式(Enforcing/Permissive/Disabled)
2. 允许HTTP服务通过SELinux
# 临时允许(重启后失效)
setsebool -P httpd_can_network_connect 1
# 永久允许(修改SELinux策略)
semanage port -a -t http_port_t -p tcp 8080 # 放行8080端口
七、故障排查与常见问题解决
1. 配置后服务无法访问
排查步骤:
- 检查规则是否正确添加:
firewall-cmd --zone=public --list-ports # 查看放行端口 firewall-cmd --zone=public --list-services # 查看放行服务
- 检查规则是否永久生效:
cat /etc/firewalld/zones/public.xml # 查看配置文件
- 临时关闭防火墙测试:
systemctl stop firewalld # 关闭防火墙后测试服务连通性
2. 云服务器防火墙失效问题
可能原因:
- 云平台安全组未放行对应端口(如阿里云ECS)
- 实例网络配置错误
解决方法:
- 登录云平台控制台,在「安全组」中放行对应端口
- 检查防火墙规则与安全组规则是否冲突
八、firewalld配置备份与恢复
1. 备份配置文件
# 备份主配置文件
cp /etc/firewalld/firewalld.conf /etc/firewalld/firewalld.conf.bak
# 备份区域配置
cp -r /etc/firewalld/zones /etc/firewalld/zones.bak
2. 恢复配置
# 停止firewalld服务
systemctl stop firewalld
# 覆盖配置文件
cp /etc/firewalld/firewalld.conf.bak /etc/firewalld/firewalld.conf
cp -r /etc/firewalld/zones.bak/* /etc/firewalld/zones/
# 启动服务并重载配置
systemctl start firewalld
firewall-cmd --reload
九、进阶技巧:自动化管理与脚本应用
1. 编写防火墙配置脚本
#!/bin/bash
# firewalld_config.sh - 服务器基础防火墙配置脚本
# 定义区域
ZONE="public"
# 清空现有规则(谨慎使用)
firewall-cmd --permanent --zone=$ZONE --remove-all-rules
firewall-cmd --reload
# 放行基础服务
firewall-cmd --permanent --zone=$ZONE --add-service=ssh
firewall-cmd --permanent --zone=$ZONE --add-service=http
firewall-cmd --permanent --zone=$ZONE --add-service=https
# 放行自定义端口
firewall-cmd --permanent --zone=$ZONE --add-port=3306/tcp # MySQL
firewall-cmd --permanent --zone=$ZONE --add-port=6379/tcp # Redis
# 添加黑名单IP
firewall-cmd --permanent --zone=$ZONE --add-rich-rule="rule family='ipv4' source address='119.29.29.29' drop"
# 重载配置
firewall-cmd --reload
echo "firewalld配置完成!"
2. 设置定时任务检查防火墙状态
# 每分钟检查一次防火墙状态并记录日志
* * * * * /usr/bin/firewall-cmd --state >> /var/log/firewall_status.log 2>&1
通过掌握firewalld的配置技巧,你可以根据服务器的安全需求灵活定义防护策略,有效阻止非法访问并保护关键服务。在实际应用中,建议结合企业安全规范定期更新防火墙规则,及时应对新的安全威胁。firewalld的动态更新特性使其非常适合需要频繁调整规则的生产环境,熟练使用这一工具将大幅提升服务器的安全性和管理效率。