DNS over HTTPS 客户端库

3.0.0 2024-01-22 00:03 UTC

This package is auto-updated.

Last update: 2024-09-26 19:54:24 UTC


README

Version License

简介

DNS 解析是一个在所有操作系统中都实现的知名功能,那么,为什么我们需要不同的方式来实现它呢?主要原因是隐私,标准的 DNS 协议不加密连接,这意味着 DNS 请求可以被窃听和伪造。

但还有其他原因;首先,DOH 很快,比很多本地服务器都快。如果你考虑到 Cloudflare 和 Google(主要的 DOH 提供商)拥有庞大的网络基础设施,这并不会让人感到惊讶。但还有更多,DOH 提供了更详细的错误信息。例如,标准的 DNS 服务器可能会将网络错误误解释为不存在的记录。DOH 会正确报告错误。

如果你需要一个快速且可靠的 DNS 名称解析,如果你需要一个快速且可靠的名称解析,更确切地说,如果你需要批量名称解析,DOH 提供了一种比标准 DNS 服务器更好的解决方案。

完整的文档可以在 github.io 页面 找到。

安装

通过 composer

composer require sirmonti/doh

使用方法

实际上,该库支持两个 DoH 提供商,Cloudflare 和 Google。支持是通过两个包装类实现的

  • DOHGG:通过 Google 解析名称
  • DOHCF:通过 Cloudflare 解析名称

使用一个类或另一个类之间没有区别。选择一个类或另一个类的唯一原因是对公司的喜好。

这些类可以通过静态调用,不需要创建对象。例如,如果你想使用 Google 后端获取 www.google.com 的 IP 地址,调用将是

$ipaddresses=DOHGG::dns('www.google.com','A');

如果你更喜欢 Cloudflare,你也可以将其用作后端

$ipaddresses=DOHCF::dns('www.google.com','A');

这些类有以下方法

DNS 解析

"dns($name,$type)" 方法执行 DNS 查询。查询返回一个包含响应的数组。如果出错,函数将返回一个空数组并将 "status" 属性设置为错误代码。参数是我们想要解析的名称和我们请求的记录类型。

当参数有无效值时,将抛出 InvalidValurException,网络或 DNS 错误不会抛出任何异常,错误将以状态码的形式报告。

有效的记录类型:NS, MX, TXT, A, AAAA, CNAME, SPF, SOA, PTR, SRV, DS, DNSKEY

响应是一个包含返回的响应的数组。如果查询没有有效的响应或发生错误,调用将返回一个空数组并将 "status" 属性设置为错误代码。如果一切正常,状态码将为零。

状态码值

  • 0:OK
  • 1:空响应。没有对此查询的响应。
  • 2:该域的 DNS 服务器配置错误
  • 3:该域不存在
  • 4:网络错误
  • 5:弱响应
  • 100:提供的记录类型无效
  • 101:提供的 IP 地址无效
  • 10XX:1000 以上的值包含 DNS 服务器返回的错误代码

在无效参数的情况下,将抛出 InvalidArgumentException 并带有状态码 100 或 101。

例子

$resp = DOHCF::dns('www.google.com','A'); // Query cloudflare with a single response
echo "\nResponse A query:\n";
print_r($resp);
printf("DNS response status code: %d\n",DOHCF::getStatus());

该脚本产生以下响应

Response to A query:
Array
(
    [0] => 142.250.200.68
)
DNS response status code: 0

在此示例中,我们使用 DOH_PROVIDER 常量来设置解析器

$resp = DOHGG:dns('google.com','TXT'); // Query with a multiple response
echo "\nResponse TXT query:\n";
print_r($resp);
printf("DNS response status code: %d\n",DOHGG::getStatus());

该脚本产生以下响应

Response to TXT query:
Array
(
    [0] => "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95"
    [1] => "MS=E4A68B9AB2BB9670BCE15412F62916164C0B20BB"
    [2] => "v=spf1 include:_spf.google.com ~all"
    [3] => "docusign=1b0a6754-49b1-4db5-8540-d2c12664b289"
    [4] => "apple-domain-verification=30afIBcvSuDV2PLX"
    [5] => "google-site-verification=wD8N7i1JTNTkezJ49swvWW48f8_9xveREV4oB-0Hf5o"
    [6] => "google-site-verification=TV9-DBe4R80X4v0M4U_bd_J9cpOJM0nikft0jAgjmsQ"
    [7] => "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"
    [8] => "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
)
DNS response status code: 0

假设查询示例。我们使用硬编码的默认解析器

$resp = DOHCF::dns('nonexistentdomain.test','TXT'); // Query with an invalid response
echo "\nResponse TXT query:\n";
print_r($resp);
printf("DNS response status code: %d\n",DOHCF::getStatus());

该脚本产生以下响应

Response to bogus query:

Array
(
)
DNS response status code: 3

许可证

此库根据 MIT 许可证 许可。