确认防火墙类型后,firewalld需--permanent加--reload两步生效,ufw须先enable再allow,iptables需save;端口不通时优先检查ss监听、云安全组和selinux。

端口开不了,八成不是“没加规则”,而是规则没进内核、没写进配置、或者压根没生效——firewalld 要 --permanent 加 --reload 两步都做,ufw 要先 enable 才算真启动,iptables 不 save 就等于白配。
怎么确认当前用的是 firewalld 还是 ufw?
混用命令会完全无效,必须先搞清底层防火墙类型:
-
sudo systemctl status firewalld返回active (running)→ 用 firewalld(CentOS/RHEL/Fedora 主流) -
sudo ufw status输出Status: active→ 用 ufw(Ubuntu/Debian 默认) - 两者都 inactive,再查
sudo iptables -L -n;若输出大量规则,说明直连 iptables(常见于 CentOS 6 或手动禁用 firewalld 后) - ⚠️ firewalld 和 ufw 绝对不能同时启用,否则规则互相覆盖,
sudo systemctl stop ufw或sudo systemctl stop firewalld必须停掉一个
firewalld 开放端口必须两步走:永久 + 重载
只执行 firewall-cmd --add-port=8080/tcp 是临时的,重启或 reload 后消失;只加 --permanent 不 --reload,规则根本不会加载进内核。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 永久添加 TCP 端口:
sudo firewall-cmd --permanent --add-port=8080/tcp - 立即生效:
sudo firewall-cmd --reload - 验证是否写入永久配置:
sudo firewall-cmd --permanent --list-ports - 验证是否已加载到运行时:
sudo firewall-cmd --list-ports - ⚠️ 漏写
/tcp或/udp(如写成--add-port=8080),firewalld 静默忽略,不报错也不生效 - ⚠️ 如果服务绑在
eth0接口但默认 zone 是internal,而你往publiczone 加了端口,照样不通;用firewall-cmd --get-zone-of-interface=eth0确认实际生效 zone
ufw 开放端口前必须先 enable,且规则顺序影响结果
ufw 默认是 Inactive,sudo ufw allow 8080 再多也白搭;而且它按添加顺序匹配规则,如果之前执行过 sudo ufw default deny incoming,新 allow 规则必须在 deny 之后添加(ufw 不支持插入,只能靠添加顺序保证优先级)。
- 启用防火墙:
sudo ufw enable(首次运行会提示确认,别直接回车跳过) - 开放 TCP 端口:
sudo ufw allow 8080/tcp(显式指定协议更可靠,避免某些旧版本对ufw allow 8080解析异常) - 删规则必须协议一致:
sudo ufw delete allow 8080/tcp,只写8080会失败 - 查编号删(适合批量):
sudo ufw status numbered→ 记下编号 →sudo ufw delete N - ⚠️ ufw 没有“临时/永久”概念,所有规则写入即持久,但
enable才真正激活;status verbose可看日志和跟踪状态
开了端口还是连不上?先绕过防火墙验证链路
防火墙只是其中一环,很多“端口开了却连不上”的问题出在更底层或更高层:
- 检查服务是否真在监听:
ss -tlnp | grep :8080,没输出说明应用根本没 bind 成功(可能配置错端口、权限不足、或 bind 到127.0.0.1而非0.0.0.0) - 云服务器务必检查安全组(AWS Security Group、阿里云安全组等),它在防火墙外层拦截,开了 firewalld 也无用
- SELinux 可能拦截(尤其 RHEL/CentOS):
sudo setsebool -P httpd_can_network_bind 1或临时设为 permissive 模式测试 - iptables 若被 firewalld 掩盖,
sudo iptables -L INPUT -n | grep :8080应该看不到规则;如果看到,说明 firewalld 没接管成功,得停掉再试
最常被忽略的是:firewalld 的 --permanent 和 --reload 必须成对出现,ufw 的 enable 是前提,而任何环境下,ss -tlnp 和云平台安全组才是最终验证点。










