猿问

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

我正在寻找一种方法(在 Go 中)来获取给定主机的 CNAME(如果有),无论该主机的 DNS 解析是否失败。


主机的 DNS 解析可能会失败并产生NXDOMAIN,但有问题的主机可能仍然有 CNAME 记录。在撰写此问题时,tst1crmapps.starbucks.com有这样一个主机的示例:


$ dig tst1crmapps.starbucks.com | grep -E 'NXDOMAIN|CNAME'

;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 50444

tst1crmapps.starbucks.com. 86400 IN CNAME   bigip-tst1crmapps-starbucks.oracle.com.

(在 macOS 上运行)


该函数net.LookupCNAME似乎正合我意,但如果主机的 DNS 解析失败,它无法返回 CNAME。跑步


package main


import (

    "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?或者我使用了错误的功能?


慕沐林林
浏览 132回答 1
1回答

ABOUTYOU

Go 的 LookupCNAME 函数尝试跟踪 CNAME 链直至其末尾。这意味着它认为没有 CNAME 和 A 记录的 DNS 名称是错误的:规范名称是跟随零个或多个 CNAME 记录后的最终名称。如果主机不包含 DNS“CNAME”记录,只要主机解析为地址记录,LookupCNAME 就不会返回错误。Go 在标准库中没有提供低级 DNS API。package mainimport (    "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.}
随时随地看视频慕课网APP

相关分类

Go
我要回答