我知道很久以前有人问过这个问题,但我想我会提供一个更新的答案。
基于 HTTPS 的 DNS (DoH)
您可以通过 HTTPS 向支持它的 DNS 解析器发送 DNS 查询。 DOH 标准在RFC 8484 中描述。
这与所有其他答案所暗示的类似,只是 DoH 实际上是基于 HTTPS 的 DNS 协议。它也是一个“提议的”互联网标准,并且变得非常流行。例如,一些主流浏览器要么支持它,要么计划支持它(Chrome、Edge、Firefox),而微软正在将它构建到他们的操作系统中。
DoH 的目的之一是:
允许 Web 应用程序通过现有浏览器 API 以符合跨源资源共享 (CORS) 的安全方式访问 DNS 信息
有一个开源工具专门用于从称为dohjs 的 Web 应用程序进行 DNS 查找。它执行 DNS over HTTPS (DoH) 有线格式查询,如RFC 8484 中所述。它同时支持 GET 和 POST 方法。
完全披露:我是 dohjs 的贡献者。
在这里可以找到另一个具有类似功能的 JavaScript 库 - https://github.com/sc0Vu/doh-js-client。我没有亲自使用过这个,但我认为它也可以在客户端工作。
基于 HTTPS JSON API 的 DNS
如果您不想使用 DNS 有线格式,Google 和 Cloudflare 都为基于 HTTPS 的 DNS 提供 JSON API。
使用 Google 的 JSON DOH API 查找 example.com 的示例 Javascript 代码:
var response = await fetch('https://dns.google/resolve?name=example.com');
var json = await response.json();
console.log(json);
RFC 中使用有线格式的 DOH GET 和 POST 示例
以下是 RFC 为 GET 和 POST 提供的示例(请参阅 https://www.rfc-editor.org/rfc/rfc8484#section-4.1.1):
获取示例:
第一个示例请求使用 GET 请求“www.example.com”。
:方法 = GET
:scheme = https
:authority = dnsserver.example.net
:path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
接受 = 应用程序/dns 消息
POST 示例:
使用 POST 方法对“www.example.com”进行相同的 DNS 查询会
是:
:方法 = POST
:scheme = https
:authority = dnsserver.example.net
:path = /dns-查询
接受 = 应用程序/dns 消息
内容类型 = 应用程序/dns 消息
内容长度 = 33
00 00 01 00 00 01 00 00 00 00 00 00 03 77 77 77
07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
01
其他发送 DOH 查询的地方
您可以在几个地方找到一些支持 DNS over HTTPS 的公共 DNS 解析器列表:
在上述资源中,我想说 Curl wiki 上的列表和 DNSCrypt 列表可能是最完整和最频繁更新的。 Curl 的页面还包括用于 DoH 的开源工具列表(服务器、代理、客户端库等)。