centos 7 firewalld默认拒绝所有入站连接,需显式放行端口或ip;开放3306端口的正确命令是firewall-cmd --zone=public --add-port=3306/tcp --permanent后执行firewall-cmd --reload,缺一不可。

CentOS 7 默认用 firewalld,入站规则必须显式放行,不配置就全拒——这不是 bug,是设计。
firewalld 默认拒绝所有入站连接
firewalld 的 public 区域(默认区域)策略是:只允许已知服务(如 ssh)和你手动添加的端口,其余全部丢弃。它不像旧版 iptables 那样“默认放行”,所以新装系统连 ping 都不通、curl 网页返回 connection refused,都是正常现象。
常见误判现象:
-
systemctl status firewalld显示 active,但服务仍无法从外网访问 -
firewall-cmd --list-ports返回空,不代表没规则——可能用了--add-service或--add-source - 临时加了端口(漏掉
--permanent),重启后失效,查不到原因
开放单个 TCP/UDP 端口的正确写法
必须同时满足三个条件:指定区域、声明协议、持久化保存。少一个就白配。
例如开放 3306(MySQL):
firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload
关键点:
-
--zone=public不能省——即使它是默认 zone,firewalld 不会自动 fallback -
/tcp或/udp必须写全,firewall-cmd --add-port=3306会报错 - 没加
--permanent就只是运行时规则,systemctl restart firewalld后消失 -
--reload是必须步骤,不执行则规则不生效(哪怕加了--permanent)
按 IP 段或单 IP 放通入站(比开整个端口更安全)
直接开 80 端口不如只让运维网段能连——尤其对管理后台、数据库端口这类敏感入口。
例如只允许 192.168.10.0/24 访问 22 端口:
firewall-cmd --permanent --zone=public --add-source=192.168.10.0/24 firewall-cmd --permanent --zone=public --add-port=22/tcp firewall-cmd --reload
注意顺序和逻辑:
-
--add-source是给该 IP 段“分配权限进入 public zone”,不是直接放行某端口 - 后续仍需用
--add-port或--add-service显式放行端口,source 本身不带端口策略 - 多个
--add-source可共存;用--list-sources查看当前生效的源地址 - 删 source 要用
--remove-source=xxx,不是--remove-port
查规则、验效果、排故障的实操命令
别只靠 --list-all 看一眼就完事,很多问题出在 zone 绑定、runtime vs permanent 不一致上。
快速验证三步:
- 确认当前生效 zone:
firewall-cmd --get-active-zones(注意输出里 interface 对应的 zone) - 查该 zone 下所有端口:
firewall-cmd --zone=public --list-ports - 查该 zone 是否真绑定了你的 IP:
firewall-cmd --zone=public --list-sources
容易被忽略的坑:
-
firewall-cmd --state返回running≠ 规则已加载——可能--reload失败但没报错 - 修改
publiczone 规则,但网卡实际绑定的是workzone,规则完全不生效 -
--query-port=80/tcp返回no,不一定是没加,可能是加在了别的 zone 里











