跳转到内容

防火墙 (firewalld)

firewalld 是 CentOS / AlmaLinux / Rocky Linux 上默认的动态防火墙管理工具。它提供了基于 zone(区域)的防火墙管理方式,支持运行时修改规则而无需重启服务。

Zone 是 firewalld 的核心概念。每个 zone 定义了一组信任级别和对应的防火墙规则,网络接口会被分配到不同的 zone 中。

常用的内置 zone:

Zone说明
public默认区域。适用于公共网络环境,仅允许选定的入站连接
trusted允许所有入站流量
home适用于家庭网络,信任网络中的其他设备
work适用于工作网络
internal适用于内部网络
dmz适用于 DMZ 区域的服务器,仅允许特定入站连接
external适用于启用 NAT 伪装的外部网络
block拒绝所有入站连接,会返回 ICMP 拒绝消息
drop丢弃所有入站数据包,不返回任何响应
查看 firewalld 运行状态
sudo systemctl status firewalld
启动并设为开机自启
sudo systemctl enable --now firewalld
检查 firewalld 是否正在运行
sudo firewall-cmd --state
查看默认 zone
sudo firewall-cmd --get-default-zone
查看所有活动的 zone 及其绑定的接口
sudo firewall-cmd --get-active-zones
查看当前 zone 的完整规则
sudo firewall-cmd --list-all
查看指定 zone 的规则
sudo firewall-cmd --zone=public --list-all
列出所有可用的 zone
sudo firewall-cmd --get-zones
列出所有预定义的服务
sudo firewall-cmd --get-services
查看某个服务的详细定义(如 http)
sudo firewall-cmd --info-service=http

firewalld 的规则分为两种:

  • 运行时规则 (runtime): 立即生效,但重启 firewalld 或系统后丢失
  • 永久规则 (permanent): 写入配置文件,重启后仍然有效,但不会立即生效
添加永久规则并立即生效
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload

也可以同时添加运行时和永久规则(无需 reload):

同时生效运行时和永久规则
sudo firewall-cmd --add-service=http
sudo firewall-cmd --permanent --add-service=http
放行 HTTP 服务(永久)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
同时放行 HTTP 和 HTTPS
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload
移除 HTTP 服务放行(永久)
sudo firewall-cmd --permanent --remove-service=http
sudo firewall-cmd --reload
列出当前 zone 已放行的服务
sudo firewall-cmd --list-services
放行 TCP 8080 端口
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
放行 UDP 端口
sudo firewall-cmd --permanent --add-port=53/udp
sudo firewall-cmd --reload
放行端口范围
sudo firewall-cmd --permanent --add-port=3000-3100/tcp
sudo firewall-cmd --reload
移除端口放行
sudo firewall-cmd --permanent --remove-port=8080/tcp
sudo firewall-cmd --reload
列出当前已放行的端口
sudo firewall-cmd --list-ports
将默认 zone 改为 internal
sudo firewall-cmd --set-default-zone=internal
将 ens33 分配到 internal zone
sudo firewall-cmd --permanent --zone=internal --change-interface=ens33
sudo firewall-cmd --reload
在 internal zone 中放行 MySQL 服务
sudo firewall-cmd --permanent --zone=internal --add-service=mysql
sudo firewall-cmd --reload

Rich rules 提供了更精细的防火墙控制能力,可以根据源地址、目标地址、端口等条件灵活设置规则。

Rich rules 的基本结构:

rule family="ipv4" source address="源地址" service name="服务名" accept/reject/drop
只允许 192.168.1.0/24 网段访问 SSH
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
拒绝来自 10.0.0.100 的所有连接
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.100" drop'
sudo firewall-cmd --reload
允许 172.16.0.0/16 访问 TCP 3306 端口
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
记录并拒绝来自某 IP 的连接
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
sudo firewall-cmd --list-rich-rules
删除指定的 rich rule
sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="10.0.0.100" drop'
sudo firewall-cmd --reload
Web 服务器典型配置:放行 HTTP、HTTPS 和 SSH
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
只允许应用服务器网段访问 MySQL
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
Node.js 应用运行在 3000 端口
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload
将外部 80 端口转发到内部 8080 端口
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
sudo firewall-cmd --reload
将流量转发到另一台主机
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.50
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
启用 IP 伪装
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload
查看所有 zone 的所有规则
sudo firewall-cmd --list-all-zones
查看 firewalld 生成的 nftables 规则
sudo nft list ruleset

EL 8 及更早版本使用 iptables 后端:

查看 iptables 规则(EL 8)
sudo iptables -L -n -v
查看 firewalld 相关日志
sudo journalctl -u firewalld --no-pager -n 30
开启紧急模式(阻断所有流量)
sudo firewall-cmd --panic-on
关闭紧急模式
sudo firewall-cmd --panic-off
检查是否处于紧急模式
sudo firewall-cmd --query-panic
备份 firewalld 配置目录
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