# SampleDNSTool **Repository Path**: pdudo/SampleDNSTool ## Basic Information - **Project Name**: SampleDNSTool - **Description**: DNS 协议golang实现,目前已经实现简单的A记录,具体案例参照: https://gitee.com/pdudo/SampleDNS2 - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-10-30 - **Last Updated**: 2024-07-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SampleDNSTool > DNS 协议golang实现,目前已经实现简单的A/CNAME记录,具体案例参照: https://gitee.com/pdudo/SampleDNS2 从三个方面描述该工具 - 构建请求报文 - 解析响应报文 - 利用该工具快速搭建DNS服务器 ### 1. 利用SampleDNSTool快速构建请求报文 仅需要调用`GenerateHeaders`和`GenerateQuestion`便可以构建相应报文 构建 【查询 `www.baidu.com` 的 `A`记录 报文】 ```go package main import ( "fmt" "time" "gitee.com/pdudo/SampleDNSTool" ) func main() { // 定义DnsInfo信息 var dnsInfo SampleDNSTool.DNSInfo // 构建请求报文: 请求头 和 请求 报文 // heade部分 dnsInfo.Header.ID = uint16(time.Now().Unix()) // Qcount: 报文中携带的 问题条蜜 dnsInfo.Header.QCOUNT = 1 // question部分 // 定义查询的 QNAME dnsInfo.QueryInfo.QNAMEString = "www.baidu.com" // 定义 QType 和 QClass dnsInfo.QueryInfo.QTYPE = 1 dnsInfo.QueryInfo.QCLASS = 1 // 分别生成 Header 和 question 报文 header := dnsInfo.GenerateHeaders() requests := dnsInfo.GenerateQuestion() // 组装报文 var requestBuf []byte requestBuf = append(requestBuf, header...) requestBuf = append(requestBuf,requests...) fmt.Println("请求报文: " , requestBuf) } ``` ### 2. 利用SampleDNSTool获取响应报文 将【1】中报文请求发送至 DNS 服务器,获取其 响应报文信息 ```go package main import ( "fmt" "log" "net" "strconv" "time" "gitee.com/pdudo/SampleDNSTool" ) func main() { // 定义DnsInfo信息 var dnsInfo SampleDNSTool.DNSInfo // 构建请求报文: 请求头 和 请求 报文 // heade部分 dnsInfo.Header.ID = uint16(time.Now().Unix()) // Qcount: 报文中携带的 问题条蜜 dnsInfo.Header.QCOUNT = 1 // question部分 // 定义查询的 QNAME dnsInfo.QueryInfo.QNAMEString = "www.baidu.com" // 定义 QType 和 QClass dnsInfo.QueryInfo.QTYPE = 1 dnsInfo.QueryInfo.QCLASS = 1 // 分别生成 Header 和 question 报文 header := dnsInfo.GenerateHeaders() requests := dnsInfo.GenerateQuestion() // 组装报文 var requestBuf []byte requestBuf = append(requestBuf, header...) requestBuf = append(requestBuf,requests...) fmt.Printf("查询域名: %s \t" , dnsInfo.QueryInfo.QNAMEString) switch dnsInfo.QueryInfo.QTYPE { case 1: fmt.Printf("查询类型: A记录 \n\n") } // 发送上诉报文 udpConn , err := net.DialUDP("udp",nil,&net.UDPAddr{ IP: net.IP{114,114,114,114}, Port: 53, }) if err != nil { log.Panic("net dial udp error " , err) } // 发送报文 udpConn.Write(requestBuf) // 等待DNS服务器回应 buf := make([]byte,1024) n, err := udpConn.Read(buf) if err != nil { log.Println("udp conn read error " , err) } // 解析响应报文 answer := dnsInfo.GetAnswerInfo(buf[:n]) // 打印解析后报文值 fmt.Println("查询结果: ") for _,v := range answer { fmt.Printf("请求域名: %s \t" , v.NAME) switch v.TYPE { case 1: fmt.Printf("请求类型: A记录 \t" ) case 5: fmt.Printf("请求类型: CNAME记录 \t") } switch v.TYPE { case 1: var ipString string for i:=0;i