启用firewalld服务需先执行sudo systemctl enable --now firewalld,再用sudo firewall-cmd --reload应用永久规则,且必须确认活跃zone并验证端口监听地址与外部连通性。

systemctl 启用 firewalld 服务
Linux 默认没开防火墙,firewalld 处于 inactive 状态,放行端口前必须先启动它。不启动就直接 firewall-cmd 添加规则,操作会成功但不生效——因为底层服务根本没跑。
- 检查状态:
systemctl status firewalld,看到inactive (dead)就得先启用 - 启用并开机自启:
sudo systemctl enable --now firewalld - 确认运行中:
sudo firewall-cmd --state应返回running - 如果系统用的是
ufw(如 Ubuntu),别硬套firewall-cmd,命令和逻辑完全不同
firewall-cmd 放行 TCP/UDP 端口
用 firewall-cmd 开端口,关键在「永久生效」和「当前运行时」要分开操作。只加 --permanent 不重载,或只 --reload 不加永久参数,都会导致重启后失效或立刻不生效。
- 永久放行 TCP 8080:
sudo firewall-cmd --permanent --add-port=8080/tcp - 永久放行 UDP 53:
sudo firewall-cmd --permanent --add-port=53/udp - 立即应用所有永久规则:
sudo firewall-cmd --reload - 验证是否生效:
sudo firewall-cmd --list-ports(只显示当前运行时已加载的端口) -
--add-port不支持端口范围缩写如8000-8010,必须写成8000-8010/tcp,漏掉协议类型会报错
放行端口前先确认 zone 和接口绑定
firewalld 按 zone 管理规则,默认是 public,但如果你改过 active zone,或网卡被绑到了 trusted 这类宽松 zone,--add-port 可能加到错误区域,对外依然不通。
- 查当前活跃 zone:
sudo firewall-cmd --get-active-zones - 查指定 zone 的开放端口:
sudo firewall-cmd --zone=public --list-ports - 确保你要操作的 zone 是活跃的,或者显式指定:
sudo firewall-cmd --zone=public --permanent --add-port=22/tcp - 别依赖
--get-default-zone,它只告诉你默认值,不等于当前生效 zone
验证端口是否真通:别只信 firewall-cmd 输出
firewall-cmd --list-ports 显示了端口,不代表外部能连上。可能被云厂商安全组、宿主机 iptables、SELinux 或服务本身监听地址限制挡住。
- 本地测试连通性:
telnet localhost 8080或nc -zv localhost 8080 - 从另一台机器测:
nc -zv your-server-ip 8080,失败优先查云平台安全组 - 确认服务监听在
0.0.0.0:8080而非127.0.0.1:8080:ss -tlnp | grep :8080 - SELinux 可能拦截(尤其 CentOS/RHEL):
sudo setsebool -P httpd_can_network_bind 1(按服务类型调整布尔值)










