在 CentOS 7 里,默认启用的防火墙服务是 firewalld,不是 iptables。操作前先别急着改规则,先用 firewall-cmd --state 看清楚当前是否正在运行;开放端口时,要通过 --permanent 持久化添加,随后再执行 --reload,规则才会真正生效。还有一点很容易被忽略:云安全组和服务监听地址也得同步配置好,否则端口就算放开了,外部照样访问不到。

firewalld 是 CentOS 7 默认的防火墙服务,不是 iptables。直接操作 iptables 规则或用旧版命令会失效,甚至导致规则冲突。
确认 firewalld 正在运行
先看防火墙有没有真正在跑:
- 执行
firewall-cmd --state,返回running才算活的;如果报not running,得先启动 - 别只看
systemctl status firewalld的输出——有时显示 “active (exited)” 实际没加载规则,firewall-cmd --state才是唯一可信判断 - 若未运行,必须执行
systemctl start firewalld,再加systemctl enable firewalld确保重启后还在
开放单个端口(如 8080)
真正的要点就在这里:--permanent 和 --reload 这两个动作,一个都不能少。
- 运行
firewall-cmd --zone=public --add-port=8080/tcp --permanent—— 这步只写进磁盘配置,不生效 - 必须紧接着执行
firewall-cmd --reload(不是systemctl restart firewalld),否则端口对外仍是封闭的 - 验证是否成功:用
firewall-cmd --query-port=8080/tcp,返回yes才算真正落库;再用firewall-cmd --list-ports看是否出现在列表里
开放端口段(如 K8s NodePort 30000–32767)
区间写法容易漏掉协议或拼错语法,导致命令静默失败:
- 正确写法是
firewall-cmd --zone=public --add-port=30000-32767/tcp --permanent,注意中间是英文短横-,不是中文破折号或下划线 - UDP 端口段要单独加,比如 DNS 批量放行:
firewall-cmd --zone=public --add-port=30000-32767/udp --permanent - 加完记得
firewall-cmd --reload;不 reload,netstat -ntlp或ss -tuln可能显示端口已监听,但外部仍连不上——因为流量被防火墙拦在入口了
常见失效原因和绕过陷阱
很多“明明加了端口却访问不通”的问题,其实卡在下面几个地方:
- 云服务器(阿里云、腾讯云等)必须同步配置安全组,
firewalld放行只是第二道关,安全组没开等于白搭 - 用
systemctl restart firewalld代替firewall-cmd --reload:前者会清空 runtime 规则,可能把临时添加的 rich rule 或 interface zone 给冲掉 - 误删
--permanent:比如只运行firewall-cmd --add-port=8080/tcp,重启 firewalld 后端口自动消失,排查时容易忽略这点 firewall-cmd --list-ports查不到刚加的端口?先确认当前 zone 是否为public:firewall-cmd --get-active-zones,非 public zone 要显式指定--zone=xxx
firewalld 配置 + 安全组 + 服务本身监听地址(比如是否绑定了 0.0.0.0 而非 127.0.0.1)三者共同决定的。少验任何一个环节,都会让你在 curl 失败后反复怀疑命令有没有输对。