一次“Google 能打开,FlexTV 打不开”的 DNS 故障排查:从 curl 超时到完整证据链

最近遇到一个很有代表性的网络问题:

同一台电脑上,https://www.google.com/ 可以正常打开,但 https://www.flextv.cc/ 无法访问。

看到这种现象,很多人的第一反应是"FlexTV 网站挂了"。但"某个网站打不开"只是表象,真正的故障可能发生在 DNS、TCP、TLS、HTTP、CDN、代理,甚至浏览器扩展中的任何一层。

这篇文章记录一次完整的定位过程:如何通过 curl、nslookup 和 --resolve 建立证据链,证明问题发生在 DNS 解析阶段,并给出 Windows、macOS 和路由器端的解决方法。

一、先说结论

本次排查得到的结论是:

当前网络使用的 DNS 服务器 192.168.8.1 无法及时解析 www.flextv.cc;改用 1.1.1.1 或 8.8.8.8 后可以正常获得 CDN 地址。绕过默认 DNS、直接连接 CDN 后,FlexTV 返回 HTTP 200。

因此,本次故障发生在当前网络的 DNS 解析链路,而不是 FlexTV 首页服务或 HTTPS 证书整体不可用。

这里特意使用"当前网络的 DNS 解析链路异常",而不是直接说"运营商屏蔽"或"路由器 Bug"。客户端测试可以定位故障层级,但仅凭这些证据,还不能唯一确定路由器内部究竟是缓存异常、上游 DNS 故障、过滤规则,还是转发程序问题。

二、打开一个 HTTPS 网站时,系统做了什么

浏览器访问下面这个地址:

arduino 复制代码
https://www.flextv.cc/

通常要经过以下步骤:

  1. DNS 解析 :把 www.flextv.cc 转换成一个或多个 IP 地址。
  2. TCP 连接:连接目标 IP 的 443 端口。
  3. TLS 握手:协商加密连接,并校验服务器证书。
  4. HTTP 请求:发送请求,服务器或 CDN 返回状态码和内容。
  5. 浏览器渲染:加载 HTML、CSS、JavaScript、图片和接口数据。

这几个步骤存在明确的先后关系:如果 DNS 没有返回 IP,客户端就不知道该连接哪台服务器,后面的 TCP 和 TLS 自然无法开始。

因此,排查时最重要的事情不是反复刷新浏览器,而是先回答一个问题:请求到底失败在哪一层?

三、第一步:用 curl 对比两个网站

在 Windows PowerShell 中执行:

arduino 复制代码
curl.exe -I -sS -L --max-redirs 5 --connect-timeout 10 --max-time 20 https://www.flextv.cc/
curl.exe -I -sS -L --max-redirs 5 --connect-timeout 10 --max-time 20 https://www.google.com/

FlexTV 的关键输出是:

csharp 复制代码
curl: (28) Resolving timed out after 10008 milliseconds

Google 则正常返回:

复制代码
HTTP/1.1 200 OK

Resolving timed out 说明了什么

这里最关键的词是 Resolving。

它表示 curl 在等待域名解析结果时超时,还没有取得 www.flextv.cc 对应的 IP 地址。所以本次请求尚未进入 TCP 连接阶段,也没有开始 TLS 证书校验。

不同错误通常对应不同的故障层:

错误表现 更可能的故障层
Resolving timed out DNS 解析
Could not resolve host DNS 解析
Failed to connect TCP、路由或防火墙
Connection refused 端口未监听或被主动拒绝
certificate problem TLS 或证书
HTTP 403/404/500 已到达 HTTP/应用层

Google 能返回 200 说明同一台电脑具备基本联网能力,但这并不能单独证明 FlexTV 是 DNS 问题。接下来还需要直接查询 DNS。

四、第二步:对比默认 DNS 和公共 DNS

先使用系统当前配置的 DNS:

复制代码
nslookup www.flextv.cc
nslookup flextv.cc
nslookup www.google.com

本次环境的默认 DNS 是:

makefile 复制代码
Server:  UnKnown
Address: 192.168.8.1

查询 www.flextv.cc 时出现超时:

csharp 复制代码
DNS request timed out

但查询 www.google.com 可以返回多个地址,说明这个 DNS 并不是完全不可用,而是对特定域名或特定解析链路出现了问题。

接下来跳过默认 DNS,直接查询 Google DNS 和 Cloudflare DNS:

