🌐 第02章 · 常用网络诊断工具
ss netstat ping traceroute curl dig nc
常用网络诊断工具¶
这一章把你排障要用到的命令一次配齐:ss/netstat 看连接,ping/traceroute/mtr 测通路,curl 测 HTTP,dig 测 DNS,nc 泛用端口探针。每个都围绕"这台服务器真实端口"举例,学完就能上手排查。
看端口与连接:ss / netstat¶
ss 是 netstat 的现代替代,更快、输出更友好。两者核心语法几乎一致:
ss -tlnp # 所有正在监听(listening)的 TCP 端口,带进程名
ss -ulnp # 所有监听的 UDP 端口
ss -s # 连接的汇总统计
ss -tn state established # 已建立的 TCP 连接
ss -tlnp | grep 3000 # 只找 3000 端口是谁在监听
-t TCP,-u UDP,-l listening,-n 用数字不解释服务名,-p 显示进程。
| 命令 | 作用 | 本机示例输出含义 |
|---|---|---|
ss -tlnp |
列出监听端口 | 显示端口、监听地址、占用进程 |
ss -s |
连接汇总 | 看 TCP 各状态数量 |
ss -tn state established |
已建立连接 | 看谁连进来了 |
提示
netstat -tlnp与ss -tlnp结果一样,老服务器常见 netstat,新的最好直接用ss。ss -tlnp里的*:3000表示监听在所有网络接口;127.0.0.1:3306表示只监听回环。
测主机是否可达:ping¶
ping 发 ICMP 回显请求,测的是"网络层主机通不通",不是"端口服务通不通"。
ping -c 4 2.25.183.254 # 向网关发 4 个包
ping -c 4 8.8.8.8 # 测到公网是否可达
ping -c 4 bangdream.xyz # ping 域名(先解析成 IP 再 ping)
ping -c 4 -I eth0 8.8.8.8 # 指定出口网卡
常见结果语义:
- 有
time回包 → 该主机在网络层可达; Destination Host Unreachable→ 主机或路由不可达,往往是网关/对端配置问题;- 一直超时(卡住)→ 可能被 ICMP 屏蔽(很多云安全组默认丢弃 ping),不代表服务一定不通。
易错点 ping 通只能证明"机器活着",不能证明"某个端口开着"。反过来 ping 不通也不代表服务挂了——很多生产环境故意屏蔽 ICMP。判服务要用端口探测,比如
nc -zv。
看每一跳:traceroute 与 mtr¶
ping 只能到终点;想看到达终点经过了哪些路由器,以及哪一跳在丢包/变慢,用 traceroute 或 mtr。
traceroute 8.8.8.8 # 逐跳列出路径(本机未装需先 apt install traceroute)
mtr -r -c 10 8.8.8.8 # mtr:持续测 10 个包,输出汇总报告
mtr -r -c 10 -n 8.8.8.8 # -n 用数字不解析域名,更快
提示 本机默认装了
mtr但没装traceroute。mtr更强大,它在每一跳上持续探测并能统计丢包率与抖动,排"为什么慢"类问题比一次性traceroute靠谱得多。
| 工具 | 特点 | 适用 |
|---|---|---|
traceroute |
一次遍历,快 | 单纯看到达路径 |
mtr |
持续探测、统计丢包/延迟 | 定位慢链路、丢包点 |
测 HTTP 服务:curl¶
curl 是应用层诊断神器,能测试 HTTP/HTTPS 内容、响应头、状态码、延迟。
curl -v https://bangdream.xyz # -v 输出握手与细节
curl -I https://bangdream.xyz # -I 只看 HTTP 响应头(HEAD)
curl -o /dev/null -s -w "%{http_code}\n" https://bangdream.xyz # 只输出状态码
curl -sk https://bangdream.xyz # -k 跳过证书校验(仅排障,勿用于生产信任)
curl --resolve bangdream.xyz:443:127.0.0.1 https://bangdream.xyz # 强制解析到本地 host
curl http://127.0.0.1:3000 # 直接测本机 Node 应用端口
-w 格式化输出很实用:看状态码、总耗时、DNS 耗时都能一次拿到:
curl -o /dev/null -s -w "状态码:%{http_code} 总耗时:%{time_total}s 连接:%{time_connect}s\n" https://bangdream.xyz
注意
curl -k会跳过 TLS 证书校验,生产上严禁作为"信任"手段,它只是排障临时选项。curl --resolve可以强制让域名解析到指定 IP,用于验证本机 nginx 是否响应,而不受公网 DNS 影响。
测 DNS 解析:dig 与 nslookup¶
dig 比 nslookup 信息更详细,是运维首选。DNS 在下一章细讲,这里先会用。
dig bangdream.xyz # 完整查询域名的 A 记录
dig +short bangdream.xyz # 只输出结果 IP
dig @8.8.8.8 bangdream.xyz # 指定用某台 DNS 服务器查询
dig -x 2.25.183.241 # 反向解析:IP → 域名(PTR)
dig +trace bangdream.xyz # 从头追递归解析全过程
通用端口探针:nc(netcat)¶
nc 既能探测端口,也能监听端口,是排查"端口通不通"的第一工具。
nc -zv 127.0.0.1 3000 # 测本机 3000 端口(z=扫描,v=详细)
nc -zv 127.0.0.1 3306 # 测本地 MySQL
nc -zv bangdream.xyz 443 # 测远端 443 是否开放
nc -zvz 2.25.183.241 22 # 测公网 SSH 端口
nc -lvnp 9999 # 在本机监听 9999 端口(临时)
echo hello | nc -w 2 127.0.0.1 3000 # 发一行数据测试
易错点
nc -zv测端口时,若看到Connected说明端口可达;若超时、timed out,多半是防火墙/安全组拦了或对端不可达;若是Connection refused,才说明端口上压根没进程监听。区分"超时"和"拒绝"是排障的第一步。另外,
nc做端口扫描在未授权目标上是违规行为,只应扫描自有/获得授权的机器。
一张表速览¶
| 命令 | 作用 | 典型用途 | 本机示例 |
|---|---|---|---|
ss -tlnp |
看监听端口 | 确认服务在听 | *:3000 Node 应用 |
ping -c4 |
测主机可达 | 判断机器活没活 | 通网网关 |
mtr -r |
逐跳测丢包 | 定位慢链路 | 到公网路径 |
curl -v |
测 HTTP 服务 | 看响应头/状态码 | HTTPS 站点 |
dig +short |
查 DNS 记录 | 验证解析正确 | 域名→IP |
nc -zv |
测端口开放 | 判端口开没开 | 443 / 22 |
易错点¶
ping通 ≠ 服务通:网络层与传输层是两回事,判端口要用nc/ss。Connection refusedvstimeout別混淆:前者是端口没监听,后者是防火墙/安全组拦截或不可达,处理方式完全不同。curl -k只是排障手段:跳过证书校验仅临时用,别当成信任链。ss监听显示127.0.0.1时外网访问不了:这是刻意隔离,不是"没起来"。- 端口扫描注意授权:只扫自己的服务器,未授权扫描不仅违规还容易被云商判定为攻击。
相关命令¶
ss、netstat、ping、traceroute、mtr、curl、dig、nslookup、nc、lsof -i :端口(看端口占用进程)。