Skip to content

域名和 DNS

域名

域名(Domain Name)是互联网上用于标识网站的友好名称。域名由一系列字符组成,通常分为多个层级,用圆点分隔。例如,www.example.com 是一个域名,其中 com 是顶级域名(TLD),example 是二级域名,www 是三级域名,www 称为 example.com 的子域名。除了国际化域名,其他域名允许的字符只有 0-9a-z- 字符,不区分大小写。

常见的顶级域名有:

  • .com.org.net.edu.gov
  • 地区域名如 .cn.ai.io(被众多人工智能公司和互联网公司青睐的地区域名)、.co.me
  • 其他域名如 .site.tech.cloud.store.dev.live.xyz.top
  • 部分形式上的二级域名甚至三级域名如 .edu.cn.eu.org
  • 国际化域名(兼容性不佳,很多情况下无法被正确解析)如 .中国(实际上是 xn--fiqs8s)等
  • 公认的等价于顶级域名的域名列表:Public Suffix

域名的主要作用是便于人们记忆和访问网站,因为人们更容易记住字符组成的域名,而不是数字组成的 IP 地址。

  • 域名需要向具有资质的机构申请或购买才能使用。

  • 如果域名解析到的 IP 在中国大陆,需要对域名进行 ICP 备案才能在中国大陆使用。无法使用 CDN 等手段绕过。如果网站有留言、论坛等功能还需要有资质的企业才能备案,很烦。

    因此个人建议如果想利用阿里云等中国国内云厂商提供的有优惠的大陆服务器,可以购买一台香港服务器作为反向代理用来绕过备案。还可以在反向代理服务器上部署 WAF 等安全软件。

DNS

DNS(Domain Name System,域名系统)是将域名转换为 IP 地址的系统。(类比上文提到的 ARP 协议:ARP 将 IP 地址转换为物理地址)每个域名对应一个或多个 IP 地址,DNS 负责将用户输入的域名解析为相应的 IP 地址,从而使用户能够访问网站。通过域名和 DNS,用户可以方便地访问互联网资源,而不需要记住复杂的 IP 地址。

DNS 协议使用 53 端口,使用 UDP 作为传输层协议,延迟大概在几毫秒到几百毫秒之间。DNS 也支持 TCP 协议(也使用 53 端口)。DNS 协议未对报文进行加密,因此审查者和攻击者可能通过 DNS 得知用户在访问什么网站,也可能篡改 DNS 响应。

DNS 的工作原理

  1. 用户输入域名:用户在浏览器中输入一个域名(如 www.example.com)。
  2. DNS 查询:浏览器向本地 DNS 服务器发送查询请求,询问该域名对应的 IP 地址。
  3. 递归查询:如果本地 DNS 服务器没有缓存该域名的 IP 地址,它会向根 DNS 服务器、顶级域名服务器和权威 DNS 服务器逐级查询,直到找到该域名的 IP 地址。
  4. 返回 IP 地址:本地 DNS 服务器将查询到的 IP 地址返回给浏览器。
  5. 访问网站:浏览器使用返回的 IP 地址与目标服务器建立连接,访问网站。

常见的 DNS 记录类型

  • A 记录:将域名映射到 IPv4 地址。
  • AAAA 记录:将域名映射到 IPv6 地址。
  • CNAME 记录:将一个域名别名映射到另一个域名。
  • MX 记录:指定邮件服务器的地址,用于电子邮件的传输。
  • TXT 记录:存储任意文本数据,常用于域名验证和安全配置。

一个域名可以设置多种 DNS 记录,同种记录也可以有多个。每个子域名都需要单独设置 A 记录;同一个域名可以有多条 A 记录(但很少这样做)。

在使用 CDN 的情况下,CDN 服务会根据用户的位置将目标网站的域名解析到最近/快的 CDN IP 上。在这种情况下,对于用户来说网站的 A 记录并不是固定的,解析到的 IP 是 CDN 的 IP;对于网站的所有者来说,其在 CDN 管理界面设置的 A 记录是其网站服务器的 IP,但是由于 CDN 的保护,这个真正的 IP 不会被用户看见。CDN 将在 web 教程中详细介绍。

TIP

查询域名的 DNS 记录

