防火墙 (firewalld)
firewalld 是 CentOS / AlmaLinux / Rocky Linux 上默认的动态防火墙管理工具。它提供了基于 zone(区域)的防火墙管理方式,支持运行时修改规则而无需重启服务。
firewalld 基本概念
Section titled “firewalld 基本概念”Zone(区域)
Section titled “Zone(区域)”Zone 是 firewalld 的核心概念。每个 zone 定义了一组信任级别和对应的防火墙规则,网络接口会被分配到不同的 zone 中。
常用的内置 zone:
| Zone | 说明 |
|---|---|
public | 默认区域。适用于公共网络环境,仅允许选定的入站连接 |
trusted | 允许所有入站流量 |
home | 适用于家庭网络,信任网络中的其他设备 |
work | 适用于工作网络 |
internal | 适用于内部网络 |
dmz | 适用于 DMZ 区域的服务器,仅允许特定入站连接 |
external | 适用于启用 NAT 伪装的外部网络 |
block | 拒绝所有入站连接,会返回 ICMP 拒绝消息 |
drop | 丢弃所有入站数据包,不返回任何响应 |
检查 firewalld 服务状态
Section titled “检查 firewalld 服务状态”sudo systemctl status firewalldsudo systemctl enable --now firewalldsudo firewall-cmd --statefirewall-cmd 基础操作
Section titled “firewall-cmd 基础操作”查看当前配置
Section titled “查看当前配置”sudo firewall-cmd --get-default-zonesudo firewall-cmd --get-active-zonessudo firewall-cmd --list-allsudo firewall-cmd --zone=public --list-allsudo firewall-cmd --get-zones查看可用服务
Section titled “查看可用服务”sudo firewall-cmd --get-servicessudo firewall-cmd --info-service=http永久规则 vs 运行时规则
Section titled “永久规则 vs 运行时规则”firewalld 的规则分为两种:
- 运行时规则 (runtime): 立即生效,但重启 firewalld 或系统后丢失
- 永久规则 (permanent): 写入配置文件,重启后仍然有效,但不会立即生效
sudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --reload也可以同时添加运行时和永久规则(无需 reload):
sudo firewall-cmd --add-service=httpsudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --reloadsudo firewall-cmd --permanent --add-service=http --add-service=httpssudo firewall-cmd --reloadsudo firewall-cmd --permanent --remove-service=httpsudo firewall-cmd --reload查看已放行的服务
Section titled “查看已放行的服务”sudo firewall-cmd --list-servicessudo firewall-cmd --permanent --add-port=8080/tcpsudo firewall-cmd --reloadsudo firewall-cmd --permanent --add-port=53/udpsudo firewall-cmd --reloadsudo firewall-cmd --permanent --add-port=3000-3100/tcpsudo firewall-cmd --reloadsudo firewall-cmd --permanent --remove-port=8080/tcpsudo firewall-cmd --reload查看已放行的端口
Section titled “查看已放行的端口”sudo firewall-cmd --list-portsZone 操作
Section titled “Zone 操作”修改默认 zone
Section titled “修改默认 zone”sudo firewall-cmd --set-default-zone=internal将接口分配到指定 zone
Section titled “将接口分配到指定 zone”sudo firewall-cmd --permanent --zone=internal --change-interface=ens33sudo firewall-cmd --reload向指定 zone 添加规则
Section titled “向指定 zone 添加规则”sudo firewall-cmd --permanent --zone=internal --add-service=mysqlsudo firewall-cmd --reloadRich Rules(富规则)
Section titled “Rich Rules(富规则)”Rich rules 提供了更精细的防火墙控制能力,可以根据源地址、目标地址、端口等条件灵活设置规则。
Rich rules 的基本结构:
rule family="ipv4" source address="源地址" service name="服务名" accept/reject/drop允许特定 IP 访问某个服务
Section titled “允许特定 IP 访问某个服务”sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'sudo firewall-cmd --reload拒绝特定 IP 的访问
Section titled “拒绝特定 IP 的访问”sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.100" drop'sudo firewall-cmd --reload允许特定 IP 访问指定端口
Section titled “允许特定 IP 访问指定端口”sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="172.16.0.0/16" port port="3306" protocol="tcp" accept'sudo firewall-cmd --reload带日志记录的规则
Section titled “带日志记录的规则”sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.200" log prefix="BLOCKED: " level="warning" drop'sudo firewall-cmd --reload查看 rich rules
Section titled “查看 rich rules”sudo firewall-cmd --list-rich-rules删除 rich rule
Section titled “删除 rich rule”sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="10.0.0.100" drop'sudo firewall-cmd --reload常见场景示例
Section titled “常见场景示例”Web 服务器
Section titled “Web 服务器”sudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --permanent --add-service=httpssudo firewall-cmd --permanent --add-service=sshsudo firewall-cmd --reload数据库服务器(限制访问源)
Section titled “数据库服务器(限制访问源)”sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="mysql" accept'sudo firewall-cmd --reload自定义应用端口
Section titled “自定义应用端口”sudo firewall-cmd --permanent --add-port=3000/tcpsudo firewall-cmd --reloadsudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080sudo firewall-cmd --reloadsudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.50sudo firewall-cmd --permanent --add-masqueradesudo firewall-cmd --reload启用 IP 伪装(NAT)
Section titled “启用 IP 伪装(NAT)”sudo firewall-cmd --permanent --add-masqueradesudo firewall-cmd --reload查看完整的防火墙规则
Section titled “查看完整的防火墙规则”sudo firewall-cmd --list-all-zones查看底层 nftables/iptables 规则
Section titled “查看底层 nftables/iptables 规则”sudo nft list rulesetEL 8 及更早版本使用 iptables 后端:
sudo iptables -L -n -v查看 firewalld 日志
Section titled “查看 firewalld 日志”sudo journalctl -u firewalld --no-pager -n 30紧急模式(阻断所有网络)
Section titled “紧急模式(阻断所有网络)”sudo firewall-cmd --panic-onsudo firewall-cmd --panic-offsudo firewall-cmd --query-panic备份当前防火墙配置
Section titled “备份当前防火墙配置”sudo cp -r /etc/firewalld /etc/firewalld.backup.$(date +%Y%m%d)sudo cp -r /etc/firewalld.backup.20260324/* /etc/firewalld/sudo firewall-cmd --reload