CLI AI

检查远程服务器上的端口是否开放

2026-06-10

最快的检查方法是 nc -zv host port:succeeded 表示端口开放,refused 表示机器有响应但没人监听,完全没有响应几乎总是防火墙丢弃了数据包。这是三种不同的故障,对应三种不同的修法。下面是分辨它们的决策树,而不是又一份五个工具的清单。

1. 端口真的开放吗?

clai
$ clai 检查 127.0.0.1 上的 8099 端口是否开放→ nc -zv 127.0.0.1 8099Connection to 127.0.0.1 8099 port [tcp/*] succeeded!

-z 只探测连接本身,不发送数据;-v 打印结果。这是最简短的答案。

2. 端口关闭——这也是一个明确的答案

clai
$ clai 检查 8098 端口→ nc -zv 127.0.0.1 8098nc: connect to 127.0.0.1 port 8098 (tcp) failed: Connection refused

Connection refused 说明主机是可达的,并且主动拒绝了连接——这个端口上没人监听。这是好消息:网络没问题,问题出在服务本身。

3. 区分「拒绝」和「沉默」

clai
$ clai 检查 8098 和 8099 端口并显示原因→ nmap --reason -p 8099,8098 127.0.0.1PORT     STATE  SERVICE REASON8098/tcp closed unknown conn-refused8099/tcp open   unknown syn-ack

REASON 这一列才是真正的诊断。syn-ack 是开放。conn-refused 是没人监听。no-response 表示数据包石沉大海——几乎总是防火墙。三种原因只有在这里才能分开看到。

4. 从另一端看:谁在监听

clai
$ clai 显示哪个进程在监听 8099 端口→ ss -tlnp | grep 8099LISTEN 0      5            0.0.0.0:8099       0.0.0.0:*    users:(("python3",pid=2411411,fd=3))

0.0.0.0:8099 表示监听所有网卡。如果显示的是 127.0.0.1:8099,服务就只在本机响应,远程检查会失败,即使服务本身完全正常。这就是第三种原因,也只有在这里才能看到。

5. 没装 nc,也没装 nmap

clai
$ clai 不装额外工具也能检查端口→ timeout 2 bash -c 'echo > /dev/tcp/127.0.0.1/8099' && echo "open" || echo "closed"open

bash 可以通过伪设备 /dev/tcp 打开一个原始 TCP 连接,在没有 nc 也没有 nmap 的裸容器里照样能用。timeout 是必须的——不加的话,遇到被过滤的端口就得等内核自己的超时。

6. 一次检查远程主机上的多个端口

clai
$ clai 检查 example.com 上的 22、80、443 端口→ nmap -Pn -p 22,80,443 example.com

-Pn 跳过 ping 探测。很多主机不响应 ICMP,不加这个参数,nmap 会直接判定主机不可达,根本不去扫描端口。

常见坑

  • 「Connection refused」和「超时」是两种不同的诊断。 拒绝说明数据包到达了主机。沉默说明是防火墙或丢包。不要用治一个的办法治另一个。
  • 用 nmap 扫描不属于你的主机可能违法。 只检查自己的基础设施,别碰别人的。
  • UDP 不能这样检查。 UDP 没有握手,nc -zu 几乎总是显示成功。需要用 nmap -sU,并且要有耐心。

相关问题

端口开放但应用不响应? 说明监听的进程不对,或者响应太慢。查看 ss -tlnp 的输出和服务日志。

怎么在 Windows 下检查端口? 在 PowerShell 里用 Test-NetConnection -Port 443 example.com。

为什么不再推荐用 telnet? 它能做同样的事,但基本上都没装,而 nc 和 /dev/tcp 几乎到处都有。

相关阅读

别再死记硬背 nc 和 nmap 的参数了——描述问题,CliAI 帮你写命令。一行命令安装。