在 Windows 或 Linux 上执行 nslookup <target_domain> 命令,其中 <target_domain> 是要查询的域名。(注:查询的是域名,不是网站,因此不能加 https:// 等协议头)

bash
$ nslookup apache.org
Server:         192.168.1.1
Address:        192.168.1.1#53

Non-authoritative answer:
Name:   apache.org
Address: 151.101.2.132
Name:   apache.org
Address: 2a04:4e42::644

常用的 DNS 服务

  • 8.8.8.8:Google
  • 1.1.1.1:Cloudflare
  • 9.9.9.9:IBM Quad9
  • 223.5.5.5:阿里云
  • 默认的 DNS 服务器是由运营商提供的,速度较快

8.8.8.8 等 DNS 服务在中国可以正常使用,不过速度相对于运营商 DNS 较慢。

DNS 污染

中国境内的 DNS 服务器的解析记录里有很多人为的错误,这被称为 DNS 污染。

  • 早期运营商会将一些正常域名的 DNS 设置为跳转到广告域名
  • 审查者可以通过 DNS 获悉用户在访问什么网站。
  • 在中国大陆被封禁的网站(如 google.comgithub.com)的 DNS 记录也被解析到如 0.0.0.0 等错误的 IP 上(DNS 污染只是封禁的三种手段之一)。即使用户使用 8.8.8.8 等正常的 DNS 服务器,运营商也会在用户查询被封禁网站时抢答。由于 DNS 是未加密的,最终用户得到的 IP 就是被抢答的错误的 IP。

可以使用 DoH 等技术防止 DNS 污染。

DoH

DNS over HTTPS(DoH)是一种通过 HTTPS 协议加密 DNS 查询的技术。如上文 TLS 一节所述,除了目标网站没有任何其他人能解密或篡改 HTTPS 流量。DoH 可以防止 DNS 查询被窃听和篡改,提高用户隐私和安全性。类似的加密 DNS 技术还有 DoT(DNS over TLS)、DNSCrypt,安卓系统可以设置 DoT。DoH 是最常用的加密 DNS 技术,被大部分现代浏览器支持。(换句话说,如果你的浏览器不支持,那就说明它太菜了,该换了。)

常用的 DoH 服务

国外

  • Cloudflarehttps://cloudflare-dns.com/dns-query(已无法在中国使用)或 https://1.1.1.1/dns-query
  • IBM Quad9https://dns.quad9.net/dns-query(已无法在中国使用)或 https://9.9.9.9/dns-query
  • EasyMoshttps://doh.apad.pro/dns-query(拦截广告)
  • Googlehttps://dns.google/dns-queryhttps://8.8.8.8/dns-query(均已无法在中国使用)

中国

  • 阿里https://dns.alidns.com/dns-queryhttps://223.5.5.5/dns-query
  • 微步 OneDNSdoh-pure.onedns.net/dns-query(拦截广告)
  • 腾讯https://doh.pub/dns-query

目前可以稳定使用的保护隐私 (显然中国国内的 DNS 就被排除在外了) 的 DoH 服务有:Cloudflare(https://1.1.1.1/dns-query)、Quad9(https://9.9.9.9/dns-query)、EasyMos(https://doh.apad.pro/dns-query),其余的 DoH 服务已陆续被干扰或屏蔽。由于 ECH 等技术的发展,屏蔽 DoH 服务对于审查者屏蔽网站越发重要。我已经自建了 DoH 服务并做了伪装,将在 Cloudflare、Quad9 被全面屏蔽时公布。

在 Chrome 浏览器上配置 DoH^0

  1. 点击右上角的菜单(三个点)> 设置
  2. 选择隐私和安全 > 安全
  3. 向下滚动到高级部分,启用使用安全 DNS
  4. 选择选择 DNS 提供商选项,并在下拉菜单中选择添加自定义 DNS 提供商(菜单中已有的 DoH 服务已在中国被屏蔽),输入自定义 DoH 服务的 URL,例如 https://9.9.9.9/dns-query

Chrome 使用 Chromium 浏览器内核。其他使用 Chromium 内核的浏览器(如 Microsoft Edge,Brave Browser 等)的 DoH 的设置都与 Chrome 类似。

在 Firefox 浏览器上配置 DoH

  1. 选择菜单 > 设置
  2. 隐私和安全菜单中,向下滚动到启用安全 DNS 部分。
  3. 选择增强保护最大保护
  4. 选择提供商下拉菜单中添加自定义 DoH 服务的 URL。

hosts 文件

hosts 文件是一个用于将主机名映射到 IP 地址的简单文本文件。它在操作系统中充当本地 DNS 解析器,优先于网络上的 DNS 服务器进行域名解析。

hosts 文件的位置

  • WindowsC:\Windows\System32\drivers\etc\hosts
  • Linux 和 MacOS/etc/hosts

hosts 文件的格式

hosts 文件的每一行包含一个 IP 地址和一个或多个主机名,使用空格space或制表符Tab分隔。例如:

ini
# 注释
127.0.0.1 localhost
151.101.2.132 apache.org

hosts 文件的用途

  • 本地开发: 在本地开发环境中,将域名映射到本地服务器的 IP 地址,方便测试。

  • 屏蔽网站: 将不想访问的网站域名解析到 0.0.0.0 或者其他错误的 IP,从而阻止访问。例如:

    ini
    # Google 广告跟踪和数据统计
    0.0.0.0 www.googletagmanager.com

    可以写脚本将 Anti-AD 的广告域名列表加入 hosts 文件并全部解析到 0.0.0.0 进行屏蔽。

  • 加速访问: 将常用网站的域名映射到其 IP 地址,减少 DNS 查询时间。比如将正确的 github.com 的域名写入,可以免去 DNS 查询,防止 DNS 污染。

编辑 hosts 文件

hosts 文件一般需要管理员/root 权限才能编辑。

  1. Windows:
    1. 打开记事本或其他文本编辑器,以管理员身份运行。
    2. 打开 C:\Windows\System32\drivers\etc\hosts 文件进行编辑。
  2. Linux 和 MacOS:
  • 使用文本编辑器编辑 /etc/hosts 文件。例如:
    bash
    sudo nano /etc/hosts