Firewalld 防火墙命令新手实战指南
2026/7/23 22:12:33 网站建设 项目流程

在 Linux 服务器运维中,防火墙往往是那道“看不见的墙”。很多时候,服务明明已经启动,端口也在监听,但外部就是无法访问。排查半天才发现,是防火墙规则把流量拦在了门外。对于刚接触 CentOS 7 或 RHEL 系列的朋友来说,面对firewalld这一动态防火墙管理器,最容易踩的坑就是配置了规则却不生效,或者误操作导致自己把自己锁在服务器外面。

其实,firewalld的设计初衷是为了让网络管理更灵活、更安全。它引入了“区域(Zone)”的概念,允许我们针对不同网络环境应用不同的安全策略。只要掌握了核心的配置逻辑和常用命令,不仅能快速解决网络不通的难题,还能构建出细粒度的访问控制体系。

本文将结合实际的运维场景,从基础的服务启停讲起,逐步深入到区域切换、端口放行、IP 黑白名单以及富规则的高级用法。我们会重点区分“即时生效”与“永久生效”的区别,这是避免重启后配置丢失的关键。最后,还会分享一套紧急解锁方案和日常备份策略,帮助你在遇到突发状况时能从容应对,确保服务器的网络安全既稳固又可控。

① 服务状态检查与基础启停操作

在任何配置修改之前,确认防火墙服务的运行状态是第一步。在基于 systemd 的系统中,我们可以使用systemctl命令来管理firewalld服务。要查看当前状态,执行:

systemctl status firewalld

如果输出中包含active (running),说明服务正在正常运行;若显示inactive (dead),则表示服务未启动。对于新初始化的服务器,有时需要手动开启服务并设置为开机自启,以确保系统重启后防火墙依然生效:

systemctl start firewalld systemctlenablefirewalld

在某些调试场景下,我们可能需要临时关闭防火墙来排除干扰。此时可以使用stop命令,但请务必谨慎,因为这会让服务器暂时暴露在无保护状态下:

systemctl stop firewalld

需要注意的是,除非你非常清楚自己在做什么,否则不建议在生产环境中长期关闭防火墙。更安全的做法是通过配置规则来放行特定流量,而不是直接拆除防线。

② 区域概念解析与默认区域切换

firewalld的核心特性之一是“区域(Zone)”。简单来说,区域是一组预定义的规则集合,代表了不同的信任级别。例如,drop区域最严格,丢弃所有传入包;trusted区域最宽松,允许所有流量;而常用的public区域则默认只允许特定的出站流量和已建立的连接。

查看当前默认区域可以使用:

firewall-cmd --get-default-zone

如果需要切换默认区域,比如将默认策略从public改为更严格的drop(需谨慎),可以使用:

firewall-cmd --set-default-zone=public

此外,你可以查看系统支持的所有区域列表:

firewall-cmd --get-zones

理解区域概念非常重要,因为后续的端口开放、服务放行等操作,默认都是针对当前默认区域进行的。当然,你也可以指定特定区域进行操作,这在多网卡或多网络环境的服务器上尤为有用。

③ 快速放行常用端口与服务命令

日常运维中最常见的需求就是开放某个端口,比如 Web 服务的 80 或 443 端口,或者是 SSH 的 22 端口。firewalld提供了两种方式来处理:直接放行端口号,或者放行预定义的服务名称。

放行单个 TCP 端口的命令如下:

firewall-cmd--zone=public --add-port=8080/tcp

如果你希望开放的是标准服务(如 http, https, ssh, dns 等),直接使用服务名会更直观且不易出错:

firewall-cmd--zone=public --add-service=http firewall-cmd--zone=public --add-service=https

执行完上述命令后,规则会立即生效,但默认情况下仅在当前运行时有效。如果服务器重启,这些规则可能会丢失。关于如何让配置永久保存,我们将在后续章节详细讨论。

④ 自定义端口范围与协议配置方法

除了单个端口,很多时候我们需要开放一段连续的端口范围,例如某些游戏服务器或自定义应用使用的端口段。firewalld支持使用连字符-来指定范围。

例如,要开放 6000 到 6010 之间的所有 TCP 端口,命令如下:

firewall-cmd--zone=public --add-port=6000-6010/tcp

同样,UDP 协议也可以单独配置:

firewall-cmd--zone=public --add-port=5000-5010/udp

在配置混合协议时,必须明确指定协议类型(tcp 或 udp),不能省略。如果同时需要 TCP 和 UDP,需要分别执行两条命令,或者在某些版本中使用逗号分隔(视具体版本兼容性而定,分开写最为稳妥)。配置完成后,可以通过--list-ports验证是否添加成功:

firewall-cmd--zone=public --list-ports

⑤ IP 地址黑名单与白名单设置技巧

针对特定 IP 地址进行访问控制是提升安全性的重要手段。firewalld允许我们将某个 IP 或网段直接加入拒绝列表(黑名单)或允许列表(白名单)。

要将某个恶意 IP 加入黑名单,使其无法访问本机的任何服务,可以使用--add-rich-rule或者直接利用 drop 区域的特性,但更推荐在现有区域中添加拒绝规则。例如,在 public 区域拒绝 IP192.168.1.100

firewall-cmd--zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'

