要在 Linux 服务器上配置 FirewallD,请安装并启用该服务,选择一个默认区域,然后使用 firewall-cmd 命令允许所需的服务和端口。永久应用更改,重新加载并验证。使用区域、丰富的规则和伪装功能可以实现精细的控制。本指南涵盖 RHEL、Rocky/AlmaLinux、CentOS Stream、Fedora、Ubuntu 和 Debian 等操作系统。
本指南将教您如何使用 firewall-cmd 在 Linux 服务器上安全有效地配置 FirewallD。我们将涵盖区域、服务、端口、富规则、NAT/端口转发、运行时规则与永久规则以及故障排除等内容。无论您 manage VPS(虚拟专用服务器) 专用服务器无论是云虚拟机还是云虚拟机,本教程都旨在让初学者友好,并可直接用于生产环境。
什么是 FirewallD?为什么在 2026 年还要使用它?FirewallD 是一个动态防火墙 manager 使用 nftables(或旧系统上的 iptables)来强制执行网络策略,而不会中断连接。它引入了区域(信任级别)、命名服务和丰富的规则,从而更容易大规模地保护服务器。它是 RHEL 8/9、Rocky/AlmaLinux、CentOS Stream 和 Fedora 的默认配置,并且在 Ubuntu/Debian 上可用。
先决条件和安全检查清单SSH ACCESS 具有 sudo 权限控制台/KVM 访问或第二个 SSH 会话以避免锁定了解你的接口名称(例如,eth0、ens160)云端注意事项:同时,请在服务提供商的安全组中打开端口(AWS 安全组、Azure 网络安全组、GCP 防火墙规则)。在 Ubuntu 系统中,请勿同时运行 UFW 和 FirewallD(如果使用 FirewallD,请禁用 UFW)。安装并启用防火墙根据您的 Linux 发行版安装并启动 FirewallD。
# RHEL / Rocky / AlmaLinux / CentOS Stream / Fedora
sudo dnf install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --state # running
# Ubuntu 22.04/24.04 and Debian
sudo apt update && sudo apt install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --state # running
# If UFW is enabled on Ubuntu, disable it to avoid conflicts:
sudo systemctl stop ufw && sudo systemctl disable ufw快速入门:60 秒内设置安全默认设置设置默认区域并允许 SSH 这样你就不会把自己锁在外面了。如果这是个Web服务器,那就打开HTTP/HTTPS协议。
# Set default zone
sudo firewall-cmd --set-default-zone=public
# Allow SSH (runtime), then make it permanent
sudo firewall-cmd --add-service=ssh
sudo firewall-cmd --add-service=ssh --permanent
# Allow web traffic (HTTP/HTTPS)
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-service=https --permanent
# Apply persistent rules
sudo firewall-cmd --reload
# Verify
sudo firewall-cmd --list-all了解防火墙区域区域代表信任等级。常见区域包括:
丢弃:丢弃所有传入信息;仅允许传出信息。阻止:拒绝传入,允许传出。公共:不受信任的网络(服务器默认设置)外部:用于带伪装的 NAT内部:服务器后面的可信局域网可信:全部接受(谨慎使用)查看和设置默认区域sudo firewall-cmd --get-default-zone
sudo firewall-cmd --set-default-zone=public
sudo firewall-cmd --get-zones
sudo firewall-cmd --get-active-zones将接口和源分配给区域# Assign interface to a zone (permanent)
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
# Put a subnet into trusted zone (e.g., office IP range)
sudo firewall-cmd --zone=trusted --add-source=203.0.113.0/24 --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --get-active-zones允许服务和端口FirewallD 使用命名服务(服务文件定义端口/协议)。为了清晰起见,建议使用服务而不是原始端口。
允许服务# Common services
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打开特定端口# Single TCP port
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
# Port range and UDP
sudo firewall-cmd --zone=public --add-port=6000-6010/tcp --permanent
sudo firewall-cmd --zone=public --add-port=1194/udp --permanent
sudo firewall-cmd --reload创建自定义服务只需定义一次应用程序,然后通过名称引用即可。
# /etc/firewalld/services/myapp.xml
# Load and allow it
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --add-service=myapp --permanent
sudo firewall-cmd --reload彻底移除规则sudo firewall-cmd --zone=public --remove-service=http --permanent
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload运行时配置与永久配置FirewallD 维护着独立的运行时配置和永久配置。运行时更改会立即生效,但重启后会丢失。永久更改在重新加载或重启后仍然有效。
按键命令# Make current runtime rules persistent
sudo firewall-cmd --runtime-to-permanent
# Apply permanent rules to runtime
sudo firewall-cmd --reload
# See what’s active
sudo firewall-cmd --list-all
sudo firewall-cmd --list-all --zone=public丰富的规则、伪装和端口转发丰富的规则支持细粒度的逻辑(源、目标、日志记录、速率限制)以及NAT功能,例如地址伪装和端口转发。
允许来自单个 IP 地址的服务sudo firewall-cmd --add-rich-rule='rule family="ipv4"
source address="198.51.100.10" service name="ssh" accept' --permanent
sudo firewall-cmd --reload速率限制和日志访问# Log and limit SSH accepts to 10 per minute
sudo firewall-cmd --add-rich-rule='rule family="ipv4" service name="ssh"
log prefix="FW-SSH " level="notice" limit value="2/m" accept' --permanent
sudo firewall-cmd --reload
# Global log of denied packets (optional)
sudo sed -i 's/^#*LogDenied=.*/LogDenied=all/' /etc/firewalld/firewalld.conf
sudo systemctl reload firewalldNAT:伪装和端口转发在进行网络地址转换 (NAT) 时,请将面向互联网的网卡配置在外部区域。确保已启用 IP 转发。
# Enable IP forwarding (runtime and persistent)
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-firewalld.conf
sudo sysctl -p /etc/sysctl.d/99-firewalld.conf
# Enable masquerade (NAT) on public zone
sudo firewall-cmd --zone=public --add-masquerade --permanent
# Forward external port 80 to local 8080
sudo firewall-cmd --zone=public
--add-forward-port=port=80:proto=tcp:toport=8080 --permanent
# Forward external 2222 to internal host 10.0.0.10:22
sudo firewall-cmd --zone=public
--add-forward-port=port=2222:proto=tcp:toaddr=10.0.0.10:toport=22 --permanent
sudo firewall-cmd --reload监控、测试和故障排除检查活动规则sudo firewall-cmd --list-all
sudo firewall-cmd --list-all --zone=public
sudo firewall-cmd --list-services
sudo firewall-cmd --list-ports测试连接从远程机器上,使用 curl 或 nmap 验证端口是否开放。如果使用云虚拟机,请确认云防火墙允许相同的端口。
curl -I http://your.server.ip
nmap -Pn -p 22,80,443 your.server.ip常见问题和修复被锁在外面 SSH: 使用控制台/KVM,允许 SSH 提供服务,或者将您的管理员 IP 地址置于受信任区域。Ubuntu 系统上的 UFW 冲突: 如果正在使用 FirewallD,请禁用 UFW。服务无法打开: 检查正确的区域、云安全组,以及应用程序是否监听正确的接口。意外下降: 查看 LogDenied 和日志:journalctl -u firewalld -f。紧急封锁: firewall-cmd --panic-on(阻止所有入站/出站流量)。准备就绪后,使用 --panic-off 关闭此功能。2026 年硬化技巧最小特权原则: 只开放你需要的端口;管理端口最好使用 IP 地址作为允许列表。使用公共区域连接互联网,使用内部区域连接私有网络,除特殊情况外,避免使用受信任区域。策略性地记录和限制对服务速率敏感的服务(SSH(RDP隧道)。使用 Ansible 或 cloud-init 实现自动化,以保持服务器间规则的一致性。备份配置: 维护前解压 /etc/firewalld;对自定义服务 XML 使用版本控制。将操作系统防火墙与提供商级防火墙保持一致,以实现纵深防御。端到端示例:Web + SSH + 私人管理员此示例允许公共网络流量,限制流量。 SSH 分配给您的办公室 IP 地址,并将主网卡分配给公共网络。
# Set public as default and assign interface
sudo firewall-cmd --set-default-zone=public
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
# Public web
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# Restrict SSH to office IP
sudo firewall-cmd --add-rich-rule='rule family="ipv4"
source address="203.0.113.50/32" service name="ssh" accept' --permanent
# Deny other SSH implicitly (no generic ssh allow in public)
sudo firewall-cmd --reload
sudo firewall-cmd --list-all --zone=public常见问题解答:Linux 服务器上的 FirewallD“防火墙D中的运行时和永久配置有什么区别?”运行时规则立即生效,但重启后会失效。永久规则保存在 `/etc/firewalld` 文件中,并在重新加载或重启后生效。使用 `u002du002dpermanent` 命令写入永久规则,然后运行 `firewall-cmd u002du002dreload` 命令。要将当前的运行时配置保存为永久配置,请使用 `firewall-cmd u002du002druntime-to-permanent` 命令。
“如何在防火墙中打开端口?”可以使用命名服务或端口规则。例如:运行 `firewall-cmd u002du002dzone=public u002du002dadd-service=http u002du002dpermanent` 或 `firewall-cmd u002du002dzone=public u002du002dadd-port=8080/tcp u002du002dpermanent`,然后运行 `firewall-cmd u002du002dreload`。使用 `firewall-cmd u002du002dlist-all` 进行验证,并从远程主机进行测试。
哪些 Linux 发行版在 2026 年默认使用 FirewallD?RHEL 8/9、Rocky Linux、AlmaLinux、CentOS Stream 和 Fedora 默认使用 FirewallD。在 Ubuntu 22.04/24.04 和 Debian 上,可以通过 apt 安装 FirewallD,但 UFW 可能是默认防火墙;如果切换到 FirewallD,请禁用 UFW。
如何仅允许特定 IP 地址访问端口?创建一条允许来自该 IP 地址的流量访问目标服务或端口的富规则。例如:`firewall-cmd add-rich-rule='rule family=ipv4source address=198.51.100.10port port=3306protocol=tcpu accept' permanent;` 然后重新加载防火墙。避免使用绕过此限制的通用允许规则。
“FirewallD 是否取代了 iptables 或 nftables?”FirewallD 是一个高级防火墙。 manager 是一个用于编写数据包过滤器的程序。在现代发行版中,它使用 nftables 作为后端;在较旧的系统中,它可能使用 iptables。您无需手动编写 nftables/iptables 规则即可获得一致的命令(firewall-cmd)。