电脑网络连接正常,微信、QQ能正常使用,但无法访问网页?DNS问题的解决方案和背后原理。

文章目录

  • [1. 问题背景](#1. 问题背景)
  • [2. 解决方案](#2. 解决方案)
    • [2.1 手动刷新DNS](#2.1 手动刷新DNS)
      • [2.1.1 Windows版本](#2.1.1 Windows版本)
      • [2.1.2 Mac版本](#2.1.2 Mac版本)
    • [2.2 手动设置DNS服务器](#2.2 手动设置DNS服务器)
      • [2.2.1 Windows版](#2.2.1 Windows版)
      • [2.2.2 Mac版](#2.2.2 Mac版)
    • [2.3 其他解决方案](#2.3 其他解决方案)
  • [3. DNS是什么?](#3. DNS是什么?)
    • [3.1 详细解释DNS](#3.1 详细解释DNS)
      • [3.1.1 A distributed, hierarchical database(一个分布式和分层数据库结构)](#3.1.1 A distributed, hierarchical database(一个分布式和分层数据库结构))
      • [3.1.2 Iterated query and Recursive query(迭代查询和递归查询)](#3.1.2 Iterated query and Recursive query(迭代查询和递归查询))
      • [3.1.3 Caching, Updating records(缓存和记录更新)](#3.1.3 Caching, Updating records(缓存和记录更新))
      • [3.1.4 DNS protocol,messages](#3.1.4 DNS protocol,messages)

1. 问题背景

相信大家一定遇到过电脑网络连接正常,微信、QQ能正常使用,但无法访问网页这样的问题。甚至有的时候我们的浏览器可以打开大部分网页,然后部分网页之前能打开现在打不开了。这些都是DNS的问题。那这样的问题该怎么解决呢?DNS又是什么呢?这篇文章将在后面的部分讲述这两块问题。

2. 解决方案

2.1 手动刷新DNS

2.1.1 Windows版本

我们按下键盘上的win和R键打开运行,然后输入cmd后按下回车打开命令行。

或者我们直接打开菜单栏后在输入框里输入命令提示符找到并打开命令提示符。

打开后,我们输入ipconfig /flushdns按下回车后,我们就手动刷新了DNS。

这里也会提示我们刷新成功。

一般来说这么操作这个问题就解决了,如果还没有解决可以参考下一个方案。

2.1.2 Mac版本

我们打开启动台,在上面的搜索中输入terminal就可以找到终端,我们点击以打开命令行。

然后我们输入sudo dscacheutil -flushcache后回车后,系统会要求你输入密码,这时候我们输入是无法看见内容的,我们输入密码后回车即可。

这样就手动刷新了DNS。

一般来说这么操作这个问题就解决了,如果还没有解决可以参考下一个方案。

2.2 手动设置DNS服务器

2.2.1 Windows版

我们打开菜单栏后在输入框里输入设置找到并打开设置。

然后点击网络和Internet,然后选择第二个以太网。

在这里我们能看到DNS服务器是自动寻找的,我们可以点击编辑进行修改。

然后将这里的自动改为手动,然后打开IPv4,输入8.8.8.8(谷歌)和1.1.1.1(Cloudflare)后点击保存。

然后按照方案一刷新一下DNS即可。

下面列举了一些DNS服务器的地址,大家可以优先选择国内的DNS服务器,这里由于谷歌等比较容易记忆,所以以此为例。

国内服务器DNS列表。

提供商 IPv4 地址 IPv6 地址 DoH / DoT 备注
DNSPod(腾讯) 119.29.29.29 119.28.28.28 2402:4e00:: DoH: https://doh.pub/dns-query DoT: dot.pub
阿里 AliDNS 223.5.5.5 223.6.6.6 2400:3200::1 2400:3200:baba::1 DoH: https://dns.alidns.com/dns-query DoT: dns.alidns.com
114DNS 114.114.114.114 114.114.115.115 --- 官网 https://www.114dns.com[^3^]
百度 DNS 180.76.76.76 2400:da00::6666 暂无官方 DoH/DoT
360 安全 DNS 电信/移动:101.226.4.6 / 218.30.118.6 联通:123.125.81.6 / 140.207.198.6 --- DoH: https://doh.360.cn DoT: dot.360.cn
国外服务器DNS列表。
提供商 IPv4 地址 IPv6 地址 DoH / DoT 备注
------------------------ -------------------------------- -------------------------------------------- ------------------------------------------------------------------------------------
Google Public DNS 8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844 DoH: https://dns.google/dns-query DoT: dns.google
Cloudflare DNS 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001 DoH: https://cloudflare-dns.com/dns-query DoT: 1dot1dot1dot1.cloudflare-dns.com
Quad9 9.9.9.9 149.112.112.112 2620:fe::fe 2620:fe::9 DoH: https://dns.quad9.net/dns-query DoT: dns.quad9.net
OpenDNS(思科) 208.67.222.222 208.67.220.220 2620:119:35::35 2620:119:53::53 DoH: https://doh.opendns.com/dns-query[^2^]
OpenDNS FamilyShield 208.67.222.123 208.67.220.123 2620:119:35::123 2620:119:53::123 自动拦截成人内容

但其实我们一般方案一就能解决问题,我们很少会遇到自动寻找的DNS服务器出现问题的情况,如果出了问题我们也可以用这个方案解决。

2.2.2 Mac版

我们打开启动台,找到系统设置。

然后点击Wi-Fi,选择连接的Wi-Fi的详细信息,会打开如下界面。

然后选择DNS后再点击加号然后输入自己想添加的DNS服务器,然后回车以确认,或者点击右下角的好以确认。

然后按照方案一刷新一下DNS即可。

下面列举了一些DNS服务器的地址,大家可以优先选择国内的DNS服务器,这里由于谷歌等比较容易记忆,所以以此为例。

国内服务器DNS列表。

提供商 IPv4 地址 IPv6 地址 DoH / DoT 备注
DNSPod(腾讯) 119.29.29.29 119.28.28.28 2402:4e00:: DoH: https://doh.pub/dns-query DoT: dot.pub
阿里 AliDNS 223.5.5.5 223.6.6.6 2400:3200::1 2400:3200:baba::1 DoH: https://dns.alidns.com/dns-query DoT: dns.alidns.com
114DNS 114.114.114.114 114.114.115.115 --- 官网 https://www.114dns.com[^3^]
百度 DNS 180.76.76.76 2400:da00::6666 暂无官方 DoH/DoT
360 安全 DNS 电信/移动:101.226.4.6 / 218.30.118.6 联通:123.125.81.6 / 140.207.198.6 --- DoH: https://doh.360.cn DoT: dot.360.cn
国外服务器DNS列表。
提供商 IPv4 地址 IPv6 地址 DoH / DoT 备注
------------------------ -------------------------------- -------------------------------------------- ------------------------------------------------------------------------------------
Google Public DNS 8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844 DoH: https://dns.google/dns-query DoT: dns.google
Cloudflare DNS 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001 DoH: https://cloudflare-dns.com/dns-query DoT: 1dot1dot1dot1.cloudflare-dns.com
Quad9 9.9.9.9 149.112.112.112 2620:fe::fe 2620:fe::9 DoH: https://dns.quad9.net/dns-query DoT: dns.quad9.net
OpenDNS(思科) 208.67.222.222 208.67.220.220 2620:119:35::35 2620:119:53::53 DoH: https://doh.opendns.com/dns-query[^2^]
OpenDNS FamilyShield 208.67.222.123 208.67.220.123 2620:119:35::123 2620:119:53::123 自动拦截成人内容

但其实我们一般方案一就能解决问题,我们很少会遇到自动寻找的DNS服务器出现问题的情况,如果出了问题我们也可以用这个方案解决。

2.3 其他解决方案

当时我特别小的时候,电脑还流行装杀毒软件之类的,当时电脑装的是360安全管家,里面有一个网络工具箱,当时每次电脑没网了,用那个检测,就会跟我说是DNS问题,然后就能帮我修复了。

前面的第一种方案相当于是我们使用命令行修复这个问题,而这个方案就相当于是现在有一个软件,它提供了一个图形化的窗口,让用户只需要点击就能完成这个操作,降低了修复的难度,但实际的操作方式其实就和前两种方案是一样的。如果你觉得你的电脑经常会出问题,然后不知道怎么解决,你当然可以选择装一个安全管家之类的软件来帮助你解决问题。但是其实现在时代不断进步,电脑出现问题的几率越来越低,而且我们获得解决方案的途径也越来越方便,如果遇到问题我们可以上网找这样的解决方案,按照每一步操作,或者询问AI得到解决方案都是可以选择的方案。所以我们其实不太需要一个安全管家在我们的电脑中,这也是这篇文章希望能够帮助到大家的地方。

3. DNS是什么?

我们听说过IP地址,IP地址相当于是我们现实生活里的门牌号,它对应的才是我们在网络世界的真实位置。但是IP地址对于我们人来说是难以记忆的,因为他是数字符号组合来的,比如我们访问www.baidu.com百度的网页,其实际的IP地址是119.75.217.109,DNS服务器就负责将我们输入的网站地址如www.baidu.com翻译成IP地址119.75.217.109。DNS的作用就相当于是电话簿,我们可能记不得一些联系人的电话号码,我们将这些存在电话簿中,当我们想给张三打电话的时候,我们选择张三,DNS帮我们翻译成对应的电话号码从而将电话打给张三。

因此这个过程可能有的一个问题就是,张三换了一个号码,所以DNS翻译的号码如果还是以前的号码,那我们就无法打给张三,这就是第一个方案的操作,我们清空现在的DNS结果,让DNS给我们一个新的结果。这样DNS就会帮我们找最新张三的电话号码是多少。

当然也有可能DNS本身就不知道最新的张三的电话号码或者DNS服务器本身出现了问题,那么这就需要我们使用方案2换一个DNS服务器来看看了。

3.1 详细解释DNS

我们平时输入的一般都是www.baidu.com而不是对应的IP地址,因为IP地址难以记忆,而www.baidu.com正是domin name(域名),我们一般记忆的就是domin name(域名)。我们的电脑中有hosts文件(Windows:C:\Windows\System32\drivers\etc\目录下,Unix-like: /etc/ 目录下)记录了IP地址和域名的映射关系。所以当我们输入www.baidu.com后,电脑会在hosts文件中寻找对应的IP地址,从而建立了连接,成功访问了百度。所以这个hosts文件如何更新呢?这就要借助DNS服务器,将对应的域名解析为相应的IP地址。这便是DNS。

DNS是一种应用层协议(学习网络知识后,我们就会知道网络有多个层次),它采用客户端/服务器架构,使用UDP协议并默认端口号为53。

resolve(解析)域名又称name/address translation(名称/地址转换)的两种方式:通过本地的hosts文件或通过与name servers(名称服务器,名称服务器就是DNS服务器)通信。

DNS使用分布式数据库的方式来存储域名和IP地址的映射关系。这些数据库被实现为许多名称服务器的层次结构,这种层次结构使得DNS系统能够高效地进行域名解析,并且具有一定的容错能力和可扩展性。例如当你查询一个域名的对应IP时,一个服务器会告诉你去哪一个服务器,这个服务器可能会告诉你去下一个服务器,再下一个服务器会告诉你具体的IP地址。

DNS服务包括以下功能:

1.Hostname to IP address translation(主机名到IP地址的转换)。这一步使用Address Record(A记录)完成,它是一种在DNS数据库中的数据结构。

2.Host aliasing(主机别名),这一步将一个主机名映射到另一个主机名,从而实现主机名的别名或重定向。这一步包括Canonical names(规范名称),指向实际的主机名。还包括Alias names(别名),主机的替代名称,用于提供更易记的名称。这一步使用cname record(Canonical Name Record)完成,这种数据结构可以让多个域名指向同一个IP地址。

3.Mail server aliasing(邮件服务器别名),用于指定邮件服务器的主机名,允许邮件系统找到接收特定域名邮件的邮件服务器。它使用的数据结构是mx record(Mail Exchange Record)。

4.Load Distribution(负载均衡),DNS可以将请求分配到多个服务器,以实现负载均衡和高可用性。

5.Replicated Web servers(复制的Web服务器),多个IP地址对应一个名称,允许实现多个服务器共享同一个域名,提高网站的可靠性和性能。比如当一个服务器故障时,DNS可以停止解析到那个服务器的IP,将流量转移到其他服务器。前面负载均衡也指出了,DNS服务器会根据当前的网络状况和服务器负载来决定指向哪个IP地址。

3.1.1 A distributed, hierarchical database(一个分布式和分层数据库结构)

那我们现在说DNS的结构。如果DNS是中心化的,那么会有以下几个问题:

1.如果出现single point of failure(单点故障),整个DNS都会受到影响。

2.所有的DNS都集中在一个地方,那么这个地方将承受巨大的流量压力。

3.网络传输和距离有关,所以如果集中在一个地方,必定会存在因为距离而导致网络延迟高而解析速度慢的问题出现。

4.在维护上集中管理的维护成本也跟分散式的相比更高。

因此DNS是a distributed, hierarchical database(一个分布式和分层数据库结构)

首先Root DNS servers(根DNS服务器)是DNS层次结构的最顶层,它们知道所有顶级域名(如.com、.org、.edu)的权威DNS服务器的位置。

下面是一些顶级域名的权威DNS服务器,例如com DNS servers(.com域名的DNS服务器)。它们下面还管理各自顶级域名下的二级域名,例如(yahoo.com、amazon.com等)。

再下一层便是各个域名的权威DNS服务器,它们存储了各自域名下的详细DNS记录,包括A记录、CNAME记录等。

所以当一个客户端向获取www.amazon.com的IP地址时,客户端首先向根DNS服务器发送查询,请求找到负责.com域名的DNS服务器,再接着向负责.com域名的DNS服务器发送查询,请求找到负责amazon.com域名的DNS服务器,最后向amazon.com的DNS服务器发送查询,以获取www.amazon.com的具体IP地址。

回到现实应用中,当本地DNS服务器无法解析某个域名时,它会联系根域名服务器以获取帮助。如果根域名服务器不知道某个域名的映射,它会联系相应的权威名称服务器。根域名服务器获取域名到IP地址的映射。根域名服务器将获取到的映射信息返回给本地DNS服务器。

下图展示了全球13个逻辑上的根域名服务器,每个根域名服务器都有多个副本。

TLD servers(Top-level domain servers,顶级域名服务器)负责管理顶级域名,比如com,org,net,edu等。它还负责管理各个国家代码顶级域名,比如cn,uk,fr,ca,jp等。

Authoritative DNS servers(权威DNS服务器)是指组织自身维护的DNS服务器,用于提供对该组织命名主机的权威主机名到IP地址的映射。这些服务器可以由组织自己或者服务提供商进行维护管理。

Local DNS name server(本地DNS名称服务器)是指属于特定网络(如住宅ISP、公司、大学等)的DNS服务器,它并不严格属于DNS层次结构中的任何一级。每个ISP都会拥有自己的本地DNS名称服务器,有时也被称为"默认名称服务器"。当主机发起DNS查询时,查询会发送到它所在网络的本地DNS服务器。本地DNS服务器通常会维护一个本地缓存,其中包含最近的主机名到IP地址的映射,以便加快解析速度。然而,这些缓存中的信息可能已经过时。本地DNS服务器还充当代理,它会将查询转发到DNS层次结构中的其他级别。

3.1.2 Iterated query and Recursive query(迭代查询和递归查询)

Iterated query(迭代查询):

当一个DNS服务器不知道所请求的域名时,它会告诉请求者去询问另一个DNS服务器。

如图所示,请求主机向本地DNS服务器发送查询请求。如果本地DNS服务器不知道答案,它会向根DNS服务器发送查询。根DNS服务器告诉本地DNS服务器去询问顶级域DNS服务器。本地DNS服务器向TLD DNS服务器发送查询。TLD DNS服务器告诉本地DNS服务器去询问权威DNS服务器。本地DNS服务器向权威DNS服务器发送查询。权威DNS服务器返回域名对应的IP地址。本地DNS服务器将IP地址返回给请求主机。

Recursive query(递归查询)

被查询的DNS服务器(如本地DNS服务器)会代表客户端(如用户的电脑)进行后续的查询,直到找到所需的记录或确定记录不存在。

这意味着名称解析的负担被放在了被联系的DNS服务器上。服务器需要处理查询并可能进行额外的查询,这可能导致DNS层次结构的上层(如根DNS服务器和TLD DNS服务器)承受较重的负载,因为它们需要处理大量的查询请求。

如图所示,请求主机向本地DNS服务器发送查询请求。如果本地DNS服务器不知道答案,它会向根DNS服务器发送查询。根DNS服务器如果不知道答案,根DNS服务器会向TLD DNS服务器发送查询。如果TLD DNS服务器不知道答案,TLD DNS服务器会向权威DNS服务器发送查询。最后权威DNS服务器将IP地址返回给TLD DNS服务器,TLD DNS服务器将这个IP地址返回给根DNS服务器,根DNS服务器将这个IP地址返回给本地DNS服务器,本地服务器再返回给请求主机。

dig +trace是一个命令行工具,用于显示从客户端到权威DNS服务器的完整递归查询过程。

3.1.3 Caching, Updating records(缓存和记录更新)

一旦任何一个DNS名称服务器学习到了域名到IP地址的映射关系,它会将这些映射信息缓存起来。缓存中的条目会在一定时间后(TTL,time to live,生存时间)过期并消失。通常,顶级域名服务器的信息会被缓存在本地名称服务器中,这样就不需要经常访问根名称服务器。

然而,由于缓存中的条目可能会过时,如果某个主机的IP地址发生了变化,这个变化可能需要等到所有TTL过期后才能在整个互联网中得到更新。而我们的方案一就是手动清理所有的缓存,从而更新这里的记录。

为了解决这个问题,IETF提出了更新/通知机制的标准,其中的一个标准便是RFC 2136。

DNS是一个分布式数据库,用于存储资源记录(RR, resource records)。资源记录的格式通常为(name, value, type, ttl)。

这里如果type=A,便是A记录,代表主机地址记录,name是主机名,value是对应的IP地址。

如果type = CNAME,便是CNAME记录,指向"规范"(真实)名称,name是别名,value是规范名称,也就是真实的目标主机名。

如果type = NS,代表域名服务器记录,name是域名(例如foo.com),value是该域名的权威名称服务器的主机名。

如果type=MX,便是MX记录,代表邮件交换记录,value是与name相关联的邮件服务器的名称。

我们可以使用nslookup命令去查询一个域名对应的IP地址,如下图所示。

当我们使用不同的网络我们获得的DNS解析的IP地址可能不同,如下图所示。前两次都是使用学校的两个不同的网络查询的,它们返回的是路由器的默认网关IP地址,因为它们都是内网。而第三个不是内网,返回的IP地址就不会是前面一样的私有IP了。

我们还可以使用whois命令去获取域名的注册信息。如下图所示。

3.1.4 DNS protocol,messages

DNS的查询和回复信息共享相同的信息格式。如下图所示。

第一行是消息头,包含关键的元数据,用于标识和处理DNS消息。信息头包含identification(标识)和flags(标志)。Identification(标识)是一个16位的数字,用于唯一标识一个查询。当服务器回复查询时,会使用相同的标识符,以便客户端能够将回复与原始查询匹配。一个16位的数字,用于唯一标识一个查询。当服务器回复查询时,会使用相同的标识符,以便客户端能够将回复与原始查询匹配。包含多个标志位,用于控制消息的行为和状态。其中包括:

1.指示信息是查询还是回复。

2.客户端希望服务器执行递归查询。

3.服务器能够执行递归查询。

4.回复是否来自权威DNS服务器。

questions(问题数量),表示消息中包含的查询问题数量。

answer RRs(回答资源记录数量),表示消息中包含的答案资源记录的数量。

authority RRs(权威资源记录数量),表示消息中包含的权威资源记录的数量,这些记录指出了哪个服务器是某个域名的权威服务器。

additional RRs(附加资源记录数量),表示消息中包含的附加资源记录的数量,这些记录提供了额外的信息,如DNS服务器的地址。

questions,包含客户端提出的查询问题,可以有一个或多个。查询中包含域名和查询类型的字段,指定了要查询的域名和查询的资源类型(如A记录、MX记录等)。

answers,包含包含对查询问题的响应,可以有一个或多个资源记录,提供了查询域名的解析结果。

authority,提供权威信息,指出哪个DNS服务器是某个域名的权威服务器。

additional info,提供额外的DNS记录,可能包括额外的NS记录或其他类型的记录。

下图展示了wireshark抓包抓取的DNS查询数据包的具体情况。

第一行的Transaction ID(事务ID)等同于Identification(标识)。

下一行Flags字段中的每一位都代表一个特定的标志。细节如下:

1.QR(Query/Response):这是最高位,如果是0,则消息是查询(Query);如果是1,则消息是响应(Response)。在0x0100中,这个位是0,表示这是一个查询。

2.Opcode:接下来的4位用于指定操作码。在这里,0000表示这是一个标准查询(Standard query),意味着一个普通的请求,用于获取资源记录。

3.AA (Authoritative Answer):如果设置(1),表示响应来自权威DNS服务器。在这里,这个位是0,表示这不是权威答案。

4.TC (Truncated):如果设置(1),表示消息被截断,可能是因为响应数据太大而无法在单个UDP数据包中发送。。在这里,这个位是0,表示消息没有被截断。

5.RD (Recursion Desired):如果设置(1),表示客户端希望服务器执行递归查询。。在这里,这个位是1,表示客户端希望进行递归查询。

6.RA (Recursion Available):如果设置(1),表示服务器支持递归查询。。在这里,这个位是0,表示服务器不支持递归查询。

7.Z:保留位,通常不使用。

8.AD (Authenticated Data):如果设置(1),表示响应是经过验证的。在这里,这个位是0,表示数据未经过验证。

9.CD (Checking Disabled):如果设置(1),表示客户端不希望进行DNSSEC验证。在这里,这个位是0,表示没有禁用检查。

下图展示了与上面DNS请求相对应的回复。

那我现在如何向DNS插入记录呢?假设现在有一个新的网站域名 "feimax.com"

首先,你需要在DNS注册商(例如net.cn)处注册feimax.com这个域名。通常情况下,你不需要自己设置NS记录,因为注册商会为你设置好。然后,你需要向DNS中插入A记录,将feimax.com指向你的主机的IP地址,这样当有人访问feimax.com时,DNS就能够将其解析为相应的IP地址。接着,你还需要插入MX记录,用于指定与feimax.com相关联的邮件服务器的名称。