什么是 firewalldfirewalld 是 Red Hat 系CentOS / Rocky / Alma / Fedora默认的动态防火墙管理器底层还是调用内核的 netfilter/nftables只是它在上面包了一层更易用的区域Zone模型。和老式 iptables 直接写规则不同firewalld 的核心思想是把网络接口和流量按信任等级分到不同区域每个区域预置一套放行策略。你不用去记复杂的数据包匹配语法只要告诉防火墙这块网卡属于 public 区域、开放 80 和 443即可。它有两个容易踩坑的特性也是本文重点配置分**运行时Runtime和永久Permanent**两套互不影响直到你主动同步规则按区域 → 富规则 → 服务 → 端口的顺序匹配理解这个顺序才能预测一条流量到底放不放行。原理一数据包是怎么被处理的这是一个数据包进来后firewalld 先决定它属于哪个区域再在该区域内按优先级依次检查三层规则最后给出放行或拒绝的裁决。原站配图数据包处理流程分步说明数据包到达来自公网或内网的流量进入服务器网卡firewalld 开始接管。判定区域先按源地址绑定、再按网卡绑定、最后用默认区域决定该流量归属哪个 Zone。匹配富规则在 Zone 内富规则优先级最高可精确到来源 IP、端口与动作allow/reject/drop。匹配服务其次检查 Zone 开放的预定义服务如 http、ssh命中即放行。匹配端口再检查手动开放的裸端口如 8080/tcp命中即放行。默认策略裁决若富规则、服务、端口都未命中则按该 Zone 的默认策略public 默认拒绝裁决。放行或拒绝最终流量被 accept 或丢弃。注意只有命中规则才会放行这正是 firewalld 默认安全的设计。记住这个顺序富规则 服务 端口 区域默认策略。比如你既开放了ssh服务又写了一条拒绝某个 IP 的 22 端口的富规则那该 IP 依然会被拒——因为富规则优先级更高。原理二区域Zone到底是什么Zone 本质上是一组预定义的信任模板。把网卡或来源 IP 关联到某个 Zone就等于套用了那套模板里的放行策略。常用 Zone 的信任度从低到高大致是Zone信任度典型用途drop最低丢弃所有入站包只出不进像隐形block很低拒绝入站回icmp-host-prohibitedpublic默认公开网络只开放你显式放行的服务internal较高内网默认放行更多服务home/work高可信的家用/办公网络trusted最高接受所有流量几乎不设防判定一条流量属于哪个 Zone顺序是先看源地址绑定 → 再看网卡绑定 → 最后用默认区域。这就是为什么有时候你明明开放了 public 的端口却不通——那块网卡可能根本不在 public 里。bash代码解读复制代码# 看默认区域、活跃区域、所有区域 firewall-cmd --get-default-zone firewall-cmd --get-active-zones firewall-cmd --get-zones # 把某 IP 网段绑定到指定区域常用在区分内外网信任度 firewall-cmd --zonepublic --add-source192.168.1.0/24 --permanent原理三运行时配置 vs 永久配置这是新人翻车最多的地方。firewalld 把配置存在两个地方运行时内存和永久磁盘。不带--permanent的改动只活在内存里立刻生效但重启即丢带--permanent的写入磁盘重启后保留但不会立刻生效必须--reload同步进运行时。原站配图运行时与永久配置的区别分步说明执行命令你在终端敲下一条 firewall-cmd 规则。不带 --permanent规则只写进运行时内存立即生效但服务器重启后消失。带 --permanent规则写入磁盘配置文件重启后依然保留但不会立刻生效。--reload 同步执行 firewall-cmd --reload把永久配置加载到运行时使改动当前生效。常见坑改了规则重启却没生效多半是漏了 --permanent或改完忘了 --reload。实战建议生产环境养成习惯——所有持久化规则都加--permanent然后用一条firewall-cmd --reload统一生效临时排障想立刻试效果又不污染配置时才用不带--permanent的版本。原理四端口转发是怎么工作的端口转发Port Forwarding常用于公网只暴露 80内部实际跑在 8080的场景。firewalld 通过--add-forward-port把进来的流量重定向而跨主机转发还需要--add-masqueradeIP 伪装来正确改写地址否则后端回包时源地址不对连接起不来。原站配图端口转发流程公网 80 转发到内网 8080分步说明外部请求公网客户端向防火墙的公网 IP:80 发起请求。命中转发规则firewalld 命中--add-forward-portport80:prototcp:toport8080决定把流量转到 8080。开启 IP 伪装跨主机转发需要--add-masquerade否则回包地址会错、连接建立不起来。转发到后端流量被送到内网后端 192.168.1.100:8080 处理。响应回包后端响应经防火墙 NAT 改写后原路返回客户端。效果外部只看到 :80内网服务被安全地暴露出来无需在公网直接开放后端端口。常见使用方法配合工具前面这些参数--zone、--add-port、--add-service、--add-forward-port、--add-rich-rule、--permanent一个个记很容易错。站内的 Firewalld 命令生成器 把这些做成可视化表单选好区域、协议、端口、是否永久直接生成可复制的命令还能在常用命令速查里一键拷贝。下面几个场景都是高频需求开放 / 关闭端口bash代码解读复制代码# 永久开放 8080/tcp最常用 firewall-cmd --zonepublic --add-port8080/tcp --permanent # 临时开放重启失效 firewall-cmd --zonepublic --add-port8080/tcp # 关闭端口 firewall-cmd --zonepublic --remove-port8080/tcp --permanent # 开放一段端口 firewall-cmd --zonepublic --add-port8000-9000/tcp --permanent # 改完必须重载 firewall-cmd --reload开放 / 关闭服务等价于一堆预定义端口比如http就是 80/tcpbash代码解读复制代码firewall-cmd --zonepublic --add-servicehttp --permanent firewall-cmd --zonepublic --add-servicehttps --permanent firewall-cmd --zonepublic --remove-servicehttp --permanent # 看看有哪些内置服务名可用 firewall-cmd --get-services端口转发bash代码解读复制代码# 把公网 80 转到本机 8080 firewall-cmd --zonepublic --add-forward-portport80:prototcp:toport8080 --permanent # 转到另一台机器的 8080必须开 masquerade firewall-cmd --zonepublic --add-forward-portport80:prototcp:toport8080:toaddr192.168.1.100 --permanent firewall-cmd --zonepublic --add-masquerade --permanent firewall-cmd --reload富规则精细到 IP 的访问控制当开放整个端口给所有人太危险时用富规则Rich Rule可以精确到哪个来源 IP、哪个端口、允许还是拒绝。它的优先级高于服务和端口适合做白名单。bash代码解读复制代码# 只允许 192.168.1.100 访问 3306 firewall-cmd --zonepublic --add-rich-rulerule familyipv4 source address192.168.1.100 port port3306 protocoltcp accept --permanent # 拒绝某个 IP 的所有流量 firewall-cmd --zonepublic --add-rich-rulerule familyipv4 source address10.0.0.5 reject --permanent # 查看 / 移除富规则 firewall-cmd --zonepublic --list-rich-rules firewall-cmd --zonepublic --remove-rich-rulerule familyipv4 source address192.168.1.100 port port3306 protocoltcp accept --permanent日常排错Q命令敲了外网还是连不上先确认两点规则是否带了--permanent且已--reload网卡到底在哪个 Zonefirewall-cmd --get-active-zones。再firewall-cmd --zonepublic --list-ports看端口确实在里面。Q改完重启规则没了漏了--permanent或改了永久配置没--reload。运行时配置重启即失这是设计如此。Q端口转发不生效跨主机转发忘开--add-masquerade是最常见的坑回包地址不对导致三次握手失败。Q怎么应急锁死所有入站firewall-cmd --panic-on会拒绝一切入站仅本机可操作--panic-off解除。Q服务和端口有什么区别服务是 firewalld 预定义的一组端口 辅助配置的别名如http80/tcp端口是裸的协议/端口号。开放http服务比手动写80/tcp更语义化也便于统一管理。相关工具Firewalld 命令生成器可视化生成上述所有命令并内置常用命令速查。安全常见端口排错时快速确认端口对应的服务与风险。Linux 常用命令系统/网络/权限等配套运维命令。作者MiracleHuang链接https://juejin.cn/post/7687499915136385078来源稀土掘金著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。
