Firewalld 防火墙区域与端口管理如何写

作者:袖梨 2026-08-24

firewalld核心是“先定区域、再配规则”,区域决定信任等级,端口或服务决定放行流量;必须明确当前区域(如public、dmz)并配合--permanent与--reload实现持久化生效。

Firewalld 的区域与端口管理,核心是“先定区域、再配规则”,不是直接操作端口,而是把端口放进某个区域的策略里。区域决定信任等级,端口(或服务)决定放行什么流量——两者结合才构成完整访问控制。

明确当前使用的区域

区域是策略容器,必须知道规则加在哪个区域才生效。常见误区是默认用 public,但实际网卡可能属于别的区域。

  1. 查看所有可用区域:firewall-cmd --get-zones
  2. 查看当前活动区域(即哪些网卡属于哪个 zone):firewall-cmd --get-active-zones
  3. 查看某区域的完整配置(含已开放端口和服务):firewall-cmd --zone=public --list-all
  4. 临时切换网卡所属区域(比如把 eth0 放入 dmz):firewall-cmd --zone=dmz --add-interface=eth0
  5. 永久设置默认区域(重启也生效):firewall-cmd --permanent --set-default-zone=work,之后要 --reload

按需开放 TCP/UDP 端口

端口开放必须指定协议(tcp 或 udp),且区分临时和永久。不加 --permanent 的操作重启后失效。

  1. 永久开放 8080/tcp:firewall-cmd --zone=public --add-port=8080/tcp --permanent
  2. 永久开放 UDP 53 端口(DNS):firewall-cmd --zone=public --add-port=53/udp --permanent
  3. 批量开放多个端口:firewall-cmd --zone=public --add-port={80,443,8080}/tcp --permanent
  4. 开放端口范围(如 3000–3100):firewall-cmd --zone=public --add-port=3000-3100/tcp --permanent
  5. 确认是否生效:firewall-cmd --zone=public --query-port=8080/tcp(返回 yes 即成功)

优先用服务代替裸端口

firewalld 预定义了 http、ssh、mysql 等服务,它们自带端口+协议+辅助规则(如连接跟踪),比手动开端口更安全、可维护性更强。

  1. 查系统支持的服务:firewall-cmd --get-services
  2. 永久启用 HTTP 服务:firewall-cmd --zone=public --add-service=http --permanent
  3. 启用自定义服务(需先写好 XML 文件放在 /etc/firewalld/services/):firewall-cmd --reload 后再 --add-service=myservice
  4. 禁用某服务:firewall-cmd --zone=public --remove-service=ftp --permanent

规则生效必须重载

所有带 --permanent 的操作只是写入配置文件,不会立即生效;所有不带 --permanent 的操作即时生效但不持久。两者都要配合重载才能完成闭环。

  1. 重载使永久规则生效:firewall-cmd --reload
  2. 重载不影响已有连接,也不会断 SSH(只要 SSH 规则本身没被删)
  3. 检查防火墙是否运行:firewall-cmd --state(返回 running 表示正常)
  4. 如果 reload 失败,可用 journalctl -u firewalld 查错误日志

相关文章

精彩推荐