前言

服务器初始化时照着教程敲了几条 firewall-cmd,但当时并不真正理解每条命令在干什么。这篇文章是我把 firewalld 重新学了一遍之后的整理。

三个核心概念

  • 区域(zone):一组防火墙规则的集合。默认是 public,一般个人服务器用这一个就够了
  • 服务(service):预定义的端口组合,比如 http 就是 80/tcp,https 就是 443/tcp
  • 端口(port):直接放行某个端口号,服务没覆盖到的就用它

常用命令

查看当前放行了什么:

firewall-cmd --list-all

放行网站需要的服务:

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

放行一个自定义端口(比如测试后端时临时用):

firewall-cmd --permanent --add-port=8000/tcp
firewall-cmd --reload

用完记得关掉:

firewall-cmd --permanent --remove-port=8000/tcp
firewall-cmd --reload

两个容易踩的坑

  1. 忘了 --permanent:不加它规则重启就没了;加了它必须 --reload 才生效。我一开始经常只做其中一半
  2. 阿里云还有一层安全组:firewalld 放行了但网页打不开,多半是控制台里的安全组没放行。两层都要通

我的原则

只开放必要的端口:SSH(22)、HTTP(80)、HTTPS(443)。数据库、后端服务这些都不直接暴露公网,要访问就走 Nginx 反向代理或 SSH 隧道。

总结

防火墙不难,难的是每次改完都想着"哪些门是开的"。定期跑一次 --list-all 检查,心里就有数了。