复制代码
nslookup www.flextv.cc 8.8.8.8
nslookup www.flextv.cc 1.1.1.1

两者都能返回结果,关键内容类似:

makefile 复制代码
Name:    www.flextv.cc.queniuaa.com
Aliases: www.flextv.cc
Addresses: 多个 CDN 边缘 IP

这一步说明:

  • www.flextv.cc 的公共 DNS 记录存在;
  • 域名通过 CNAME 指向 CDN;
  • 公共递归 DNS 可以继续解析 CNAME 并返回多个边缘节点 IP;
  • 当前默认 DNS 192.168.8.1 没有及时完成同样的解析。

为什么 flextv.cc 和 www.flextv.cc 的结果不同

排查中还发现:默认 DNS 能解析根域名 flextv.cc,但解析 www.flextv.cc 超时。

这是完全可能的,因为它们是两条不同的 DNS 记录:

复制代码
flextv.cc
www.flextv.cc

根域名可能直接使用 A 记录,而 www 子域名可能使用 CNAME 接入 CDN。能够解析根域名,并不代表一定能够正确处理 www 的 CNAME 链。

五、第三步:绕过 DNS 验证 HTTPS 和网站服务

现在已经知道公共 DNS 能返回 CDN IP,但还需要回答另一个问题:

即使 DNS 有问题,FlexTV 的 HTTPS 服务本身是否正常?

可以使用 curl 的 --resolve 参数,为单次请求临时指定域名和 IP 的对应关系:

css 复制代码
curl.exe -I -sS --connect-timeout 10 --max-time 20 `
  --resolve www.flextv.cc:443:43.109.161.39 `
  https://www.flextv.cc/

在 macOS 或 Linux 中,可以写成一行:

css 复制代码
curl -I -sS --connect-timeout 10 --max-time 20 --resolve www.flextv.cc:443:43.109.161.39 https://www.flextv.cc/

本次返回:

arduino 复制代码
HTTP/1.1 200 OK
Server: Tengine
Content-Type: text/html;charset=utf-8

为什么 --resolve 的证据很重要

--resolve 只为这一次 curl 请求提供临时映射,不会修改系统 hosts 文件。

虽然连接使用了指定 IP,但请求 URL 仍是 https://www.flextv.cc/,因此:

  • HTTP Host 仍然是 www.flextv.cc;
  • TLS SNI 仍然携带 www.flextv.cc;
  • curl 仍会按照 www.flextv.cc 校验证书。

最终返回 HTTP 200,说明在这个测试节点上,TCP、TLS、CDN 和 HTTP 首页服务都能工作。

至此证据链完整了:

  1. 默认访问 FlexTV:DNS 解析超时;
  2. 默认访问 Google:返回 HTTP 200;
  3. 默认 DNS 查询 FlexTV:超时;
  4. 两个公共 DNS 查询 FlexTV:均成功;
  5. 绕过默认 DNS:FlexTV 返回 HTTP 200。

所以,问题可以定位到当前 DNS 解析链路。

注意:上面的 CDN IP 是本次排查时的临时结果,后续可能变化。不要把它长期写入 hosts 文件。

六、确认 Windows 当前使用的 DNS

在 PowerShell 中执行:

sql 复制代码
Get-DnsClientServerAddress -AddressFamily IPv4 |
  Where-Object { $_.ServerAddresses.Count -gt 0 } |
  Format-Table -AutoSize InterfaceAlias,InterfaceIndex,ServerAddresses

本次输出为:

复制代码
InterfaceAlias  InterfaceIndex  ServerAddresses
以太网          8               {192.168.8.1}

192.168.8.1 是局域网私有地址,通常代表路由器。电脑把查询交给路由器后,由路由器的 DNS 代理继续向上游服务器查询。

因此,"默认 DNS 是路由器"并不意味着真正出问题的一定是路由器硬件,还可能是:

  • 路由器 DNS 转发程序异常;
  • 路由器缓存了错误或不完整的记录;
  • 路由器配置的上游 DNS 异常;
  • 家长控制、广告拦截或安全策略匹配了域名;
  • VPN、代理或安全软件接管了 DNS;
  • CNAME 链在某一层被错误处理。

七、Windows 解决方法

