【发布时间】:2018-01-31 17:29:03
【问题描述】:
您好 Stackoverflow 社区! :)
我有一个在 Firebase 上运行的云功能,它用作 API,还有另一个服务器 (fitbit.com),它偶尔会向我的服务器发布数据。
作为安全功能之一,我想做一个 Forward-Confirmed Reverse DNS,基本上如下:
- 我在端点上收到来自 IP 169.45.142.104 的 POST。
- 我执行反向 DNS 查找以检索服务器的主机名。
- 验证这是否返回 fitbit.com 的子域(示例中的 IP 应解析为 ['api-169-45-141-216.fitbit.com'])。
- 然后,我对该主机名进行 DNS 查找并验证它是否解析 到原始请求的 IP 地址。
这是为 node v6.11.1 编写的源代码(它在 Util 类中.. :))
static fcrDns(ipAddress, cb) {
const reverse = Q.denodeify(dns.reverse);
const resolve4 = Q.denodeify(dns.resolve4);
return reverse(ipAddress).then(hostNames => {
console.log("hostNames: ", hostNames);
if (!hostNames.every(SecurityUtils._isFitbitSubDomain)) {
return Promise.reject("Hostname did not end with .fitbit.com");
} else {
return Promise.all([...hostNames.map(hostName => {
return resolve4(hostName)
.then(resolvedAddresses => {
if (resolvedAddresses.every(address => address === ipAddress)) {
return Promise.resolve(true);
} else {
return Promise.reject("Resolved address did not equal to initial IP address");
}
})
})]);
}
});
}
static _isFitbitSubDomain(hostName) {
return hostName.endsWith(".fitbit.com");
};
现在,问题是:如果我在 windows 和 linux 主机上执行 firebase serve --only 功能,这将非常有效。
但是,一旦将其部署到 Firebase 并执行,我会收到以下错误:
{ Error: getHostByAddr ENOTFOUND 169.45.142.104
at errnoException (dns.js:28:10)
at QueryReqWrap.onresolve [as oncomplete] (dns.js:219:19)
code: 'ENOTFOUND',
errno: 'ENOTFOUND',
syscall: 'getHostByAddr',
hostname: '169.45.142.104' }
据我了解node的源代码,这意味着它无法执行反向IP查找。
但是,正如我所测试的,解析主机名可以正常工作。
可能有一个服务器设置可以阻止反向 dns 查找,但允许解析?
【问题讨论】:
-
您的 Firebase 项目采用什么付款计划?
-
它在火焰计划中
-
有趣,我会在内部提交一个错误。通常,我们会根据 DNS 查找打开 IP,如果用户使用付费计划或 DNS 地址是列入白名单的 Google API,则允许使用它们。反向 DNS 似乎是一个合理的用例,我们应该研究一下可以做什么。
-
非常感谢您的意见和帮助@ThomasBouldin!我已经用我得到的完整错误响应编辑了我的问题,也许这将有助于跟踪错误。否则,请告诉我是否可以提供更多信息或帮助。
标签: node.js firebase dns google-cloud-functions