最快速底层判断依据是ss -tuln输出是否含目标端口;若未列出(如:22),说明服务未监听,非防火墙问题,而是服务未启动或配置错误。

直接看 ss -tuln 输出有没有监听目标端口
这是最快速、最底层的判断依据。只要 ss -tuln(或 netstat -tuln)没列出目标端口(比如 :22 或 :3000),就说明服务根本没在监听——不是防火墙问题,是服务压根没起来或监听配置错了。
注意几个关键点:
-
-t表示 TCP,-u是 UDP,-l是 listening 状态,-n跳过 DNS 解析,避免卡顿 - 重点看
Local Address:Port列:如果只看到127.0.0.1:3000,说明服务只绑定了本地回环,外部连不上,不是防火墙挡的,是配置问题 - 如果连
127.0.0.1:3000都没有,那基本可以断定服务进程没运行,或者启动失败后静默退出了
用 curl -v http://localhost:端口 或 telnet localhost 端口 本地验证
这一步是为了排除“服务起来了但只对外不听本地”这种极少见的反直觉情况(实际几乎不存在),主要用来确认服务进程是否真能响应请求。
常见现象和含义:
-
Connection refused:和远程一样,说明本地也连不上 → 服务没监听,或监听地址/端口和你连的不一致 -
Empty reply from server或卡住几秒后超时:服务可能在监听,但没返回 HTTP 响应(比如 Node.js 进程卡死、Python Flask 没写app.run()) - 成功返回 HTML / JSON / 重定向:说明服务正常,问题一定出在外部访问路径上(防火墙、NAT、安全组等)
查 systemctl status 服务名 和 journalctl -u 服务名 -n 30 -e
很多服务看似 “running”,其实是 systemd 报告状态为 active,但内部已崩溃或卡在初始化阶段。光看 systemctl status 不够,必须翻日志。
特别要注意这些信号:
- 状态显示
active (exited):常见于某些一次性服务(如sshd-keygen@.service),不代表主服务在跑 - 日志里出现
bind: Address already in use:端口被占,新服务起不来,但旧进程可能不是你要的那个 - 出现
Permission denied或Failed to listen on port:SELinux、cap_net_bind_service 限制、或非 root 用户试图绑定低端口( - 最后一行是
Started ...但没后续请求日志:服务启动了,但没收到连接,说明前面某层(防火墙、代理、DNS)截断了流量
别急着关防火墙,先用 sudo ss -tulnp 看 PID 和程序名
ss -tulnp 比 ss -tuln 多一个 p,能直接看到哪个进程在监听。这是区分“服务挂了”和“端口被挡”的分水岭动作。
如果输出里有目标端口,且显示了 pid/进程名(例如 1234/sshd 或 5678/node):
- 说明服务确实在监听,此时远程
Connection refused几乎一定是防火墙、云平台安全组、或网络中间设备(如 NAT 网关)拦截了 SYN 包 - 这时候再查
ufw status(Ubuntu)、firewall-cmd --list-all(CentOS/RHEL)、或云控制台的安全组规则 - 注意:
iptables -L可能看不到 modern firewalld 规则,别只信它
如果 ss -tulnp 没显示对应端口,那所有防火墙排查都是白忙——先解决服务本身。


















