为什么 /etc/hosts 不再适用于 Big Sur 上的某些网站?

问题描述

多年来我一直使用 /etc/hosts 来调整 IP 地址。有时它是为了原型设计,或添加一个尚未准备好进入公共 DNS 的用于开发目的的地址。有时我会通过将某些域重定向错误的 IP 地址来阻止我不想访问的域。有些是侵入性跟踪网站,例如 connect.facebook.net。作为反拖延措施,我一直屏蔽其他网站,例如 politico.com 之类的新闻网站,否则我可能会在我打算工作的时候花一整天时间阅读这些网站。

但现在在 macOS 11 Big Sur 上,我注意到一些 /etc/hosts 条目被 Safari 忽略。使用 gethostbyname() 进行 DNS 查找正确显示阻止/覆盖地址,但 Safari 仍然显示公共站点

这到底是怎么回事? /etc/hosts 有什么变化,我可以在开发工作时继续使用它来覆盖 DNS 条目吗?

解决方法

macOS 11 添加了对正式称为 “Service binding and parameter specification via the DNS (DNS SVCB and HTTPSSV)” 的支持。

现在,当您访问网站时,不仅会查询典型的 DNS A 主机到 IP 地址记录,还会检查全新的 HTTPS DNS 记录。这不仅仅是一个名称条目;这是一种全新的记录类型 (#65),与更熟悉的 ACNAME 以及 MX 搭配使用。

这些新的 HTTPS DNS 记录可以表明该站点支持 HTTPS,包括协议版本和 IP 地址。这样,输入一个裸域名会立即提供网站的 https:// 版本,甚至可能在 HTTP/2 或 HTTP/3 上,跳过老式的 HTTP 重定向。甚至还有一个 draft option 供域运营商告诉您的计算机绕过任何本地 DNS 设置并使用特定的服务器来处理未来涉及其域的所有 DNS 查询。

这里有很多支持性能的意图,也有一些支持隐私的意图。

但是在规范和实现中都存在一个致命的隐私和安全缺陷:它消除了用户在 /etc/hosts 中覆盖域名查找的能力,即使在面对恶意的域名运营商时也是如此。

要了解这是如何运作的:

  • macOS 自带的 dig 版本不直接支持这些新记录,但是可以通过

    查看它们是否存在
    $ dig -t type65 www.politico.com
    …
    ;; QUESTION SECTION:
    ;www.politico.com.      IN  TYPE65
    
    ;; ANSWER SECTION:
    www.politico.com.   53806   IN  CNAME   www.politico.com.cdn.cloudflare.net.
    www.politico.com.cdn.cloudflare.net. 300 IN TYPE65 \# 58 0001000001000302683200040008681210CA681211CA000600202606 47000000000000000000681210CA2606470000000000000000006812 11CA
    …
    
  • 我不知道如何解析它,但是如果我对它进行数据包捕获,wireshark 可以做到

    Domain Name System (response)
        Queries
            www.politico.com.cdn.cloudflare.net: type HTTPS,class IN
        Answers
            www.politico.com.cdn.cloudflare.net: type HTTPS,class IN
                Name: www.politico.com.cdn.cloudflare.net
                Type: HTTPS (HTTPS Specific Service Endpoints) (65)
                Class: IN (0x0001)
                Time to live: 300 (5 minutes)
                Data length: 58
                SvcPriority: 1
                TargetName: <Root>
                SvcParams
                    SvcParam: ALPN
                        SvcParamKey: ALPN (1)
                        SvcParamValue length: 3
                        ALPN length: 2
                        ALPN: h2
                    SvcParam: IPv4 Hint
                        SvcParamKey: IPv4 Hint (4)
                        SvcParamValue length: 8
                        IP: 104.18.16.202
                        IP: 104.18.17.202
                    SvcParam: IPv6 Hint
                        SvcParamKey: IPv6 Hint (6)
                        SvcParamValue length: 32
                        IP: 2606:4700::6812:10ca
                        IP: 2606:4700::6812:11ca
    

这就是正在发生的事情:

  1. Big Sur 上的 Safari 可以加载您在 /etc/hosts 中屏蔽的一些网站,因为它会从这些新的 HTTPS 记录中获取这些网站的 IP 地址
  2. 它只能对某些网站执行此操作,因为大多数域名运营商尚未设置此功能。看起来 Cloudflare 已经为他们平台上的每个人都做了这件事;幸运的是,包括广告/跟踪/恶意软件巨头在内的大多数域名运营商尚未意识到这一点。

目前,您可以继续将 /etc/hosts 用于您完全控制的域名。

与此同时,对于其他域,您有一些选择:

  • 您可以在家庭网络上运行本地 DNS 服务器或防火墙,blocks these requests
  • 你可以在你的 mac 上配置一个本地 DNS 解析器守护进程,并用它来 阻止这些请求
  • 您可以切换到 Linux 发行版,其中默认使用可配置的本地解析器守护程序
  • 您可以停止使用 Safari,但其他使用默认 macOS 网络堆栈的应用可能会继续默默地绕过 /etc/hosts

Chrome 对此进行了一些试验,但 does not appear to have implemented it yet。 Firefox 已开始实施它but doesn’t seem to have gotten too far.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...