相反,如果只想允许特定 IP 访问 SSH 服务,而拒绝其他所有 IP,可以先放行该 IP,再配合其他策略。不过,更简单的白名单思路是利用trusted区域,将受信任的 IP 绑定到该区域,但这通常涉及接口绑定。

对于简单的单 IP 允许,可以在 rich rule 中使用accept

firewall-cmd--zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" accept'

注意,规则的优先级很重要。通常情况下,具体的允许规则应置于通用的拒绝规则之前,或者利用firewalld的规则链顺序机制。

⑥ 富规则实现复杂访问控制策略

当简单的端口放行和 IP 过滤无法满足需求时,firewalld的“富规则(Rich Rules)”功能就派上用场了。它允许我们定义更复杂的逻辑,比如限制连接速率、记录日志、或者结合时间与端口进行控制。

例如,我们要限制 SSH 的连接频率,防止暴力破解,可以设置每分钟最多接受 3 个新连接:

firewall-cmd--zone=public --add-rich-rule='rule family="ipv4" service name="ssh" limit value="3/m" accept'

如果需要记录被拒绝的访问尝试以便审计,可以添加日志规则:

firewall-cmd--zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.200" log prefix="Blocked-IP:" level="info" reject'

富规则的语法结构通常为:rule family="ipv4/ipv6" source address="..." service name="..." port port="..." [limit|log|accept|reject]。虽然语法稍显复杂,但它提供了极高的灵活性,能够满足绝大多数企业级的访问控制需求。

⑦ 配置永久生效与即时生效的区别

这是新手最容易混淆的地方。firewall-cmd执行的命令默认分为“运行时配置”和“永久配置”。

  • 即时生效:不带--permanent参数的命令,修改立即生效,但重启服务或系统后会丢失。适用于临时测试。
  • 永久生效:带上--permanent参数的命令,配置会写入配置文件,但不会立即在当前运行环境中生效,需要重载防火墙才能应用。

最佳实践是同时执行两条命令,或者先加永久配置再重载。例如,永久开放 8080 端口并立即生效:

firewall-cmd--permanent--zone=public --add-port=8080/tcp firewall-cmd--reload

--reload命令非常关键,它会重新加载配置文件,将永久规则应用到运行时环境,且不会中断现有的网络连接。切记不要随意使用restart服务,那会导致连接中断。

⑧ 典型网络不通场景的排查步骤

当发现网络不通时,不要盲目修改规则,应按步骤排查:

  1. 检查服务状态:确认firewalld是否运行 (systemctl status firewalld)。
  2. 确认区域:查看当前默认区域 (firewall-cmd --get-default-zone),确认操作是否在正确的区域进行。
  3. 列出规则:使用firewall-cmd --zone=<zone> --list-all查看该区域下所有放行的服务、端口和规则,确认目标端口是否在列。
  4. 测试连通性:在客户端使用telnet <IP> <Port>nc -zv <IP> <Port>测试端口可达性。
  5. 检查日志:查看/var/log/messages或使用journalctl -u firewalld查看是否有拒绝记录的日志。
  6. 验证路由与监听:确保服务端应用确实在监听对应端口 (ss -tlnp | grep <port>),且路由表正常。

通过这一套流程,基本可以定位是防火墙拦截、服务未启动还是网络路由问题。

⑨ 紧急解锁服务器的高效补救方案

如果在配置过程中误操作,导致自己无法通过 SSH 连接服务器,千万不要慌张。如果有云服务商的控制台(如 VNC、Web Terminal),可以直接登录服务器进行修复。

如果没有带外管理权限,且必须保留防火墙服务,可以尝试利用定时任务来自我解锁。但在无法登录的情况下,这很难实施。最稳妥的“后悔药”其实是之前的备份。

如果是在本地或有物理权限的机器,可以进入单用户模式重置防火墙配置。而在云服务器上,最高效的方法通常是利用云厂商提供的“重置密码”或“救援模式”功能挂载磁盘,修改配置文件。

预防胜于治疗。在进行重大变更前,务必先备份配置(见下一节),或者先在非生产环境验证规则。另外,养成习惯:在修改防火墙规则前,先开启一个倒计时自动关闭防火墙的定时任务(仅限测试环境),以防失联:

# 极度危险,仅限测试环境且有自动恢复机制时使用(at now +5minutes<<<"systemctl start firewalld")

注:生产环境严禁依赖此类临时脚本作为主要恢复手段,应依赖带外管理。

⑩ 日常维护中的备份与还原操作

为了防止配置错误或系统升级导致的规则丢失,定期备份firewalld配置是必要的维护工作。firewalld的配置主要存储在/etc/firewalld/目录下。

备份整个配置目录非常简单:

cp-r/etc/firewalld /etc/firewalld.backup.$(date+%F)

如果需要还原,只需停止防火墙服务,复制备份文件回去,然后重启服务:

systemctl stop firewalldrm-rf/etc/firewalld/*cp-r/etc/firewalld.backup.2023-10-27/* /etc/firewalld/ systemctl start firewalld firewall-cmd--reload

此外,firewalld自身也提供了--lockdown-oneway等高级锁定功能,但在常规运维中,文件系统级别的备份配合版本控制(如 git 管理/etc/firewalld目录)是更推荐的方案。这样每次变更都有迹可循,随时可以回滚到任意历史版本,极大地提升了运维的安全性和可靠性。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询