客户端无法解析我的 DoH 服务器响应
Client cannot resolve my DoH server response
我正在制作一个自定义的 DoH 服务器,它应该以不同的方式解析某些 TLD。我正在使用 NodeJS 来实现它。对于大多数域,它只是将它们代理到 Google 的 DoH 并且它有效。但是当我尝试解析一些自定义域时,例如
mydomain.customtld
我希望它指向
bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link
我尝试自己格式化 DNS 响应,但失败了。
因此,我求助于通过 Google DoH 或其他一些 DoH 服务器解析提到的 link(即 bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link),并将其作为响应转发给客户端。
所以,我做了以下事情:
- 我用的是dohjs nodejs库
- 我决定像这样提到 link:
const doh = require('dohjs');
const resolver = new doh.DohResolver('https://dns.google/dns-query');
let dnsAnswer = await resolver.query(`bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link`, 'A');
我得到以下回复:
{
id: 0,
type: 'response',
flags: 384,
flag_qr: true,
opcode: 'QUERY',
flag_aa: false,
flag_tc: false,
flag_rd: true,
flag_ra: true,
flag_z: false,
flag_ad: false,
flag_cd: false,
rcode: 'NOERROR',
questions: [
{
name: 'bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link',
type: 'A',
class: 'IN'
}
],
answers: [
{
name: 'bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link',
type: 'A',
ttl: 59,
class: 'IN',
flush: false,
data: '209.94.90.1'
}
],
authorities: [],
additionals: []
}
这似乎是一个有效的 DNS 数据包,但在对其进行编码并将其转发给客户端(在本例中为 Chrome)后,无法解析它。
我唯一能想到的是响应缺少附加内容,但我不确定...我得到的具体错误是 DNS_PROBE_FINISHED_NXDOMAIN。
那么,我该如何解决这个问题?
事实证明,我的 DNS 响应数据包是有效的。问题是浏览器 URL 栏中的 URL 与 DNS 数据包的问答部分中返回的栏不同,这给浏览器带来了问题。可能是出于安全考虑,但是当我在答案和问题部分更改名称时,浏览器接受了我的 DNS 数据包。这个问题肯定是错误的并且不合时宜,但我会保留它,因为这个答案可能会帮助那些在为浏览器编写自定义 DoH 时遇到同样问题的人。
干杯并感谢有用的评论,这些评论最终帮助我弄清楚数据包没问题,问题出在其他地方
我正在制作一个自定义的 DoH 服务器,它应该以不同的方式解析某些 TLD。我正在使用 NodeJS 来实现它。对于大多数域,它只是将它们代理到 Google 的 DoH 并且它有效。但是当我尝试解析一些自定义域时,例如
mydomain.customtld
我希望它指向
bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link
我尝试自己格式化 DNS 响应,但失败了。 因此,我求助于通过 Google DoH 或其他一些 DoH 服务器解析提到的 link(即 bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link),并将其作为响应转发给客户端。
所以,我做了以下事情:
- 我用的是dohjs nodejs库
- 我决定像这样提到 link:
const doh = require('dohjs'); const resolver = new doh.DohResolver('https://dns.google/dns-query'); let dnsAnswer = await resolver.query(`bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link`, 'A');
我得到以下回复:
{
id: 0,
type: 'response',
flags: 384,
flag_qr: true,
opcode: 'QUERY',
flag_aa: false,
flag_tc: false,
flag_rd: true,
flag_ra: true,
flag_z: false,
flag_ad: false,
flag_cd: false,
rcode: 'NOERROR',
questions: [
{
name: 'bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link',
type: 'A',
class: 'IN'
}
],
answers: [
{
name: 'bafybeie5nqv6kd3qnfjupgvz34woh3oksc3iau6abmyajn7qvtf6d2ho34.ipfs.dweb.link',
type: 'A',
ttl: 59,
class: 'IN',
flush: false,
data: '209.94.90.1'
}
],
authorities: [],
additionals: []
}
这似乎是一个有效的 DNS 数据包,但在对其进行编码并将其转发给客户端(在本例中为 Chrome)后,无法解析它。
我唯一能想到的是响应缺少附加内容,但我不确定...我得到的具体错误是 DNS_PROBE_FINISHED_NXDOMAIN。
那么,我该如何解决这个问题?
事实证明,我的 DNS 响应数据包是有效的。问题是浏览器 URL 栏中的 URL 与 DNS 数据包的问答部分中返回的栏不同,这给浏览器带来了问题。可能是出于安全考虑,但是当我在答案和问题部分更改名称时,浏览器接受了我的 DNS 数据包。这个问题肯定是错误的并且不合时宜,但我会保留它,因为这个答案可能会帮助那些在为浏览器编写自定义 DoH 时遇到同样问题的人。
干杯并感谢有用的评论,这些评论最终帮助我弄清楚数据包没问题,问题出在其他地方