nc 是什么
nc(netcat)在 TCP/UDP 之上做最朴素的读写:既能作为客户端发起连接、把标准输入送到对端,也能作为服务端监听端口接收数据。运维里最高频的用法是探测端口通不通,其次是两机之间传文件、临时起一个 TCP 服务验证连通性。使用前必须知道实现差异:Debian 系默认的 OpenBSD netcat 与 RHEL 系默认的 nmap-ncat 参数并不完全兼容,同一段脚本换到另一系发行版可能直接报错。
基本信息
| 适用平台 | Linux/macOS;Debian 系多为 OpenBSD netcat,RHEL 系为 nmap-ncat,参数存在差异 |
|---|---|
| 命令语法 | nc [选项] 主机 端口 ;监听 nc -l [端口] |
| 常用选项 | -z 只探测不发送数据 -v 输出过程 -w 超时秒数 -l 监听 -k 持续监听 -u 使用 UDP -n 不解析名称 |
| 权限说明 | 监听 1024 以下端口需 root;普通高位端口普通用户可用 |
| 替代工具 | socat 功能更全,nmap 的 -p 扫描更适合批量端口探测 |
典型使用场景
- 端口连通性:判断目标端口是开放、被拒绝还是被丢弃,比 ping 更贴近业务
- 防火墙放行验证:A 机 nc -l 9000,B 机 nc -zv A 9000,先证明链路再查应用
- 一次性传文件:内网快速把 tar 包推到另一台机器,无需开启服务
- 临时调试服务:起一个只回显的 TCP 服务,验证客户端连接行为
- 验证负载均衡与后端:直连某后端 IP 的端口,确认后端本身是否可用
常用示例
常用示例
nc -zv 10.0.0.5 22 # 探测端口,-v 才有输出
nc -z -w 2 10.0.0.5 80 && echo OPEN || echo CLOSED
nc -l 9000 # 监听 TCP 9000(OpenBSD 写法)
nc -lk 9000 # 持续监听,接受多次连接
nc -w 3 10.0.0.5 9000 < file.bin # 发送文件(对端 nc -l > out)
nc -u -z -w2 10.0.0.5 53 # UDP 探测(结果不可靠)
printf 'GET / HTTP/1.0\r\n\r\n' | nc -w 3 example.com 80 # 手写 HTTP 请求探测结果读法
| 输出 | 含义 | 下一步 |
|---|---|---|
| succeeded! | TCP 三次握手成功,端口有服务在听 | 问题多半在应用层,去看服务日志 |
| Connection refused | 目标主机可达但该端口没有监听 | 到目标机用 ss -tlnp 确认服务是否启动、绑定地址是否正确 |
| Connection timed out 或无任何输出 | 包被丢弃,通常是防火墙 DROP 或链路不通 | 两端同时 tcpdump,看 SYN 是否到达、有无回包 |
| Network is unreachable | 本机没有可用的路由 | 用 ip route get 目标地址 核对选路与网关 |
| UDP 无输出也算成功 | UDP 无连接语义,-z 只能证明发得出去 | 改用真实收发数据验证,或抓包确认 |
UDP 的 -z 探测不可靠:没有握手过程,对端不回应用户态也可能显示成功,甚至收到 ICMP 端口不可达仍报成功,判断 UDP 服务必须真实收发一次数据。
不同实现的监听写法不同:OpenBSD netcat 支持 nc -l 9000,部分版本要求 nc -l -p 9000,nmap-ncat 还支持 --sh-exec 等扩展。写跨发行版脚本前先 nc -h 确认当前实现的参数。