Go:以編程方式查找 DNS 記錄

DNS 記錄是與 DNS 服務器關聯的映射文件,無論每個域名與哪個 IP 地址關聯,它們都能處理發送到每個域名的請求。net 包包含各種方法來查找 DNS 記錄的細節。讓我們運行一些示例,收集有關 DNS 服務器的信息以及目標域名的相應記錄:

Go 程序查找域名的 A 記錄

net.LookupIP() 函數接受一個字符串(domain-name)並返回一個包含主機的 IPv4 和 IPv6 地址的 net.IP 對象切片。

package main

import (
 "fmt"
 "net"
)

func main() {
 iprecords, _ := net.LookupIP("facebook.com")
 for _, ip := range iprecords {
  fmt.Println(ip)
 }
}

上述程序的輸出列出了以 IPv4 和 IPv6 格式返回的 facebook.com 的 A 記錄。

C:\golang\dns> Go run example1.go
2a03:2880:f12f:83:face:b00c:0:25de
31.13.79.35

Go 程序查找域名的 CNAME 記錄

CNAME 是規範名稱的縮寫。CNAME 本質上是綁定路徑的域名和子域名的文本別名。net.LookupCNAME()  函數接受主機域名(m.facebook.com)作爲字符串,並返回給定主機的單個規範域名

package main

import (
 "fmt"
 "net"
)

func main() {
 cname, _ := net.LookupCNAME("m.facebook.com")
 fmt.Println(cname)
}

m.facebook.com 域名返回的 CNAME 記錄如下所示:

C:\golang\dns> Go run example2.go
star-mini.c10r.facebook.com。

Go 程序查找域名的 PTR 指針記錄

這些記錄提供從地址到名稱的反向綁定。PTR 記錄應與正向記錄完全匹配。net.LookupAddr() 函數對地址執行反向查找,並返回映射到給定地址的名稱列表。

package main

import (
 "fmt"
 "net"
)

func main() {
 ptr, _ := net.LookupAddr("6.8.8.8")
 for _, ptrvalue := range ptr {
  fmt.Println(ptrvalue)
 }
}

對於給定的地址,上述程序返回單個反向記錄,如下所示:

C:\golang\dns>go run example3.go
tms_server.yuma.army.mil.

Go 程序查找域名的名稱服務器(NS)記錄

NS 記錄描述了區域的授權名稱服務器。NS 還將子域名委託給區域文件上的其他組織。net.LookupNS() 函數將域名(facebook.com)作爲字符串,並返回 DNS-NS 記錄作爲 NS 結構的切片。

package main

import (
 "fmt"
 "net"
)

func main() {
 nameserver, _ := net.LookupNS("facebook.com")
 for _, ns := range nameserver {
  fmt.Println(ns)
 }
}

支持該域名的 NS 記錄如下所示:

C:\golang\dns>go run example4.go
&{a.ns.facebook.com.}
&{b.ns.facebook.com.}

Go 程序查找域的 MX 記錄

這些記錄用來記錄可以交換電子郵件的服務器。net.LookupMX() 函數將域名作爲字符串,並返回按首選項排序的 MX 結構切片。MX 結構由類型爲字符串的 HOST 和 類型爲 uint16 的 Pref 組成。

package main

import (
 "fmt"
 "net"
)

func main() {
 mxrecords, _ := net.LookupMX("facebook.com")
 for _, mx := range mxrecords {
  fmt.Println(mx.Host, mx.Pref)
 }
}

域名(facebook.com)的輸出列表 MX 記錄。

C:\golang\dns>go run example5.go
msgin.vvv.facebook.com. 10

Go 程序查找域名的 SRV 服務記錄

LookupSRV 函數嘗試解析給定服務,協議和域名的 SRV 查詢。第二個參數是 “tcp” 或 “udp”。返回的記錄按優先級排序,並按照權重隨機化。

package main

import (
 "fmt"
 "net"
)

func main() {
 cname, srvs, err := net.LookupSRV("xmpp-server""tcp""golang.org")
 if err != nil {
  panic(err)
 }

 fmt.Printf("\ncname: %s \n\n", cname)

 for _, srv := range srvs {
  fmt.Printf("%v:%v:%d:%d\n", srv.Target, srv.Port, srv.Priority, srv.Weight)
 }
}

下面的輸出演示了 CNAME 返回,後跟由冒號分隔的 SRV 記錄的目標,端口,優先級和權重。

C:\golang\dns>go run example6.go
cname: _xmpp-server._tcp.golang.org.

Go 程序查找域名的 TXT 記錄

TXT 記錄存儲有關 SPF 的信息,該信息可以識別授權服務器以代表您的組織發送電子郵件。net.LookupTXT() 函數將域名(facebook.com)作爲字符串,並返回 DNS TXT 記錄的字符串切片。

package main

import (
 "fmt"
 "net"
)

func main() {
 txtrecords, _ := net.LookupTXT("facebook.com")

 for _, txt := range txtrecords {
  fmt.Println(txt)
 }
}

gmail.com 的單個 TXT 記錄如下所示。

C:\golang\dns>go run example7.go
v=spf1 redirect=_spf.facebook.com

via: http://www.golangprograms.com/find-dns-records-programmatically.html

作者:golangprograms[1] 譯者:lovechuck[2] 校對:polaris1119[3]

本文由 GCTT[4] 原創編譯,Go 中文網 [5] 榮譽推出,發佈在 Go 語言中文網公衆號,轉載請聯繫我們授權。

參考資料

[1]

golangprograms: http://www.golangprograms.com

[2]

lovechuck: https://github.com/lovechuck

[3]

polaris1119: https://github.com/polaris1119

[4]

GCTT: https://github.com/studygolang/GCTT

[5]

Go 中文網: https://studygolang.com/

福利

我爲大家整理了一份從入門到進階的 Go 學習資料禮包,包含學習建議:入門看什麼,進階看什麼。關注公衆號 「polarisxu」,回覆 ebook 獲取;還可以回覆「進羣」,和數萬 Gopher 交流學習。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/JlHxKk5BKmYZW-6z8hHR_Q