DNS从入门到入土

Insider Lv1

DNS是什么

DNS是域名系统(Domain Name System)的缩写

DNS的作用是什么

DNS将人类可读可记的域名地址转换成网络中使用的IP地址

什么是域名地址

我们平时所熟知网址分解例如https://www.google.com/xxx

  • https:// 协议头
  • /xxx 服务器相对路径
  • www.google.com 这就是上文所说的域名地址,这部分又分为三段,www为子域名,google为主域名,com为顶级域名

DNS查询的流程是怎样的

DNS(Domain Name System)查询的完整流程可以分为以下几个步骤:

  1. 用户请求
    当用户在浏览器中输入一个网址(例如 blog.katetseng.icu)时,操作系统会首先检查自己的本地DNS缓存,查看是否有该域名的IP地址记录。
  2. 本地DNS缓存
    如果本地缓存中没有找到对应的IP地址,操作系统会向本地DNS服务器发送一个DNS查询请求。
  3. 本地DNS服务器
    本地DNS服务器通常由用户的互联网服务提供商(ISP)提供。这台服务器会首先检查自己的缓存,看是否有所请求的域名的IP地址。
  4. 递归查询
    如果本地DNS服务器没有缓存该域名的IP地址,它会开始一个递归查询过程。这意味着本地DNS服务器会负责向其他DNS服务器查询,直到找到答案。
  5. 根域名服务器
    本地DNS服务器首先会向根域名服务器查询。根服务器不直接提供域名的IP地址,而是告诉本地DNS服务器哪个顶级域名服务器(例如.com、.net等)可能知道答案。这是根域名服务器就会告诉我的DNS查询去找icu顶级域名服务器
  6. 顶级域名服务器
    本地DNS服务器接着向顶级域名服务器查询。顶级域名服务器会告诉本地DNS服务器哪个权威域名服务器负责该域名。这时顶级域名服务器就会查询这个主域名是谁的,并告诉我的DNS查询说去找他,此处我的DNS查询就去到阿里云域名服务器
  7. 权威域名服务器
    最后,本地DNS服务器向权威域名服务器查询。权威服务器存储着特定域名的IP地址信息,它会返回该域名的IP地址给本地DNS服务器。例如我购买了阿里云的域名katetseng.icu此时我访问我的blog.katetseng.icu时权威域名服务器就是阿里云域名服务器,他会查询域名对应的ip地址并返回
  8. 返回结果
    本地DNS服务器收到IP地址后,会将这个信息缓存起来,并将结果返回给用户的操作系统。操作系统同样会缓存这个结果,然后将IP地址传递给浏览器。
  9. 浏览器访问
    浏览器使用收到的IP地址与目标服务器建立连接,开始加载网页内容。

这部分内容隐藏了很多细节🤏,实际过程复杂很多,例如dns查询缓存时,其实是逐级不断向上传递查询,直到上游服务器能够查询到dns解析结果为止

例如 www.google.com 浏览器首先查询浏览器本地缓存,如果没有则进行dns查询,然后查询操作系统的dns缓存,如何还是没有,进一步进行路由器dns缓存查询,如此不断向上游服务器查询域名解析结果

以上就是DNS查询的大致流程,解析让我们来了解一些细节

DNS查询传输协议

UDP

