你在家里连Wi-Fi,网页打不开,但App能用。第一反应可能是DNS问题。可怎么确认是DNS在“掉链子”?直接抓个包看看最实在。
为什么要抓DNS查询包
DNS就像网络的电话簿,把域名(比如 baidu.com)翻译成IP地址。如果这一步出错,浏览器就找不到服务器。通过抓包,你能亲眼看到设备有没有发DNS请求、收到的回应对不对,排查起来不靠猜。
用Wireshark抓DNS包
打开Wireshark,选中正在上网的网卡,开始捕获。在过滤栏输入 dns,画面立刻清爽,只留下DNS相关的数据包。
你会看到一排记录,每一行代表一个数据包。重点关注“Info”这一列。如果看到类似 Standard query A example.com,说明设备在查这个域名的A记录。下面紧跟着一条 Standard query response,那就是DNS服务器回话了。
点开任意一条DNS包,展开“Domain Name System”部分。里面写着“Queries”和“Answers”。Queries是你问了啥,Answers是对方答了啥。比如你查 www.taobao.com,Answer里应该有几条IP地址。要是Answer为空,或者提示“NXDOMAIN”,那说明域名不存在或解析失败。
实际例子:家里路由器DNS被劫持?
有个朋友说,手机连家里的Wi-Fi,搜“百度”,跳到奇怪的广告页。他怀疑DNS被篡改。我们抓了包,发现请求发给了本地运营商DNS,但返回的IP根本不是百度的。换用公共DNS(如1.1.1.1或8.8.8.8)后,抓包显示返回的IP正常了,问题定位清楚。
命令行也能简单抓
不想装Wireshark?用tcpdump也行。在Mac或Linux终端执行:
sudo tcpdump -i en0 -s 0 port 53
这里的 en0 是你的网卡名,port 53 是DNS端口。运行后,打开浏览器搜点东西,终端就会刷出DNS交互过程。虽然不如Wireshark直观,但关键信息都有。
留意加密DNS怎么办
现在不少人用DoH(DNS over HTTPS)或DoT(DNS over TLS),比如Firefox默认开启。这种情况下,DNS请求走的是HTTPS加密通道,Wireshark里只能看到加密流量,看不到具体查了啥域名。这时候得去浏览器设置里临时关掉加密DNS,才能抓明文包。
想确认自己是否用了加密DNS,在Firefox地址栏输 about:networking#dns,能看到当前状态。Chrome也可以在 chrome://net-internals/#dns 查。
小技巧:对比正常与异常情况
如果你不确定抓到的包正不正常,换个网络再抓一次对比。比如先在家抓一次,再切到手机热点抓一次。两边都查同一个网站,看返回的IP是不是一样。不一样,大概率是当前网络的DNS有问题。
抓包不怕多看,看得多了自然就熟悉哪些是正常流程,哪些是可疑信号。别一上来就想搞懂所有字段,先盯住“问了啥”和“回了啥”就行。