我是Go的新手,并试图让一个小型DNS程序工作,解析返回的A和CNAME记录。这是在使用 github.com/miekg/dns 包。我无法理解如何正确解析 A 或 CNAME 的返回资源记录。对于 A 记录,我想获取 IP 地址并将其存储在变量中。对于返回了多个 RR 的 CNAME,我想解析“名称”和“地址”字段并存储在变量中。我尝试过将结构转换为字符串或将其解压缩,但无济于事。任何人都可以提供任何见解,非常感谢。下面是下面的代码。文本文件包含一行带有“www”:package mainimport ( "bufio" "fmt" "log" "os" "github.com/miekg/dns")func dns_request_fwd(s string) []dns.RR { //fmt.Println(s, " : started processing DNS request") m1 := new(dns.Msg) m1.Id = dns.Id() m1.RecursionDesired = true m1.Question = make([]dns.Question, 1) m1.Question[0] = dns.Question{s, dns.TypeA, dns.ClassINET} in, err := dns.Exchange(m1, "8.8.8.8:53") if err != nil { log.Fatal(err) } if len(in.Answer) > 0 { //fmt.Println("Response greater than 0 - got something!") //fmt.Println(in.Answer) } else { //fmt.Println("Empty DNS Response") return nil } if _, ok := in.Answer[0].(*dns.A); ok { //fmt.Println("Detected an 'A' record Answer. Returning RR!") return in.Answer } else if _, ok := in.Answer[0].(*dns.CNAME); ok { //fmt.Println("Detected a 'CNAME' record Answer. Returning RR!") return in.Answer } else { fmt.Println("Returning nil") return nil }}func main() { f, err := os.Open("list4.txt") if err != nil { log.Fatal(err) } defer f.Close() domain := "acme.com" domain_lookup := "." + domain + "." scanner := bufio.NewScanner(f) for scanner.Scan() { a_record := scanner.Text() lookup := a_record+domain_lookup fmt.Println("Looking up: ", lookup) dreq := dns_request_fwd(lookup)
1 回答
哈士奇WWW
TA贡献1799条经验 获得超6个赞
您不需要“解析”结构。该库已经解析了响应,以便为您提供结构。只需使用结构中包含所需数据的字段,如 dns。A.A
,这是一张网。IP
或域名。别名。目标是
字符串。有关更多详细信息,请参阅包文档。
if arec, ok := dreq[0].(*dns.A); ok {
fmt.Println(" [+] Type is A")
fmt.Println(" [+] Answer: ", arec.A)
}
- 1 回答
- 0 关注
- 85 浏览
添加回答
举报
0/150
提交
取消