🌐 第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 refused vs timeout 別混淆:前者是端口没监听,后者是防火墙/安全组拦截或不可达,处理方式完全不同。
  • curl -k 只是排障手段:跳过证书校验仅临时用,别当成信任链。
  • ss 监听显示 127.0.0.1 时外网访问不了:这是刻意隔离,不是"没起来"。
  • 端口扫描注意授权:只扫自己的服务器,未授权扫描不仅违规还容易被云商判定为攻击。

相关命令

ss、netstat、ping、traceroute、mtr、curl、dig、nslookup、nc、lsof -i :端口(看端口占用进程)。