首页 > 解决方案 > gethostbynamel() 和 dns_get_record() 对某些域返回空

问题描述

我正在使用 Google Cloud 的计算实例 VM,已安装 Debian 10 和 PHP 7.3。

然后尝试运行:

php -r "print_r(gethostbynamel('2.0.0.127.zen.spamhaus.org.'));"

令人惊讶的是它返回一个空字符串。

但是,在任何其他非 Google Cloud VM 上,它都能完美运行:

Array ( [0] => 127.0.0.4 [1] => 127.0.0.10 [2] => 127.0.0.2 ) 

更奇怪的是,使用 gethostbyname() 它可以完美地工作:

php -r "print_r(gethostbyname('2.0.0.127.zen.spamhaus.org.'));"

但显然我只得到一个结果,而不是全部。

我也试过这个命令:

php -r "print_r(dns_get_record('2.0.0.127.zen.spamhaus.org.', DNS_A));"

但它返回一个空数组。

所以 gethostbynamel() 和 dns_get_record() 似乎显示空字段。

虽然 gethostbyname() 工作得很好。

我在 Google 防火墙上为出站流量打开了端口 53 TCP。

有谁知道为什么会发生这种行为?

如果您有建议,请分享。

标签: phpgoogle-cloud-platformgoogle-compute-enginegethostbynamedns-get-record

解决方案


这是一种已知和预期的行为,也已在spamhaus 站点中被调用。

它也适用于您的 VM 的内部 DNS 解析器。Google DNS 将从“Spamhaus”公共 DNSBL 服务器返回“未列出”(NXDOMAIN) 回复,因为为 Google DNS 服务启用了 DNSBlock。

我建议您在对 Spamhaus 进行 DNSBL 查询时使用自己的 DNS 服务器。如果这不可行,请联系Spamhaus Technology以获取其他选项。

有关 DNSBL 的更多信息,请参阅链接


推荐阅读