为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Go 中获取 DNS 解析失败的主机(NXDOMAIN)的 CNAME?

如何在 Go 中获取 DNS 解析失败的主机(NXDOMAIN)的 CNAME?

Go
慕沐林林 2023-06-26 18:02:53
我正在寻找一种方法(在 Go 中)来获取给定主机的 CNAME(如果有),无论该主机的 DNS 解析是否失败。主机的 DNS 解析可能会失败并产生NXDOMAIN,但有问题的主机可能仍然有 CNAME 记录。在撰写此问题时,tst1crmapps.starbucks.com有这样一个主机的示例:$ dig tst1crmapps.starbucks.com | grep -E 'NXDOMAIN|CNAME';; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 50444tst1crmapps.starbucks.com. 86400 IN CNAME   bigip-tst1crmapps-starbucks.oracle.com.(在 macOS 上运行)该函数net.LookupCNAME似乎正合我意,但如果主机的 DNS 解析失败,它无法返回 CNAME。跑步package mainimport (    "log"    "net")func main() {    cname, err := net.LookupCNAME("tst1crmapps.starbucks.com")    if err != nil {        log.Fatal(err)    }    log.Println(cname)}产量yyyy/MM/dd hh:mm:ss lookup tst1crmapps.starbucks.com: no such host我是不是误会了net.LookupCNAME?或者我使用了错误的功能?
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

Go 的 LookupCNAME 函数尝试跟踪 CNAME 链直至其末尾。这意味着它认为没有 CNAME 和 A 记录的 DNS 名称是错误的:

规范名称是跟随零个或多个 CNAME 记录后的最终名称。如果主机不包含 DNS“CNAME”记录,只要主机解析为地址记录,LookupCNAME 就不会返回错误。

Go 在标准库中没有提供低级 DNS API。

package main


import (

    "fmt"


    "github.com/miekg/dns"

)


func main() {

    config, _ := dns.ClientConfigFromFile("/etc/resolv.conf")

    c := new(dns.Client)

    m := new(dns.Msg)


    // Note the trailing dot. miekg/dns is very low-level and expects canonical names.

    m.SetQuestion("tst1crmapps.starbucks.com.", dns.TypeCNAME)

    m.RecursionDesired = true

    r, _, _ := c.Exchange(m, config.Servers[0]+":"+config.Port)


    fmt.Println(r.Answer[0].(*dns.CNAME).Target) // bigip-tst1crmapps-starbucks.oracle.com.

}


查看完整回答
反对 回复 2023-06-26
  • 1 回答
  • 0 关注
  • 131 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号