【问题标题】:Node.js I can't resolve TXT recordNode.js 我无法解析 TXT 记录
【发布时间】:2018-11-03 15:29:16
【问题描述】:

我有一个关于 dns.resolveTxt 的问题。 https://nodejs.org/api/dns.html#dns_dns_resolvetxt_hostname_callback

基本上我可以解析 TXT 记录,但是对于特定的 DNS 区域,我无法解析 TXT 记录。例如,microsoft.com 等。 我写了以下代码。

var dns = require('dns');
dns.resolveTxt('microsoft.com', (err, record) => {
 console.log(record);
});

有人知道这个问题吗?

【问题讨论】:

  • “我无法解决”是什么意思?你得到空洞的回应?一个错误?请提供详细信息。请注意,“microsoft.com TXT”查询现在生成一个 933 字节的数据包,因此如果路径中的库或其他内容未实现 EDNS 或 TCP DNS 查询,您将遇到问题,因为您超过 512 字节。

标签: node.js dns


【解决方案1】:
import * as dns from "dns";

dns.resolveTxt('microsoft.com', (err, addresses) => {
    console.log(JSON.stringify(addresses));
});

输出

[["v=spf1 include:_spf-a.microsoft.com include:_spf-b.microsoft.com include:_spf-c.microsoft.com include:_spf-ssg-a.microsoft.com include:spf-a.hotmail.com include:_spf1-meo.microsoft.com -all"],["d365mktkey=3uc1cf82cpv750lzk70v9bvf2"]
,["adobe-idp-site-verification=8aa35c528af5d72beb19b1bd3ed9b86d87ea7f24b2ba3c99ffcd00c27e9d809c"],["fg2t0gov9424p2tdcuo94goe9j"],["apple-domain-verification=0gMeaYyYy6GLViGo"],["d365mktkey=4d8bnycx40fy3581petta4gsf"],["docusign=d5a3737
c-c23c-4bd0-9095-d2ff621f2840"],["adobe-sign-verification=c1fea9b4cdd4df0d5778517f29e0934"],["google-site-verification=Zv1IvEEZg4N9wbEXpBSSyAiIjDyyB3S-fzfFClb7D1E"],["google-site-verification=8-zFCaUXhhPcvN29EVw2RvtASDCaDPQ02L1HJ8Om8I0
"],["google-site-verification=pjPOauSPcrfXOZS9jnPPa5axowcHGCDAl1_86dCqFpk"],["google-site-verification=1TeK8q0OziFl4T1tF-QR65JkzHZ1rcdgNccDFp78iTk"],["8RPDXjBzBS9tu7Pbysu7qCACrwXPoDV8ZtLfthTnC4y9VJFLd84it5sQlEITgSLJ4KOIA8pBZxmyvPujuUvh
Og=="],["docusign=52998482-393d-46f7-95d4-15ac6509bfdd"],["facebook-domain-verification=fwzwhbbzwmg5fzgotc2go51olc3566"]]

所以,显然似乎工作正常。

【讨论】:

    【解决方案2】:

    问题是 DNS 结果超过 512 字节长。据我所知,Node 的 dns.resolve* functions 不支持 EDNS,它允许最多 4096 字节的响应,至少从 Node 14 开始。鉴于此代码:

    const { Resolver } = require('dns');
    const dns = new Resolver();
    dns.resolveTxt(process.argv[2], (err, res) => {
        if (err) {
            console.log(err);
        } else {
            console.log(res);
        }
    });
    

    我得到这个结果:

    $ node dns-test2.js google.com
    Error: queryTxt ESERVFAIL google.com
        at QueryReqWrap.onresolve [as oncomplete] (dns.js:206:19) {
      errno: undefined,
      code: 'ESERVFAIL',
      syscall: 'queryTxt',
      hostname: 'google.com'
    }
    

    您可以看到 dig 针对同一个查询返回 715 个字节:

    $ dig TXT google.com
    
    ; <<>> DiG 9.10.3-P4-Debian <<>> TXT google.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32543
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;google.com.                    IN      TXT
    
    ;; ANSWER SECTION:
    google.com.             30      IN      TXT     "google-site-verification=TV9-DBe4R80X4v0M4U_bd_J9cpOJM0nikft0jAgjmsQ"
    google.com.             30      IN      TXT     "v=spf1 include:_spf.google.com ~all"
    google.com.             30      IN      TXT     "docusign=1b0a6754-49b1-4db5-8540-d2c12664b289"
    google.com.             30      IN      TXT     "globalsign-smime-dv=CDYX+XFHUw2wml6/Gb8+59BsH31KzUr6c1l2BPvqKX8="
    google.com.             30      IN      TXT     "google-site-verification=wD8N7i1JTNTkezJ49swvWW48f8_9xveREV4oB-0Hf5o"
    google.com.             30      IN      TXT     "facebook-domain-verification=22rm551cu4k0ab0bxsw536tlds4h95"
    google.com.             30      IN      TXT     "docusign=05958488-4752-4ef2-95eb-aa7ba8a3bd0e"
    google.com.             30      IN      TXT     "apple-domain-verification=30afIBcvSuDV2PLX"
    google.com.             30      IN      TXT     "MS=E4A68B9AB2BB9670BCE15412F62916164C0B20BB"
    
    ;; Query time: 4 msec
    ;; SERVER: 10.0.0.10#53(10.0.0.10)
    ;; WHEN: Fri Sep 10 21:02:16 UTC 2021
    ;; MSG SIZE  rcvd: 715
    

    运行tcpdump,发现节点查询不包含UDPsize=4096选项:

    TXT? google.com. (28)
    

    而挖掘请求:

    TXT? google.com. ar: . OPT UDPsize=4096 (39)
    

    对只返回 244 字节的 TXT 记录的类似查询可以正常工作:

    $ node dns-test2.js  partechgss.com
    [
      [ 'ryb3spm2r33rtxl189nqs5n41xxrzmlz' ],
      [ 'v=spf1 include:_spf.google.com ~all' ],
      [ 'MS=ms32721923' ],
      [ 'MS=ms56152555' ]
    ]
    $ dig TXT partechgss.com
    
    ; <<>> DiG 9.10.3-P4-Debian <<>> TXT partechgss.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56392
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;partechgss.com.                        IN      TXT
    
    ;; ANSWER SECTION:
    partechgss.com.         30      IN      TXT     "MS=ms56152555"
    partechgss.com.         30      IN      TXT     "MS=ms32721923"
    partechgss.com.         30      IN      TXT     "v=spf1 include:_spf.google.com ~all"
    partechgss.com.         30      IN      TXT     "ryb3spm2r33rtxl189nqs5n41xxrzmlz"
    
    ;; Query time: 14 msec
    ;; SERVER: 10.0.0.10#53(10.0.0.10)
    ;; WHEN: Fri Sep 10 21:15:21 UTC 2021
    ;; MSG SIZE  rcvd: 244
    

    不幸的是,在确定了问题之后,我还没有找到解决方案。我在 github 上针对 node.js 项目打开了bug report

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-14
      • 2017-05-22
      • 2013-11-04
      • 2021-05-21
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多