Linux nc 命令:检查 TCP 端口与理解 UDP 结果
nc(Netcat)可建立或监听 TCP、UDP 通信,也常用于检查指定端口是否接受连接。TCP 连接成功仅说明该次传输连接建立,不能证明 TLS、登录或应用业务正常;UDP 的“成功”提示尤其不能直接当作服务可用证据。
TCP(传输控制协议)建立连接,UDP(用户数据报协议)则没有同样的握手过程。本文以 Linux 上常见的 OpenBSD netcat 移植为主要范围,同时说明与上游及 Nmap Ncat 的区别;只检查自己管理或获准诊断的目标和端口。
基本语法与实现差异
nc [options] host port
这是说明性语法,host 与 port 要替换为实际地址和端口,options 表示可选参数。先用 nc -h、man nc 并结合安装包信息确认实现,不要假设所有名为 nc 的程序具有相同参数。
OpenBSD nc、Linux 的 netcat-openbsd、传统 netcat 与 Nmap Ncat 的监听、超时、输入结束和 TLS 支持可能不同。例如上游 OpenBSD 的 -c 是 TLS 选项,而 Linux 某些移植没有该选项;不能从上游手册推断本机已经支持加密连接。
检查本机 TCP 端口
检查回环地址上的 22 端口。
nc -vz 127.0.0.1 22
-v 显示诊断,-z 进行连接检查而不发送正常应用数据。TCP 握手仍会产生网络报文,也可能留下服务日志,所以这不是“完全不发包”。22 是 SSH 的常见端口,但端口号或服务名标签本身不能证明那里运行的一定是 SSH。
127.0.0.1 是当前环境的 IPv4 回环地址。若 SSH 只监听其他接口、IPv6、另一个容器或网络命名空间,该查询结果不能代替那些位置的检查。没有安装或启动本机 SSH 时,连接被拒绝也可能是正常现象。
为连接与空闲等待指定限制。
nc -w 3 -vz 127.0.0.1 80
在本文讨论的 OpenBSD 系实现中,-w 的单位是秒,涉及无法建立连接或已经连接但空闲的等待。它不是所有操作、名称解析、多地址或多个端口合计的统一三秒总时限,且监听 -l 时不按同样方式生效。
直接观察服务发来的数据。
nc -v 127.0.0.1 22
这里没有 -z,建立连接后可以收发数据。服务可能先发欢迎信息,也可能等待符合协议的请求;没有文字不等于没有连接。交互终端中可按 Ctrl+C 结束,不要把普通输入结束键在所有实现中都当成可靠的退出方式。
普通 nc 连接不是 SSH 客户端,不完成 SSH 登录;直接连接 443 也不自动完成 TLS 握手,更不会验证证书或显示网页。检查实际 HTTP 响应可结合 curl 的状态与内容检查,SSH 则继续使用相应客户端验证。
怎样解释成功、拒绝与超时
对获准的远程服务,可用同样方式检查单个端口:
nc -vz example.com 443
连接成功时可能出现如下格式,具体文字依实现而异;这不是本机实际探测结果:
Connection to example.com 443 port [tcp/https] succeeded!
succeeded 表示该次 TCP 连接成功,不等于证书可信、HTTP 正常或账号认证安全。[tcp/https] 是按端口显示的服务标签,不是对服务协议完成认证。example.com 只是示例名称,生产诊断应明确获准的目标地址、协议族和端口。
Connection refused 表示收到了拒绝连接的反馈,常见于没有监听或主动拒绝;不能仅凭这一行锁定某个进程或防火墙规则。超时则可能涉及过滤、丢包、路由、对端状态或返回路径,不能直接认定“远端防火墙丢弃”。
先核对 ss 的监听地址与进程检查,再比较本机、目标与中间路径。DNS 解析错误也应与 TCP 拒绝、超时分开处理;比较时最好保持相同目标 IP、源环境和时间条件。
主要选项与 UDP 限制
| 选项 | 作用与边界 |
|---|---|
-z |
检查端口而不发送正常应用数据,仍有通信报文;不能与 -l 合用。 |
-v |
显示诊断,OpenBSD 系通常把诊断写到标准错误。 |
-w seconds |
设置连接或空闲等待,本文实现中不限制 -l 的监听等待。 |
-u |
改用 UDP,不具备 TCP 握手成功那样的意义。 |
-l |
监听传入连接,地址和端口写法需按本机实现确认。 |
UDP 不回复可能是端口开放但应用忽略了不合法请求,也可能是过滤、丢包或关闭端口的反馈不可见。Debian 的 netcat-openbsd 手册还明确提醒:-uz 组合会报告成功,而不论目标状态。因此不能用它的成功提示或退出状态证明 DNS 等 UDP 服务正常,应观察合法的应用请求与相应回复。
需要本机练习时,可在确认本机支持该语法后,用一个终端运行 nc -l 127.0.0.1 12345,另一个终端运行 nc -v 127.0.0.1 12345,输入一行普通文字,预期在对端看到。完成后在两个终端按 Ctrl+C,并确认监听已结束;端口若被占用,应先调查而不是终止未知进程。
该练习仅绑定回环,避免省略地址后意外监听所有接口。不要把监听端连接到 shell 或敏感文件;-w 在这些实现的监听模式下被忽略,不能依赖它自动清理监听。Ncat 的默认监听与持续连接方式应另查官方说明。
分层检查与结束操作
- 确认 nc 实现、支持项、目标 IP、协议族、端口和授权范围;先检查单个端口,避免把诊断扩大成大范围扫描。
- 在目标侧确认监听地址和所在环境,再进行 -z TCP 连接检查。把诊断、退出状态和具体时间保留下来,不用一条输出代表所有网络路径。
- 用实际协议客户端继续验证 TLS、认证和业务内容。UDP 则必须按该服务的合法协议检查回复,不以 -uz 的“成功”作结论。
- 结束所有手工连接或测试监听,用 ss 等工具核对临时端口已不再监听,再清理自己创建的测试内容;不要为消除超时直接关闭防火墙。
常见问题
nc 与 ncat 是同一个实现吗?
不一定。Nmap Ncat 属于 Netcat 系列,但其选项与 OpenBSD 系 nc 不完全相同。先查安装包与帮助,再选择对应手册,尤其不要混用监听、超时、TLS 和输入结束参数。
官方文档
Debian netcat-openbsd 手册给出 Linux 移植的选项及 UDP 注意事项;OpenBSD 上游 nc 手册与 Nmap Ncat 基本用法应按实际安装实现分别使用。




