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