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