以编程方式查找DNS记录

DNS记录是与DNS服务器关联的映射文件,与每个域关联的IP地址无关,并且它们处理发送到每个域的请求。该网络软件包包含各种方法来查找DNS记录的常规详细信息。让我们运行一些示例,以收集有关DNS服务器和目标域的相应记录的信息:


转到程序以查找域的Forward(A)记录

net.LookupIP()函数接受一个字符串(域名)并返回包含主机的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


进入程序以查找域的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。


转到程序以查找域的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。


转到程序以查找域的名称服务器(NS)记录

NS记录描述了该区域的授权名称服务器。 NS还将子域委托给区域文件上的其他组织。 net.LookupNS()函数将域名(facebook.com)作为字符串,并以NS结构片的形式返回DNS-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(作为字符串)和Pref(作为uint16)组成。

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


转到程序以查找域的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。


转到程序以查找域的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