UDP(User Data Protocol),全称用户数据报协议,是一种无连接的网络传输协议,提供了数据包的不可靠传输。在网络通信过程中,UDP不需要建立和维护连接,也不需要确认接收方是否已经正确接收数据包。所以UDP快,不安全(因为传输内容是明文的),不能保证数据完整性(也就是不可靠

TCP

TCP(传输控制协议)主要功能是提供了一种可靠的、面向连接的、端到端的通讯方式。TCP确保了在网络中数据包的准确无误的传输,即使在网络环境不稳定的情况下也能够保证数据的完整性。与UDP相比,TCP可靠了,但是依旧不安全,同时速度慢(相对于UDP)因为要可靠(三次握手和四次挥手)建立连接的过程就会消耗时间

TLS(DoT=DNS over TLS)

DNS-over-TLS

TLS,全称为传输层安全(Transport Layer Security),是一种常用的网络安全协议。它主要是用于在两个通信系统之间提供保密性和数据完整性。这是通过使用加密来保护在互联网上发送的数据来实现的,这样就可以防止第三方获取和理解这些数据。总的来说,TLS就是为TCP协议提供安全服务,它的实现不在传输层中,也不在应用层中,而是在两者之间,所以它和TCP是独立的,不过不严谨的说在DNS设置中的“TLS”=TLS+TCP,也就是安全的TCP,它可靠,安全,但速度慢(相对于UDP/TCP),一般端口号设置为853

HTTPS(DoH=DNS over HTTPS)

DNS-over-HTTPS

HTTPS是HTTP(Hyper Text Transfer Protocol)的安全版本,它通过SSL/TLS协议确保数据在客户端和服务器之间的安全传输,与上面类似,HTTPS四舍五入不严谨的说就是套了一层SSL(仅HTTP/1.1)/TLS的HTTP,HTTP又是基于TCP实现的,只是在TCP传输数据中增加HTTP请求的内容(请求头/请求体),同样可靠,安全,但速度慢(相对于UDP/TCP),一般端口号设置为443,也就是和HTTPS统一,这意味着它更容易集成到HTTPS应用服务中

QUIC

DNS-over-QUIC

基于UDP协议,但是安全且可靠,他还有很多特性,例如多路复用,快速建立连接,改进版拥塞控制,但DNS查询中无需关系这些细节,本文暂时不讲解细节部分了,HTTP/3 协议使用的就是 QUIC

这个来自维基百科的图片很好的诠释了,各个协议之间的关系,以及不同

https://s2.loli.net/2024/06/26/O12Y8wFCQMuDg7x.png

了解到这里你应该对DNS服务的传输协议有了大致了解,也明白速度上UDP最快,安全性上基于TLS协议才能保证安全,但是二者都兼得QUIC显然才是综合版本答案

协议选择

为了与目标域名的服务器更快建立连接,我们需要快速获取到它的IP地址,所以我们需要更快速的协议UDP

但是!!!

不安全

意味着你的DNS查询会在传输过程中被监听,甚至是篡改,这就会导致你的隐私泄露,别人能够通过监听你的DNS查询知道你访问的网站,甚至是篡改你要访问的网站,比如你本来访问www.google.com 但是传输过程中被别人改成了coolapk.com,本来访问的谷歌却变成酷安的页面,或者是在结果返回过程中解析到的IP地址被篡改,本来与要google的服务器建立连接但是却得到酷安服务器的IP地址,从而连接了酷安的服务器…..

不可靠

意味着你的数据可能没有发送到DNS解析服务器中,或者说DNS回应时没有完整到达客户端,这就导致没有正确IP地址,客户端无法建立连接,对应到日常使用中访问网站失败(DNS没有响应)

这听起来就很糟糕,但是快….

选择原则

当你对上面哪个问题很介意,你就应该选择能够满足你需求的协议,只能说各有优劣之处,没有最好的答案

我需要快,那么就选择UDP

我需要保证能够建立连接(在服务端和客户端都没问题的前提下),那么选择TCP

在这基础上我还想要保证数据安全,那么你应该选择TLS/HTTPS

什么?你全都要,QUIC!

公共DNS 服务器选择

公共DNS服务器有那么多,我该怎么选择?

已知DNS服务商

  1. 第一步ping通,先对DNS服务器的ip地址进行ping,大致判断查询传输所需的最小时间(可跳过)

    1
    2
    ping -n 5 114.114.114.114 # windows
    ping -c 5 114.114.114.114 # Linux Or Macos
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    (base) PS C:\Users\KateT> sudo ping -n 5 114.114.114.114

    正在 Ping 114.114.114.114 具有 32 字节的数据:
    来自 114.114.114.114 的回复: 字节=32 时间=13ms TTL=90
    来自 114.114.114.114 的回复: 字节=32 时间=13ms TTL=91
    来自 114.114.114.114 的回复: 字节=32 时间=13ms TTL=83
    来自 114.114.114.114 的回复: 字节=32 时间=13ms TTL=67
    来自 114.114.114.114 的回复: 字节=32 时间=13ms TTL=76

    114.114.114.114 的 Ping 统计信息:
    数据包: 已发送 = 5,已接收 = 5,丢失 = 0 (0% 丢失),
    往返行程的估计时间(以毫秒为单位):
    最短 = 13ms,最长 = 13ms,平均 = 13ms

    此时说明我的设备到114公共DNS服务器传输时间平均为13ms

    多ping几个公共DNS服务器ip ,能ping通就选上,这一步仅仅是判断DNS是否正常,也可以直接选取国内常见DNS服务器地址

  2. 第二步,测试实际DNS查询所需时间

    DNS Benchmark 一个测试DNS性能的软件

    打开软件后→Namesevers→Add/Remove → Remove Defalut Nameservers→add .INI file Nameservers →选择大陆推荐DNS服务器IP地址.ini
    https://s2.loli.net/2024/06/26/WPyVgEbKX95OaqG.gif

    “大陆推荐DNS服务器IP地址.ini” 自行保存到本地

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    114.114.114.114     114 DNS
    114.114.115.115 114 DNS
    114.115.192.11 华为云 DNS
    116.205.5.1 华为云 DNS
    116.205.5.30 华为云 DNS
    139.9.23.90 华为云 DNS
    139.159.208.206 华为云 DNS
    122.112.208.1 华为云 DNS
    122.112.208.175 华为云 DNS
    180.76.76.76 百度云 DNS
    119.28.28.28 DNSPod DNS
    119.29.29.29 DNSPod DNS
    182.254.116.116 DNSPod DNS
    182.254.118.118 DNSPod DNS
    183.60.82.98 腾讯云 DNS
    183.60.83.19 腾讯云 DNS
    223.5.5.5 阿里云 DNS
    223.6.6.6 阿里云 DNS

    等待加载完,点击benmark

    等待执行完毕,选取最上面几个DNS服务器IP即可

此时我们就完成了DNS服务器选择的第一步,公共DNS初步筛选

现在有人要问,为什么是初步呢?

  1. 我们测试时仅采用UDP的方式,HTTPS/TLS/QUIC请自行搜索查询
  2. 我们要理解DNS解析速度与网站访问速度

DNS解析速度与网站访问速度

DNS解析速度≠你访问网站的速度,我们进行网络通信的是目标服务器,而不是DNS服务器,DNS解析快只能代表DNS能够更快速给出你建立目标地址,但是这个地址的质量如何并不能通过上述手段来衡量

地址的质量是什么,就是目标服务器是否满载,你链接目标服务器的速度是否快,目标服务器是否正确,这些DNS解析服务器通常不能帮你测试,他只是给出域名对应的ip地址

这也就是为什么在上一步我们为什么不直接选择最快速的DNS服务器原因,DNS解析快,却可能访问网站速度变慢,捡了芝麻丢了西瓜

如果你不怎么想折腾,那么到此你可以随便选两个DNS服务器使用,日常使用中体验它的地址解析质量,如果你是极致追求的人,请继续

常规设置DNS方法见: https://www.alidns.com/knowledge?type=SETTING_DOCS#user

DNS”代理”工具

我觉得描述成“代理”一词才能很好的解释这些工具,本文不涉及部署教程,请查阅官方文档

mosdns

项目地址:

https://irine-sistiana.gitbook.io/mosdns-wiki

官方描述:

mosdns 是一个插件化的 DNS 转发器。用户可以按需定制自己的 DNS 处理逻辑

我觉得应该描述为DNS代理器更加符合,MosDns的作用就是对DNS查询做一些前置或后置的处理

adguardhome

项目地址:

https://github.com/AdguardTeam/AdGuardHome

官方描述:

AdGuard Home is a network-wide software for blocking ads and tracking. After you set it up, it’ll cover ALL your home devices, and you don’t need any client-side software for that.

It operates as a DNS server that re-routes tracking domains to a “black hole”, thus preventing your devices from connecting to those servers.

像一个DNS服务器一样控制域名查询,将不想访问的域名(广告)吸入黑洞(返回特殊结果),ADGuard本身定位是广告拦截器,ADGuardHome是自建维护的DNS服务器来实现过滤广告的功能

smartdns

项目地址:

https://pymumu.github.io/smartdns/

官方描述:

SmartDNS 是一个运行在本地的 DNS 服务器,它接受来自本地客户端的 DNS 查询请求,然后从多个上游 DNS 服务器获取 DNS 查询结果,并将访问速度最快的结果返回给客户端,以此提高网络访问速度。 SmartDNS 同时支持指定特定域名 IP 地址,并高性匹配,可达到过滤广告的效果; 支持DOT(DNS over TLS)和DOH(DNS over HTTPS),更好的保护隐私。
与 DNSmasq 的 all-servers 不同,SmartDNS 返回的是访问速度最快的解析结果

核心功能:向多个DNS服务器同时获取DNS查询结果并通过测速比较获取的IP质量返回的是访问速度最快的解析结果

不难看出三者定位其实不太一样,但是实现逻辑是一样的,在DNS查询发生前,发生后进行一些定制化的处理,这也是为什么我认为是DNS”代理”工具的原因

也就是说我们应当先将请求的DNS查询发送到他们那里处理(mosdns,adguardhome),或者直接将DNS查询交给他们管理(smartdns)

明白了三款工具的作用和核心思想,配置起来就很轻松了

其中AdGuardHome有完善的WebUI界面,配置起来相对简单

ADGuardHome配置

smartdns(挖坑)

mosdns(挖坑)

Q&A:

DOH3的加密是否是目前最好的,有时候DOQ会丢包,而DOH3不会

看完上面的文章,不难发现,其实DOH3是DOQ+HTTP头,而QUIC基于UDP并且包含TLS1.3协议,相比于HTTP/2 使用的TLS1.2必然是更加安全的,安全性应当从多方面考虑,不仅仅是数据加密层TLS,传输过程中也会有安全隐患,也就是”不可靠”,容易被受网络波动影响,导致数据不能正常发送到对应客户端,所以丢包也是存在可能性的,毕竟是基于UDP协议

  • Title: DNS从入门到入土
  • Author: Insider
  • Created at : 2024-06-26 12:23:50
  • Updated at : 2024-06-27 06:45:03
  • Link: https://blog.katetseng.icu/2024/06/26/DNS从入门到入土/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments