- 面试程序员经常会问的一道面试题: 当在浏览器输入一个网址回车后,后面发生了什么. 例如下图 输入了网址foobar.com后, 首先从DNS服务器查询 foobar.com对应的IP地址 156.x.x.x. 浏览器得到IP后继续访问156.x.x.x 这个服务器地址返回网页. 用户就可以正常浏览网页了.
- 早些年网页采用http方式传输, 网页没有加密. 后来基于TLS加密技术的https方式传送,网页就被加密无法看到传送的内容了. 如下图
- 网页传输http未加密与https加密对比
- 通过DNS解析后得到IP后虽然网页传输是加密的https,其他人无法知道浏览的内容是什么,但第一步查询DNS时是未加密的, GFW防火墙就可以获取到域名信息并污染DNS,返回一个错误的IP地址,这样就无法正常打开网页了. 所以DNS也要加密, DOT(DNS over TLS) 与 DOH(DNS over HTTPS)就诞生了. 开启DOT或DOH后就如下图, 查询DNS后返回的IP地址信息也是加密的. GFW就无法截取信息并污染DNS了. 如何开启DOT和DOH 请看Chrome开启方法 和 Firefox开启方法
-
根据上图仔细看还会发现,第一步输入网址查询DNS的时候还是未加密的, 这样网址的名称还会被其他人获取, 为了解决这个问题又提出了ESNI(Encrypted server name indication), 这样从所有链路都加密了. 由于从第一步输入网址信息就是加密的, 那么DNS服务器如何知道输入的什么网址呢, 所以该技术需要浏览器和DNS提供商配合, 目前新版firefox和CDN服务商Cloudflare已支持开启ESNI. 如何开启Firefox的ESNI方法.
-
更多DOH DOT ESNI 资料请看什么是加密的 SNI. 使用 ESNI、DoH 和 DoT. 搭建全协议DNS服务器
- 需要先下载新版本Chrome 100 下载地址1. 下载地址2
- 打开 Chrome, 在网址栏输入 chrome://settings/security 回车后, 进入"安全"设置页面. 或者点击Chrome地址栏右边菜单栏的三个点 打开菜单,然后点击 "设置" , 然后点击左边菜单的 "隐私设置和安全性", 然后在右边找到的 "安全"点击进入"安全"设置页面。
- 在打开的 "安全" 设置页面中, 选中 "使用安全 DNS" 后面的滑块, 再选择下拉框中的Cloudflare 1.1.1.1 或 Google Public DNS,也可以选择下拉框里选择自定义, 然后在下面文本框中输入自己找到的 DoH 服务器. DNS服务器列表 如何验证是否开启DOT和ESNI.
-
有时候选择Cloudflare 1.1.1.1 或 Google Public DNS 会出现打不开网站的情况, 这是因为GFW防火墙除了会污染DNS, 还会直接屏蔽掉IP, 导致Cloudflare 1.1.1.1 或 Google Public DNS 8.8.8.8 无法访问, 也就无法解析DNS域名. 解决办法就是自己找到其他海外支持DOT或DOH的DNS服务器, 或者自己在海外架设DNS服务器. 可以使用 AdGuardHome. 具体方法请看搭建自己的DNS服务器.
-
使用了国外的DOT或DOH后, 也会发现访问国内网站慢, 或者访问国内网站变成海外版本的问题. 这就需要区分国内和国外网站走不同的DNS进行分流, 具体请看DNS分流
- 在打开的对话框中,在最下面, 选中 "启用基于 HTTPS 的 DNS", 然后在下拉框可以选择Cloudflare 默认值或自定义的DOT服务器 . 如何验证是否开启DOT和ESNI.
- 需要下载最新版的Firefox 下载地址1. 下载地址2
- 在地址栏输入
about:config
, 然后点击 "接受风险并继续", 然后搜索network.security.esni.enabled
,
-
然后选择 "布尔" 类型, 点击右边 + 号, 然后点击右边按钮 将值设为true, 完成. 如何验证是否开启DOT和ESNI.
-
开启 Encrypted Client Hello (ECH) (ESNI的进化版本). 同样在
about:config
搜索条目network.dns.echconfig.enabled
和network.dns.use_https_rr_as_altsvc
,将它们的值设定改为 true 即可。 -
更多问题请查看 在 Firefox 上设置 DoH 和 ESNI/ECH
- Edge 浏览器 [设置DoH加密DNS的方法] (https://www.icoa.cn/a/953.html)
-
使用浏览器打开 https://www.cloudflare.com/zh-cn/ssl/encrypted-sni/ 点击 "Check My Browser" 按钮. 测试之前浏览器设置DNS的服务器请选择Cloudflare的DOH的服务器.
-
查看结果. 目前Chrome 还不支持ESNI,估计很快就会支持.
- 常见问题: Cloudflare 提醒我 ESNI 未启用!可能是你的 DNS over HTTPS 并没有生效,Firefox 还在使用普通的 DNS 请求方式。这种情况下 ECH 无法工作。
你可以尝试按照 Mozilla Wiki 的指示,在 about:config 中将 network.trr.mode设置为 3,即只使用 TRR(也就是我们的 DNS over HTTPS),强制 Firefox 使用 DoH,这样就能确保使用 ESNI 了。
- 自己通过AdGuardHome架设DNS服务器, 同时还可以去广告. https://github.com/AdguardTeam/AdGuardHome
- 通过使用mosdns-cn 可以让国内的网址走国内的DNS解析, 国外的网址走国外的DNS解析. https://github.com/IrineSistiana/mosdns-cn
- [DNS服务器列表] (https://dns.icoa.cn/), https://dns.icoa.cn/