方法一:通过图形界面修改

  1. 打开"设置"→"网络和 Internet"。
  2. 进入当前使用的"以太网"或"Wi-Fi"。
  3. 找到 DNS 服务器分配,点击"编辑"。
  4. 选择手动 IPv4。
  5. 首选 DNS 设置为 1.1.1.1。
  6. 备用 DNS 设置为 8.8.8.8。
  7. 保存后关闭并重新打开浏览器。

方法二:使用管理员 PowerShell

先查看接口名称:

sql 复制代码
Get-DnsClientServerAddress -AddressFamily IPv4

假设接口名为"以太网",执行:

javascript 复制代码
Set-DnsClientServerAddress `
  -InterfaceAlias "以太网" `
  -ServerAddresses "1.1.1.1","8.8.8.8"

如果使用 Wi-Fi,需要把接口名改成实际名称,例如:

javascript 复制代码
Set-DnsClientServerAddress `
  -InterfaceAlias "Wi-Fi" `
  -ServerAddresses "1.1.1.1","8.8.8.8"

然后清除 DNS 缓存:

css 复制代码
Clear-DnsClientCache

也可以使用传统命令:

bash 复制代码
ipconfig /flushdns

Windows 回滚为自动 DNS

如果需要重新使用 DHCP 或路由器下发的 DNS:

javascript 复制代码
Set-DnsClientServerAddress `
  -InterfaceAlias "以太网" `
  -ResetServerAddresses
​
Clear-DnsClientCache

八、macOS 解决方法

方法一:通过系统设置修改

  1. 打开"系统设置"→"网络"。
  2. 选择当前使用的 Wi-Fi,点击"详细信息"。
  3. 进入"DNS"。
  4. 添加 1.1.1.1 和 8.8.8.8。
  5. 保存并重新打开浏览器。

旧版本 macOS 的入口可能是"系统偏好设置"→"网络"→"高级"→"DNS"。

方法二:使用终端

先查看所有网络服务:

复制代码
networksetup -listallnetworkservices

如果当前服务名是 Wi-Fi,执行:

arduino 复制代码
sudo networksetup -setdnsservers "Wi-Fi" 1.1.1.1 8.8.8.8

刷新 DNS 缓存:

复制代码
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

如果使用网线,服务名可能是 Ethernet、USB 10/100/1000 LAN 或其他名称,需要按 networksetup -listallnetworkservices 的实际输出替换。

macOS 回滚为自动 DNS

sql 复制代码
sudo networksetup -setdnsservers "Wi-Fi" Empty
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

其中 Empty 表示清除手动 DNS,恢复使用网络自动下发的配置。

九、多台设备都失败时,应该修改路由器

如果同一 Wi-Fi 下的 Windows、Mac、手机都无法访问 FlexTV,逐台修改 DNS 只能治标,更合理的做法是修复路由器。

进入路由器后台,在 WAN、Internet、DHCP 或 DNS 页面中设置:

复制代码
首选 DNS:1.1.1.1
备用 DNS:8.8.8.8

保存后根据路由器说明重新连接 WAN 或重启路由器,然后让终端设备重新连接网络。

如果是公司网络,不建议自行绕过内部 DNS。企业 DNS 可能承担内部域名解析、审计和访问控制,应把 nslookup 与 curl 输出提供给网络管理员处理。

十、修改 DNS 后如何验证

不要只看浏览器是否"偶尔能打开"。建议分层验证。

1. 验证 DNS

Windows:

复制代码
nslookup www.flextv.cc

macOS:

复制代码
nslookup www.flextv.cc
dig www.flextv.cc

期望看到 CNAME 或 IP,而不是 DNS request timed out。

2. 验证 HTTPS

Windows:

arduino 复制代码
curl.exe -I -sS --connect-timeout 10 --max-time 20 https://www.flextv.cc/

macOS:

arduino 复制代码
curl -I -sS --connect-timeout 10 --max-time 20 https://www.flextv.cc/

返回 200 最理想。返回 301 或 302 也说明 DNS、TCP 和 TLS 已经成功,应继续检查重定向目标。

有些网站不支持 HEAD 请求,可能对 curl -I 返回 405 Method Not Allowed。这时可以使用普通 GET,只丢弃响应正文:

Windows:

perl 复制代码
curl.exe -sS -o NUL -w "%{http_code}`n" https://www.flextv.cc/

macOS:

bash 复制代码
curl -sS -o /dev/null -w '%{http_code}\n' https://www.flextv.cc/

