必须分三层验证:先确认防火墙工具类型及规则存在性(如firewalld需state为running且list-ports含目标端口),再检查服务监听地址是否为0.0.0.0而非127.0.0.1,最后用nc -zv从外部实测连通性,缺一不可。

测试防火墙规则是否真正放行指定端口,不能只看“规则已添加”,而要分三层验证:规则存在性、服务监听状态、外部可达性。漏掉任一环,都可能出现“明明开了却连不上”的问题。
确认防火墙工具类型并检查规则是否写入
Linux 没有统一防火墙命令,先明确当前系统用的是哪个管理器:
-
firewalld(CentOS/RHEL/Rocky/AlmaLinux):
运行 sudo firewall-cmd --state,返回running才说明启用;
查运行时放行端口:sudo firewall-cmd --list-ports;
查永久配置:sudo firewall-cmd --permanent --list-ports;
若两者不一致,说明漏了 sudo firewall-cmd --reload。 -
ufw(Ubuntu/Debian):
运行 sudo ufw status verbose,必须显示Status: active且规则列表中含目标端口(如8080/tcp ALLOW IN);
注意:只写ufw allow 8080默认只开 TCP,UDP 需显式写8080/udp。 -
iptables(传统或兼容层):
运行 sudo iptables -nL INPUT | grep ':端口号',确认有ACCEPT规则;
特别注意顺序:若前面有-j DROP或-j REJECT且匹配宽泛(如-s 0.0.0.0/0),后续 ACCEPT 将被跳过。
验证服务是否在正确地址上监听
防火墙放行只是前提,服务本身得“愿意接客”:
- 运行 sudo ss -tlnp | grep :端口号;
- 关键看
Local Address:Port列:必须是0.0.0.0:端口或具体公网 IP(如192.168.1.100:8080);
若只显示127.0.0.1:8080,说明服务仅限本地访问,防火墙再通也没用。 - 同时确认进程名和 PID 是否对应你的服务(如 nginx、java、python)。
从外部实测端口连通性
本机 loopback(如 curl http://localhost:8080)会绕过防火墙 INPUT 链,必须换机器或模拟外部请求:
- 用 nc -zv 服务器IP 端口(推荐):
返回succeeded→ 通;
返回Connection refused→ 服务未监听或监听地址不对;
返回Connection timed out→ 大概率被防火墙或网络设备拦截。 - 用 telnet 服务器IP 端口:效果类似,但部分系统需额外安装 telnet 客户端。
- HTTP 类服务可加一层验证:curl -v http://服务器IP:端口,看是否有响应头或内容。
借助日志定位拦截点
当 nc/telnet 显示超时,又不确定是哪层拦的,可开启拒绝日志:
- firewalld:执行 sudo firewall-cmd --set-log-denied=all,然后查 sudo tail -f /var/log/firewalld,尝试连接后看是否有匹配记录。
- iptables:临时插入 LOG 规则:sudo iptables -I INPUT 1 -p tcp --dport 端口 -j LOG --log-prefix "BLOCKED-PORT:",再查 sudo journalctl -k | grep BLOCKED-PORT。


















