linux防火墙动态化核心是firewalld,通过zone、service和rich rule实现按需放行;明确区域用途避免误配,默认public仅放行ssh/dhcpv6-client;服务级放行优先于端口级;rich rule支持ip黑白名单;permanent规则需配合reload生效。

Linux 防火墙配置动态化,核心在于用 firewalld 替代静态规则堆砌,通过区域(zone)、服务(service)和富规则(rich rule)组合,实现“按需放行”——即只在必要时间、对必要来源、开放必要端口,且无需重启服务即可生效。
明确区域用途,避免默认 zone 误配
firewalld 的区域不是装饰,而是策略模板。不同区域对应不同信任等级,直接决定初始放行范围:
- public 是默认区域,仅默认放行 ssh 和 dhcpv6-client,适合外网接口;
- internal 或 home 默认允许更多服务(如 samba、mdns),适合可信内网;
- trusted 允许全部流量,仅用于完全可控的管理网段,慎用;
- drop 静默丢弃所有入向包,适合暴露在公网但只需出站的节点(如爬虫服务器)。
执行 firewall-cmd --get-active-zones 查看当前网卡绑定的 zone,再用 firewall-cmd --zone=internal --list-all 检查该 zone 实际启用的服务与端口,确认是否匹配实际网络角色。
服务级放行优先于端口级,兼顾可读性与安全性
firewalld 内置 service 定义(位于 /usr/lib/firewalld/services/),比裸写端口号更安全、更易维护:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 放行 HTTP:用
sudo firewall-cmd --permanent --add-service=http,自动处理 TCP 80 及关联规则; - 放行 HTTPS + 自定义管理端口:先加
https服务,再单独加sudo firewall-cmd --permanent --add-port=8443/tcp; - 禁用某服务时,用
--remove-service而非手动删端口,避免遗漏或冲突。
自定义服务可通过 XML 文件定义(如 /etc/firewalld/services/myapp.xml),支持协议、端口、模块依赖等,适合标准化部署。
按来源 IP 精准控制,用 rich rule 实现黑白名单
单一 zone 无法满足“所有人能访问 80,但只有运维 IP 才能连 22”的需求,此时 rich rule 是关键:
- 白名单示例:只允许 192.168.10.5 访问 SSH:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.5" port port="22" protocol="tcp" accept' - 黑名单示例:拒绝整个恶意网段:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" reject' - 注意:rich rule 会插入到对应 zone 的规则链顶部,优先级高于普通 service/port 规则,务必测试逻辑顺序。
永久生效与热重载必须成对使用
firewalld 区分 runtime(内存中临时规则)和 permanent(磁盘持久化规则)。常见误区是只运行 --add-port 却没加 --permanent,导致重启后失效:
- 所有带
--permanent的命令,必须后续执行sudo firewall-cmd --reload才真正生效; - 若只想临时调试,可省略
--permanent,但 reload 后规则即消失; - 检查是否写入永久配置:运行
firewall-cmd --permanent --list-all,确认输出包含你添加的内容。