3. 验证浏览器

  • 完全关闭浏览器后重新打开;
  • 使用无痕窗口测试;
  • 检查安全 DNS(DoH)配置;
  • 暂时断开 VPN 或代理进行对比;
  • 检查扩展、内容过滤器和安全软件;
  • 确认页面图片、样式和接口也能正常加载。

十一、如果仍然打不开,按结果继续分层

检测结果 可能原因 下一步
公共 DNS 也无法解析 权威 DNS、域名状态或到公共 DNS 的网络异常 换网络,查询权威 DNS 和域名注册状态
DNS 正常,但 443 连接超时 路由、防火墙、CDN 节点或服务器不可达 curl -v、换网络、检查防火墙
TCP 成功,但 TLS 失败 证书、SNI、系统时间或中间人代理 检查系统时间、证书链和 HTTPS 代理
curl 正常,浏览器失败 浏览器缓存、扩展、DoH、代理或 HSTS 无痕模式、关闭扩展、检查浏览器策略
只有公司网络失败 企业 DNS、网关或安全产品策略 联系管理员并提交命令输出
只有一台设备失败 单机 DNS、代理、hosts 或安全软件 对比其他设备和网络接口配置

还可以检查 hosts 文件中是否存在旧映射。

Windows:

sql 复制代码
Get-Content C:\Windows\System32\drivers\etc\hosts |
  Select-String -Pattern "flextv"

macOS:

bash 复制代码
grep -i "flextv" /etc/hosts

这里只建议检查相关条目,不要在不了解用途的情况下删除其他 hosts 配置。

十二、本文所有执行命令的逐条解析

前面的正文更关注排查思路,这一节把实际出现过的命令逐条拆开说明。为了避免误操作,先按性质分为两类:

  • 只读诊断命令 :curl、nslookup、dig、Get-DnsClientServerAddress、Get-Content、grep。它们只读取或发起测试请求,不会修改 DNS 配置。
  • 配置修改命令 :Set-DnsClientServerAddress、networksetup -setdnsservers。它们会改变网络接口的 DNS,需要管理员权限,并应提前了解回滚方法。

1. 两条 curl 对比探测命令

arduino 复制代码
curl.exe -I -sS -L --max-redirs 5 --connect-timeout 10 --max-time 20 https://www.flextv.cc/
curl.exe -I -sS -L --max-redirs 5 --connect-timeout 10 --max-time 20 https://www.google.com/

两条命令只有 URL 不同,目的是在同一台电脑、同一网络、相同参数下进行对照实验。

组成部分 含义
curl.exe 明确调用 Windows 上的原生 curl 程序。写出 .exe 可以避免某些旧版 PowerShell 把 curl 当成其他命令别名。
-I 只请求响应头,通常发送 HTTP HEAD 请求,不下载完整网页正文。适合快速检查状态码、重定向和服务器响应。
-s Silent,隐藏进度条等常规输出。
-S Show error。与 -s 同时使用时,仍显示错误信息,因此组合写成 -sS。
-L 自动跟随 301、302、307、308 等重定向。
--max-redirs 5 最多跟随 5 次重定向,防止错误配置导致无限循环。
--connect-timeout 10 连接阶段最多等待 10 秒。该阶段通常包含 DNS 解析、TCP 建连以及建立安全连接所需的前置过程,所以本次 DNS 超时大约在 10 秒后被终止。
--max-time 20 限制整个 curl 操作最多运行 20 秒,包括连接和数据传输。
https://.../ 要测试的完整 URL。使用 HTTPS 表示目标端口通常为 443,并需要进行 TLS 握手。

第一条命令测试 FlexTV,第二条测试 Google。Google 返回 200,而 FlexTV 输出 Resolving timed out,所以差异出现在目标域名的解析路径,而不是所有网络请求都失败。

2. 使用默认 DNS 查询三个域名

复制代码
nslookup www.flextv.cc
nslookup flextv.cc
nslookup www.google.com

nslookup 的基本语法是:

css 复制代码
nslookup 要查询的域名 [指定的DNS服务器]

当末尾没有指定 DNS 服务器时,它会使用当前系统配置的默认 DNS。本次环境中就是 192.168.8.1。

三条命令分别承担不同作用:

命令 为什么执行
nslookup www.flextv.cc 查询实际打不开的 www 子域名,确认默认 DNS 是否能返回 CNAME 或 IP。
nslookup flextv.cc 查询根域名,与 www 子域名对比,判断是否只有某一条 DNS 记录或 CNAME 链异常。
nslookup www.google.com 使用相同默认 DNS 查询一个已知可访问域名,验证默认 DNS 是否完全失效。

