最常见原因是漏执行firewall-cmd --reload;--permanent仅写入磁盘配置,需--reload才能加载到内存生效,且须确认zone正确(如--zone=public)、验证用firewall-cmd --permanent --list-ports与firewall-cmd --list-ports双查一致。

firewall-cmd --permanent --add-port=80/tcp 之后没生效?
最常见原因是漏了 firewall-cmd --reload。firewalld 的 --permanent 参数只写入配置文件,不触发热更新;规则仍停留在内存旧状态。执行 --reload 才会从磁盘重新加载并应用所有永久规则。
另一个易错点是 zone 选错:默认 zone 不一定是 public,得先查 firewall-cmd --get-default-zone,再确认该 zone 是否真在使用中(firewall-cmd --get-active-zones)。如果机器连的是内网,可能实际生效的是 internal zone,此时必须显式指定 --zone=internal。
验证是否成功,别只看 --list-ports ——它只显示当前内存中的临时端口。应改用 firewall-cmd --permanent --list-ports 查磁盘配置,再用 firewall-cmd --list-ports 看运行时状态,两者一致才算真正落定。
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT 后 telnet 连不通
iptables 规则本身没问题,但缺了三样关键东西:
- 没放行已建立连接:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT必须在放行新端口之前加,否则响应包被拦住 - 没放开本地回环:
iptables -A INPUT -i lo -j ACCEPT,否则本机curl localhost:8080都失败 - 没保存规则:
iptables规则是内存态的,重启就丢。CentOS/RHEL 要service iptables save;Ubuntu/Debian 得装iptables-persistent并执行netfilter-persistent save
还有一种情况:INPUT 链默认策略是 DROP,而你新加的规则插在了 DROP 后面——那就永远匹配不到。用 iptables -L INPUT -n --line-numbers 看顺序,必要时用 -I INPUT 1 插到最前。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
为什么有些系统用 firewall-cmd,有些必须用 iptables?
不是“必须”,而是发行版默认服务不同:
- CentOS/RHEL 7+、Fedora、AlmaLinux 默认启用
firewalld,且iptables服务被 mask 掉,直接运行iptables命令会报 “No chain/target/match by that name” 错误 - Debian 10 及更早、Ubuntu 16.04/18.04 默认用
iptables,firewalld需手动安装启动 - Ubuntu 20.04+ 默认仍为
iptables,但底层已逐步转向nftables,iptables命令只是兼容层
判断当前生效的是哪个:运行 systemctl list-unit-files | grep -E "(firewalld|iptables)",看哪个是 enabled 且 active (running)。别混用——同时启两个会导致规则冲突,甚至 SSH 断连。
开放端口后还是连不上,该查什么?
防火墙只是其中一环,优先级更低的干扰项常被忽略:
-
ss -tlnp | grep :8080确认服务真在监听,且是0.0.0.0:8080而非127.0.0.1:8080 -
getenforce查 SELinux 状态,若为Enforcing,需额外放行端口:semanage port -a -t http_port_t -p tcp 8080 - 云服务器要检查安全组(阿里云/腾讯云/AWS 控制台),它在防火墙外层拦截,比系统防火墙还早一步
- 本地测试用
nc -zv 127.0.0.1 8080,远程测试用nc -zv 公网IP 8080,区分是本地绑定问题还是网络路径问题
真正麻烦的是多层叠加:云平台安全组 + 主机 firewalld + SELinux + 应用自身 bind 地址限制。每层都得单独验证,不能只盯着一条命令反复试。

















