firewalld是Linux系统中新一代的动态防火墙管理工具,在Fedora、RHEL、CentOS及其衍生发行版中作为默认防火墙使用。与传统的iptables不同,firewalld采用区域(zone)和运行时/永久配置分离的设计,支持无需中断现有连接即可动态修改防火墙规则。
firewalld通过firewall-cmd命令行工具进行管理,将网络接口划分为不同的信任区域,每个区域可以独立配置允许的服务、端口、协议等。这种设计使得防火墙管理更加灵活和直观,尤其适合桌面环境、服务器以及复杂网络场景。掌握firewalld是系统管理员保障网络安全的核心技能。
1. 基本命令
| 命令 | 说明 |
|---|
firewall-cmd --state | |
sudo systemctl start firewalld | |
sudo systemctl stop firewalld | |
sudo systemctl enable firewalld | |
sudo systemctl disable firewalld | |
sudo firewall-cmd --reload | |
sudo firewall-cmd --complete-reload | |
2. 运行时配置与永久配置
默认情况下,firewall-cmd的修改仅影响运行时配置,重启或reload后会丢失。使用--permanent选项持久化规则,然后通过--reload激活。
| 命令 | 说明 |
|---|
sudo firewall-cmd --add-service=http | |
sudo firewall-cmd --add-service=http --permanent | |
sudo firewall-cmd --reload | |
sudo firewall-cmd --runtime-to-permanent | |
3. 区域管理
区域定义了网络连接的信任级别,每个网络接口属于一个区域。
| 命令 | 说明 |
|---|
firewall-cmd --get-zones | |
firewall-cmd --get-default-zone | |
sudo firewall-cmd --set-default-zone=public | |
firewall-cmd --get-active-zones | |
firewall-cmd --zone=public --list-all | |
sudo firewall-cmd --zone=public --change-interface=eth0 | |
sudo firewall-cmd --zone=public --add-interface=eth0 --permanent | |
sudo firewall-cmd --zone=public --remove-interface=eth0 | |
常用区域说明:
| 区域 | 说明 |
|---|
public | |
trusted | |
home | |
work | |
internal | |
dmz | |
block | |
drop | |
4. 服务管理
服务是预定义的端口/协议组合,定义文件位于/usr/lib/firewalld/services/。
| 命令 | 说明 |
|---|
firewall-cmd --get-services | |
firewall-cmd --zone=public --list-services | |
firewall-cmd --info-service=http | |
sudo firewall-cmd --zone=public --add-service=http --permanent | |
sudo firewall-cmd --zone=public --remove-service=http --permanent | |
sudo firewall-cmd --zone=public --add-service={http,https} | |
5. 端口管理
当没有预定义服务时,直接开放指定端口。
| 命令 | 说明 |
|---|
firewall-cmd --zone=public --list-ports | |
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent | |
sudo firewall-cmd --zone=public --add-port=4000-4500/tcp --permanent | |
sudo firewall-cmd --zone=public --add-port=53/udp --permanent | |
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent | |
6. 富规则
富规则提供更精细的控制能力,支持源地址、目标地址、端口、协议、动作等条件组合。
| 命令 | 说明 |
|---|
firewall-cmd --zone=public --list-rich-rules | |
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept' --permanent | |
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.10" reject' --permanent | |
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept' --permanent | |
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" drop' --permanent | |
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="203.0.113.10" reject' --permanent | |
7. 地址伪装(NAT)
地址伪装允许内部网络通过防火墙主机访问外部网络,是实现NAT的核心功能。
| 命令 | 说明 |
|---|
firewall-cmd --zone=public --query-masquerade | |
sudo firewall-cmd --zone=public --add-masquerade --permanent | |
sudo firewall-cmd --zone=public --remove-masquerade --permanent | |
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" masquerade' | |
8. 端口转发
将到达防火墙某个端口的流量转发到其他主机或端口。
| 命令 | 说明 |
|---|
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent | |
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100 --permanent | |
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=8080 --permanent | |
sudo firewall-cmd --zone=public --list-forward-ports | |
注意: 端口转发需要先启用地址伪装(masquerade)。
9. 日志管理
控制被拒绝数据包的日志记录,帮助调试防火墙问题。
| 命令 | 说明 |
|---|
firewall-cmd --get-log-denied | |
sudo firewall-cmd --set-log-denied=all | |
sudo firewall-cmd --set-log-denied=unicast | |
sudo firewall-cmd --set-log-denied=off | |
10. 常用服务器配置示例
# Web服务器基线配置:
| 命令 | 说明 |
|---|
sudo firewall-cmd --set-default-zone=public | |
sudo firewall-cmd --zone=public --add-service=ssh --permanent | |
sudo firewall-cmd --zone=public --add-service=http --permanent | |
sudo firewall-cmd --zone=public --add-service=https --permanent | |
sudo firewall-cmd --reload | |
firewall-cmd --zone=public --list-all | |
# 数据库服务器配置:
| 命令 | 说明 |
|---|
sudo firewall-cmd --zone=internal --add-source=192.168.1.0/24 --permanent | |
sudo firewall-cmd --zone=internal --add-service=mysql --permanent | |
sudo firewall-cmd --zone=public --remove-service=mysql | |
11. 常用选项速查
| 选项 | 说明 |
|---|
--state | |
--reload | |
--permanent | |
--runtime-to-permanent | |
--zone | |
--add-service | |
--remove-service | |
--list-services | |
--add-port | |
--remove-port | |
--list-ports | |
--add-rich-rule | |
--list-rich-rules | |
--add-masquerade | |
--query-masquerade | |
--add-forward-port | |
12. 故障排查
| 问题 | 解决方法 |
|---|
| FirewallD is not running | 启动服务:sudo systemctl start firewalld |
| 规则修改后未生效 | 添加--permanent后需执行--reload |
| 接口没有分配到正确区域 | 使用--get-active-zones检查;用--change-interface重新分配 |
| 端口仍然无法访问 | 检查是否有其他规则阻止;查看--list-all确认规则已添加 |
| 永久规则丢失 | 检查是否使用了--runtime-to-permanent保存;确认--permanent选项正确使用 |
| 富规则语法错误 | 使用--add-rich-rule时注意引号匹配;检查IP地址格式 |
| 端口转发无效 | 确认已启用masquerade;检查目标主机可达性 |
温馨提示: 配置防火墙时建议遵循“最小权限原则”——只开放必要的服务/端口。在生产环境修改规则时,先使用运行时测试(不加--permanent),确认无误后再保存为永久配置。修改SSH相关规则时务必小心,避免把自己锁在外面。使用--list-all定期检查当前生效的规则,确保符合预期。