先确认实际启用的防火墙:firewalld需sudo systemctl status firewalld显示active (running),ufw需sudo ufw status verbose显示Status: active;二者不可混用,否则规则不生效。

外网连不上,八成不是端口没开,而是开了但没生效、或开了但服务根本没监听、或开了但被云平台/路由器拦在了外面。直接上命令前,先确认你系统实际用的是 firewalld 还是 ufw——混用或猜错工具,命令再对也白搭。
怎么快速确认系统用的是 firewalld 还是 ufw
别凭发行版“应该用啥”就动手。Ubuntu 也可能装了 firewalld 并手动启用了它;CentOS 也可能被卸掉 firewalld 改用 ufw。真实状态只看运行时:
- 执行
sudo systemctl status firewalld:看到active (running)才算真在跑 - 执行
sudo ufw status verbose:输出里有Status: active才算启用,Inactive就是关着的 - 两者都 inactive?再查
sudo firewall-cmd --state(返回not running)和which ufw(无输出说明没装) - 如果
firewalld和ufw都没启用,又没看到iptables规则明显在管事,那很可能压根没开防火墙——此时外网不通大概率是其他环节问题
firewalld 开端口必须 permanent + reload,缺一不可
firewall-cmd --add-port=8080/tcp 这种不带 --permanent 的命令,只是临时加进内存,重启或 systemctl restart firewalld 后立刻消失。线上服务绝不能这么干。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 永久写入配置:
sudo firewall-cmd --permanent --add-port=8080/tcp - 立即加载进运行时:
sudo firewall-cmd --reload - 验证是否真生效:
sudo firewall-cmd --list-ports(只显示当前运行时开放的端口) - 别信
firewall-cmd --permanent --list-ports:它只告诉你“文件里存了啥”,不等于“现在正在用啥” - 如果要用服务名代替端口号(比如开 HTTPS),优先用
sudo firewall-cmd --permanent --add-service=https,更安全、可读性更好
ufw 开端口默认只开 TCP,UDP 必须显式声明
sudo ufw allow 8080 看似简单,但它只放行 TCP 流量。如果你的服务跑在 UDP 上(比如 DNS、VoIP、某些游戏服务),这条命令完全无效。
- 明确开 TCP:
sudo ufw allow 8080/tcp - 明确开 UDP:
sudo ufw allow 53/udp - 开一段端口:
sudo ufw allow 9000:9010/tcp(注意是英文冒号,不是短横线) - ufw 启用前必须确保 SSH 端口已放行,否则
sudo ufw enable后立刻失联——比如你改过 SSH 端口为2222,就得先sudo ufw allow 2222/tcp - 规则顺序不可调:ufw 按添加顺序匹配,删错一条可能让后续规则失效;想重来就
sudo ufw reset(会清空所有规则)
开了端口还不通?下一步必须验证三层
防火墙只是其中一环。很多用户卡在这一步,反复检查命令却忽略真正瓶颈:
- 本机是否真在监听?跑
ss -tlnp | grep :8080,确认输出里有0.0.0.0:8080或具体公网 IP,而不是127.0.0.1:8080 - 云服务器(阿里云/腾讯云/AWS)有没有配安全组?安全组规则优先级高于系统防火墙,没开就全白搭
- 家用宽带或企业网络是否有 NAT 或双重路由?外网访问需额外做路由器端口映射(即“虚拟服务器”设置),并确认你有真实公网 IP
- 服务进程是否绑定了
localhost或127.0.0.1?这种绑定方式从外部根本连不到,必须改成0.0.0.0或具体网卡 IP

