nslookup 输出中的常见字段含义:

输出 含义
Server / Address 实际接收本次查询的 DNS 服务器名称和地址。
Name 最终解析到的规范名称。
Aliases 查询名称是别名,即 CNAME。
Addresses 返回的 IPv4 或 IPv6 地址。
Non-authoritative answer 答案来自递归 DNS 的查询或缓存,而不是直接由权威 DNS 服务器返回;通常不是错误。
DNS request timed out DNS 服务器在等待时间内没有返回有效答复。它说明查询链路超时,但不能仅凭这一行断定是路由器、上游 DNS 还是过滤策略。

3. 指定公共 DNS 服务器查询

复制代码
nslookup www.flextv.cc 8.8.8.8
nslookup www.flextv.cc 1.1.1.1

这两条命令中的第二个参数指定"把问题交给哪台 DNS 服务器回答":

  • 8.8.8.8 是 Google Public DNS;
  • 1.1.1.1 是 Cloudflare 公共 DNS。

指定服务器后,nslookup 不再使用系统默认的 192.168.8.1。两台独立公共 DNS 都能返回结果,可以降低"单个公共 DNS 恰好缓存了特殊结果"的可能性。

这些命令只改变本次查询的目标服务器,不会修改 Windows 或 macOS 的永久 DNS 配置。

4. 使用 curl --resolve 临时绕过 DNS

Windows PowerShell 写法:

css 复制代码
curl.exe -I -sS --connect-timeout 10 --max-time 20 `
  --resolve www.flextv.cc:443:43.109.161.39 `
  https://www.flextv.cc/

macOS/Linux 写法:

css 复制代码
curl -I -sS --connect-timeout 10 --max-time 20 --resolve www.flextv.cc:443:43.109.161.39 https://www.flextv.cc/

新增部分的含义如下:

