跳转到内容

命令行网络诊断 ​

「网断了」其实是十几种不同故障的统称:网卡没拿到地址、拿到了但出不去、出得去但域名解析不了、解析正常但某个端口被挡。

界面上它们长得一样,都是「无法连接」。命令行的价值就在于逐层排除,把范围缩小到一段。这一篇给出一条固定的检查顺序。

开始之前 ​

本文命令绝大多数只读,只有清除 DNS 缓存一条需要 sudo 并会改变状态(影响很小,下文说明)。图形界面层面的处理见Wi-Fi 连上但没有网。

诊断输出里会包含你的 IP 地址、网关地址、路由器名称。贴出来求助前先脱敏,至少去掉公网 IP。

第一层:本机有没有地址 ​

sh
ifconfig en0

ifconfig 显示网络接口配置,en0 通常是第一个以太网/无线接口。关注两行:status: active 表示链路是通的;inet 192.168.x.x 是拿到的 IPv4 地址。

不确定哪个接口在用:

sh
networksetup -listallhardwareports

networksetup 是 macOS 管理网络设置的命令行工具,这个子命令列出所有硬件端口和对应的设备名(en0、en1……)。Wi-Fi 对应的那一项写着 Hardware Port: Wi-Fi。

只想要 IP 地址:

sh
ipconfig getifaddr en0

没有输出就说明这个接口没有拿到地址。故障到此为止,后面几层不用查了——先解决连接本身:重新连 Wi-Fi、检查网线、确认路由器 DHCP 是否正常。

地址以 169.254. 开头也属于这一类:那是自动分配的本地链路地址,意思是「没能从路由器拿到地址,自己编了一个」。

第二层:能不能到网关 ​

sh
netstat -rn | grep default

netstat -rn 显示路由表(-r 路由,-n 不做名称解析,输出更快),grep default 取默认路由那一行。后面跟的地址就是你的网关,通常是路由器。

sh
ping -c 4 192.168.1.1

把地址换成你实际的网关。ping 发送探测包,-c 4 表示发 4 个就停(不加会一直发下去)。

通了说明本机到路由器这一段没问题。不通则问题在本地网络内,和运营商、DNS 都无关。

第三层:能不能出去 ​

sh
ping -c 4 1.1.1.1

用 IP 地址而不是域名,是为了把 DNS 排除在外。这一步通了、下一步不通,就能确定问题出在域名解析上。

想看卡在哪一跳:

sh
traceroute 1.1.1.1

traceroute 逐跳显示数据包经过的路由器。中间某些跳显示 * * * 是正常的(那些设备不响应探测),持续到结尾都不通才说明有问题。

第四层:域名能不能解析 ​

sh
dig apple.com

dig 是 DNS 查询工具。关注 ANSWER SECTION,里面是解析结果。没有答案段,或者 status: 不是 NOERROR,就是解析出了问题。

指定用某台 DNS 服务器查,用来区分「域名本身有问题」和「你当前的 DNS 有问题」:

sh
dig @1.1.1.1 apple.com

@服务器地址 指定查询哪台 DNS。换一台就正常,说明你当前用的 DNS 有问题。

看系统当前用的是哪些 DNS:

sh
scutil --dns | grep nameserver

scutil 查询系统配置,--dns 显示 DNS 配置。输出里可能有多组,对应不同网络接口。

清除 DNS 缓存 ​

确认是缓存了旧记录时:

sh
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder

两条命令用分号分隔,依次执行。前者清空目录服务缓存,后者给负责 DNS 解析的 mDNSResponder 进程发送 HUP 信号让它重新加载(killall 按名字发信号,-HUP 是挂起信号,惯例上表示「重新加载配置」)。

影响是接下来一小段时间内解析会略慢——缓存要重建。这不是万能修复手段,只在你确实改过 hosts 文件、或者某个域名刚换过 IP 时才有意义。把它当作通用「网络修复」步骤是没有依据的。

第五层:端口通不通 ​

前四层都正常,但某个服务连不上,查具体端口:

sh
nc -zv apple.com 443

nc(netcat)尝试建立连接,-z 表示只探测不发送数据,-v 显示结果。成功会打印 succeeded。

443 是 HTTPS 端口,22 是 SSH,5432 是 PostgreSQL。这条命令能区分「服务器没开这个端口」和「中间有东西挡住了」。

看本机哪些程序占用了端口:

sh
sudo lsof -i -P -n | grep LISTEN

lsof 列出打开的文件(网络连接也算),-i 只看网络相关,-P 不把端口号转成服务名,-n 不做地址反查(这两个都是为了快)。grep LISTEN 只留正在监听的。

这是排查「端口已被占用」的标准做法,比重启服务有效得多。

测速与响应 ​

sh
networkQuality

这是 macOS 自带的测速工具。除了上下行速率,它还给出 RPM(每分钟往返次数)——衡量网络在满负载时的响应质量。

这个指标比单纯的带宽更贴近实际体验:视频会议卡顿、网页加载慢,很多时候不是带宽不够,而是响应差。带宽很高但 RPM 很低,说明路由器存在缓冲区膨胀,和你买多大的宽带无关。

按 man networkQuality 的说明,测试会实际连接互联网并消耗流量,用移动热点时注意这一点。

一张排查顺序表 ​

步骤命令不通说明什么
1ipconfig getifaddr en0没连上网络或没拿到地址
2ping 网关本地网络有问题
3ping 1.1.1.1出口或运营商有问题
4dig apple.comDNS 有问题
5nc -zv 主机 端口特定服务或端口被挡

按顺序走,不要跳步。 跳到第 4 步发现解析失败就去换 DNS,而实际原因是第 1 步就没拿到地址——这种误判很常见。

检查结果 ​

网络正常时,这四条应当都有正常输出:

sh
ipconfig getifaddr en0
ping -c 2 1.1.1.1
dig +short apple.com
nc -zv apple.com 443

+short 让 dig 只输出解析结果,适合快速确认。

动手练习 ​

制造一次可控的故障,验证你能定位它:

  1. 网络正常时,把上面四条命令的输出各存一份作为基线。
  2. 在「系统设置 → 网络 → Wi-Fi → 详细信息 → DNS」里,把 DNS 改成一个不存在的地址(如 192.0.2.1),记得先抄下原设置。
  3. 重新跑那四条命令,确认第 1、2 条正常而 dig 失败——你成功地把故障定位在了第四层。
  4. 执行 dig @1.1.1.1 apple.com,确认换一台 DNS 就正常,进一步坐实结论。
  5. 把 DNS 设置改回原样,重新验证。

成功标准是第 3 步:你能只凭命令输出判断故障在哪一层,而不是逐个尝试网上的「修复方法」。网络慢而不是断的情况,见网络慢或时断时续。

返回系统内部