组成部分 含义
PowerShell 行尾的反引号 ````` PowerShell 的续行符,表示下一行仍属于同一条命令。反引号后不要再放空格。也可以把整条命令写在一行。
--resolve 为单次 curl 请求提供临时的"域名:端口:IP"映射,不修改系统 DNS 和 hosts 文件。
www.flextv.cc 保留真实请求域名,用于 HTTP Host、TLS SNI 和证书校验。
443 此临时映射适用的目标端口;443 是 HTTPS 默认端口。
43.109.161.39 本次公共 DNS 返回的一个 CDN 边缘 IP,只是当时的测试样本。
最后的 HTTPS URL curl 仍按这个 URL 发起请求并校验证书,而不是直接访问 https://IP/。

如果该命令返回 HTTP 200,说明指定节点上的 DNS 后续链路------TCP、TLS、HTTP------能够工作。它不能证明所有地区的每个 CDN 节点都正常,但足以说明"默认 DNS 失败"是本次客户端故障的重要原因。

5. 查看 Windows 网络接口的 DNS 配置

完整命令:

sql 复制代码
Get-DnsClientServerAddress -AddressFamily IPv4 |
  Where-Object { $_.ServerAddresses.Count -gt 0 } |
  Format-Table -AutoSize InterfaceAlias,InterfaceIndex,ServerAddresses

这是一条 PowerShell 管道命令,应从左向右理解:

| 组成部分 | 含义 |
|------------------------------|---------------------------------------|---------------------------------|
| Get-DnsClientServerAddress | 读取本机各网络接口的 DNS 客户端配置,不会修改配置。 |
| -AddressFamily IPv4 | 只显示 IPv4 DNS 地址,避免 IPv6 结果干扰本次观察。 |
| ` | ` | PowerShell 管道,把左侧产生的对象传给右侧继续处理。 |
| Where-Object { ... } | 按花括号中的条件过滤对象。 |
| $_ | 当前正在经过管道的那一个网络接口对象。 |
| $_.ServerAddresses | 读取当前接口的 DNS 服务器地址集合。 |
| .Count | 取得该集合中的地址数量。 |
| -gt 0 | Greater than 0,即只保留至少配置了一个 DNS 地址的接口。 |
| Format-Table | 把最终对象格式化成表格,方便人阅读。 |
| -AutoSize | 根据内容自动计算控制台列宽。 |
| InterfaceAlias | 网络接口显示名称,例如"以太网"或"Wi-Fi"。 |
| InterfaceIndex | Windows 分配给网络接口的数字索引。 |
| ServerAddresses | 该接口当前使用的 DNS 服务器列表。 |

正文中还使用了简化命令:

sql 复制代码
Get-DnsClientServerAddress -AddressFamily IPv4

它不进行过滤和表格字段选择,会列出所有 IPv4 网络接口,主要用于在修改配置前确认正确的 InterfaceAlias。

6. 在 Windows 中设置 DNS

以"以太网"为例:

javascript 复制代码
Set-DnsClientServerAddress `
  -InterfaceAlias "以太网" `
  -ServerAddresses "1.1.1.1","8.8.8.8"

以 Wi-Fi 为例:

javascript 复制代码
Set-DnsClientServerAddress `
  -InterfaceAlias "Wi-Fi" `
  -ServerAddresses "1.1.1.1","8.8.8.8"
组成部分 含义
Set-DnsClientServerAddress 修改指定网络接口的 DNS 客户端配置。通常需要管理员 PowerShell。
-InterfaceAlias 按接口显示名称选择要修改的网络接口。名称必须和查询结果完全一致。
"以太网" / "Wi-Fi" 示例接口名称;带引号可以安全处理名称中的空格或非 ASCII 字符。
-ServerAddresses 指定要写入的 DNS 服务器地址集合。
"1.1.1.1","8.8.8.8" PowerShell 使用逗号构造两个元素的数组。系统通常优先使用第一个,在需要时尝试第二个。

这是会修改系统配置的命令。如果接口名称写错,命令通常会报找不到接口;如果公共 DNS 在当前网络被限制,修改后可能导致其他域名也无法解析,因此必须保留下面的回滚命令。

7. 清理 Windows DNS 缓存

PowerShell 命令:

css 复制代码
Clear-DnsClientCache

传统命令:

bash 复制代码
ipconfig /flushdns

两条命令都用于清除 Windows DNS 客户端的本地缓存,使后续访问重新查询 DNS。

  • Clear-DnsClientCache 是 PowerShell 的 DNS 客户端命令;
  • ipconfig 是 Windows 网络配置工具;
  • /flushdns 是 ipconfig 的"清空 DNS 缓存"参数。

它们不会修改 DNS 服务器地址,也不会清除浏览器自己的全部缓存。通常执行其中一条即可,正文同时列出是为了兼容不同操作习惯。

8. Windows 回滚为自动 DNS

javascript 复制代码
Set-DnsClientServerAddress `
  -InterfaceAlias "以太网" `
  -ResetServerAddresses
​
Clear-DnsClientCache

-ResetServerAddresses 与 -ServerAddresses 的作用相反:它删除该接口的手动 DNS 设置,让 Windows 重新使用 DHCP 或系统默认方式获得 DNS。第二条命令随后清理旧缓存,避免回滚后继续使用之前的解析结果。

如果实际接口是 Wi-Fi,同样要替换 -InterfaceAlias 的值。

9. 列出 macOS 网络服务

复制代码
networksetup -listallnetworkservices
组成部分 含义
networksetup macOS 自带的网络配置命令行工具。
-listallnetworkservices 列出系统中所有网络服务名称,例如 Wi-Fi、Ethernet。

这是一条只读命令。后续设置 DNS 时使用的是"网络服务名称",所以应先执行它,而不是猜测接口名称。

10. 在 macOS 中设置 DNS

arduino 复制代码
sudo networksetup -setdnsservers "Wi-Fi" 1.1.1.1 8.8.8.8
组成部分 含义
sudo 以管理员权限运行后面的命令,终端可能要求输入当前管理员密码;输入密码时不会显示字符。
networksetup macOS 网络配置工具。
-setdnsservers 为指定网络服务写入 DNS 服务器列表。
"Wi-Fi" 要修改的网络服务名称。使用网线时应替换为实际名称。
1.1.1.1 8.8.8.8 按顺序设置的两个 DNS 地址。Bash 使用空格分隔参数,不使用 PowerShell 的逗号数组写法。

这条命令会修改 Wi-Fi 服务的 DNS 配置,需要使用后面的 Empty 命令回滚。

11. 刷新 macOS DNS 缓存

复制代码
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

第一条命令:

  • dscacheutil 是 macOS 目录服务缓存工具;
  • -flushcache 请求清空相关缓存,其中包括 DNS 解析缓存;
  • sudo 用管理员权限执行。

第二条命令:

  • killall 按进程名称发送信号;
  • -HUP 表示发送 Hang Up 信号,通知服务重新加载;
  • mDNSResponder 是 macOS 负责 DNS/mDNS 解析的重要系统服务。

这里并不是永久"杀掉"DNS 服务。系统会让 mDNSResponder 继续运行或自动恢复,目的是促使缓存和解析状态刷新。两条命令通常没有成功提示,返回终端提示符不代表没有执行。

12. macOS 回滚为自动 DNS

sql 复制代码
sudo networksetup -setdnsservers "Wi-Fi" Empty
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

Empty 是 networksetup 在这里使用的特殊值,表示删除该网络服务的手动 DNS 列表,恢复使用 DHCP 等自动配置。后两条命令负责刷新缓存和解析服务状态。

13. 使用 nslookup 和 dig 做修复后验证

复制代码
nslookup www.flextv.cc
dig www.flextv.cc
  • nslookup www.flextv.cc 使用当前默认 DNS 做简洁查询,适合快速确认是否仍然超时;
  • dig www.flextv.cc 会显示更完整的 DNS 报文信息,包括状态、记录类型、TTL、应答服务器和查询耗时;
  • 两条命令都没有指定 DNS 服务器,所以验证的是修改后的系统默认解析路径。

如果想让 dig 直接查询某台 DNS,可以使用:

css 复制代码
dig @1.1.1.1 www.flextv.cc

其中 @1.1.1.1 表示把查询直接发送给 1.1.1.1。这是补充用法,不会修改系统 DNS。

14. 使用 curl 验证 HTTPS

Windows:

arduino 复制代码
curl.exe -I -sS --connect-timeout 10 --max-time 20 https://www.flextv.cc/

macOS:

arduino 复制代码
curl -I -sS --connect-timeout 10 --max-time 20 https://www.flextv.cc/

参数含义与第 1 小节相同。这里没有 --resolve,所以 curl 会使用刚刚修改后的系统 DNS。其目的不是重复测试网页内容,而是验证新的 DNS 路径是否能继续完成 TCP、TLS 和 HTTP。

如果返回 301 或 302,表示服务器要求重定向,但 DNS、TCP 和 TLS 通常已经成功。想自动跟随重定向,可以再加入 -L。

15. 使用 GET 请求只输出 HTTP 状态码

Windows:

perl 复制代码
curl.exe -sS -o NUL -w "%{http_code}`n" https://www.flextv.cc/

macOS:

bash 复制代码
curl -sS -o /dev/null -w '%{http_code}\n' https://www.flextv.cc/
组成部分 含义
不使用 -I curl 发送普通 GET 请求,适合不支持 HEAD 的网站。
-o 指定响应正文的输出位置。
NUL Windows 的空设备,写入其中的数据会被丢弃。
/dev/null macOS/Linux 的空设备,作用与 Windows 的 NUL 相同。
-w Write out,在请求结束后按指定格式输出信息。
%{http_code} curl 的输出变量,代表最终 HTTP 状态码。
PowerShell 中的 ```n`` PowerShell 字符串中的换行符。
Bash 单引号中的 \n 由 curl 的 -w 格式解释为换行。

这两条命令仍会执行完整 GET 请求,只是把响应正文丢弃,最后仅显示类似 200、301 或 500 的状态码。

16. 检查 Windows hosts 文件

sql 复制代码
Get-Content C:\Windows\System32\drivers\etc\hosts |
  Select-String -Pattern "flextv"

| 组成部分 | 含义 |
|---------------------|----------------------------------------------|-----------------|
| Get-Content | 读取文本文件内容。这里读取 Windows hosts 文件,不修改文件。 |
| hosts 路径 | Windows 的静态域名映射文件路径。hosts 的优先级通常高于普通 DNS 查询。 |
| ` | ` | 把文件的每一行传给下一条命令。 |
| Select-String | 在文本中搜索匹配内容,作用类似 grep。 |
| -Pattern "flextv" | 只显示包含 flextv 的行;默认按正则表达式匹配。 |

如果没有任何输出,通常表示 hosts 中没有匹配条目。该命令是只读检查,不会删除其他配置。

17. 检查 macOS hosts 文件

bash 复制代码
grep -i "flextv" /etc/hosts
组成部分 含义
grep 在文本文件中搜索匹配行。
-i 忽略大小写,因此 FlexTV、FLEXTV 和 flextv 都能匹配。
"flextv" 要搜索的字符串。
/etc/hosts macOS 的静态域名映射文件。

如果命令没有输出,表示没有找到相关行。它同样不会修改 hosts 文件。

18. 文中提到的 curl -v

异常分支中还提到了:

arduino 复制代码
curl -v https://www.flextv.cc/

-v 是 verbose,输出详细连接过程,包括代理使用情况、DNS 后的目标地址、TCP 连接、TLS 握手、请求头和响应头。它非常适合继续区分 TCP、TLS 和 HTTP 故障,但输出可能包含 Cookie、Authorization 等敏感请求头,复制到公开工单或博客前应先脱敏。

十三、这次排查带来的几个经验

1. "另一个网站能打开"只能证明部分网络能力正常

Google 能打开,可以排除完全断网,但无法直接判断目标网站是 DNS、TCP、TLS 还是应用层故障。

2. 错误信息中的阶段名称非常重要

Resolving timed out 已经明确指出 curl 卡在 DNS 阶段。先读懂错误,再决定下一条命令,通常比盲目清缓存或重装浏览器更有效。

3. 使用不同 DNS 交叉验证

默认 DNS 超时,而 1.1.1.1 和 8.8.8.8 都成功,证据比只测试一个公共 DNS 更可靠。

4. --resolve 是区分 DNS 与 HTTPS 故障的利器

它可以临时绕过 DNS,同时保留正确的 Host、SNI 和证书校验,非常适合验证 CDN 和 HTTPS 服务。

5. 不要长期固定 CDN IP

CDN IP 会随时间、地区、运营商和负载变化。写入 hosts 可能短期有效,但会破坏动态调度,后续还可能再次故障。

总结

面对"网站打不开"时,可以使用下面这套通用思路:

  1. 用 curl 判断失败发生在 DNS、连接、TLS 还是 HTTP;
  2. 用 nslookup 或 dig 对比默认 DNS 与公共 DNS;
  3. 获得可信 IP 后,用 curl --resolve 绕过 DNS 验证 HTTPS;
  4. 根据证据修改电脑或路由器 DNS;
  5. 清理缓存,并从 DNS、HTTPS、浏览器三个层面重新验收;
  6. 保留回滚方案,不把临时 CDN IP 当成永久解决办法。

本次问题最终可以概括为一句话:

默认 DNS 无法正确解析 www.flextv.cc,公共 DNS 可以;绕过 DNS 后网站返回 HTTP 200,因此应修复或替换当前 DNS 解析链路。


说明: 本文中的 DNS 响应和 CDN IP 来自 2026-08-17 的一次实际诊断。DNS/CDN 结果具有时效性,读者应以自己执行命令时的结果为准。

相关推荐
我命由我123456 天前
Mac 操作系统 - 一些使用记录
运维·windows·学习·系统安全·运维开发·mac·学习方法
Linux运维技术栈8 天前
如何避免绕过CDN的攻击?基于 CDN 回源请求头鉴权的防御实操与安全性剖析
nginx·安全·cdn
倔强的小石头_11 天前
把 Mac mini 变成远程 AI 工作台:OpenClaw + 飞书 + cpolar 实战
飞书·mac·openclaw
Lsetea12 天前
CDN换了SSL证书仍显示旧证书?按边缘节点、SNI和缓存逐层排查
https·cdn·ssl证书·openssl·tls
代码中介商12 天前
DNS 完全指南:从域名解析到实战排查
计算机网络·dns
隐擎fox15 天前
跨越传输层防线:深入 TCP/IP 协议栈指纹(p0f)原理与 Python 原始套接字检测实战
python·网络协议·tcp/ip·网络安全·dns
中科三方16 天前
DNS拨测到底在拨测什么?
开发语言·github·php·dns·云拨测
qwsaedca17 天前
在Mac上跑 Kokoro TTS经验总结
rust·mac·tts
隐擎fox17 天前
网络传输中的 DNS 泄漏成因剖析与 Python 自动化检测排查实战
python·网络协议·自动化·dns·ip/tcp
2601_9623815819 天前
Mac和Windows,哪种电脑适合新手学Python|数智码力分享
windows·python·mac·编程环境·学习入门