使用 SampleDNSTool 快速构建 DNS 服务器

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 使用 SampleDNSTool 快速构建 DNS 服务器

SampleDNSTool 是DNS协议golang实现,目前已经实现简单的A/CNAME记录


地址: gitee.com/pdudo/Sampl…


作为运维小白,自己学习DNS相关协议很久了,总觉得差了点什么,后面自己想写一个简单的DNS服务器出来,所以编写了该工具,写个博客记录一下,因为 SampleDNSTool 支持CNAME了。




利用 SampleDNSTool 构建请求报文


仅需要调用GenerateHeadersGenerateQuestion便可以构建相应报文

构建 【查询 www.baidu.comA记录 报文】

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)
}




利用SampleDNSTool获取响应报文


将【1】中报文请求发送至 DNS 服务器,获取其 响应报文信息

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<len(v.RDATA)-1;i++ {
        ipString += strconv.Itoa(int(uint8(v.RDATA[i]))) + "."
      }
      ipString += strconv.Itoa(int(uint8(v.RDATA[len(v.RDATA)-1])))
      fmt.Printf("结果值: %s \t" , ipString)
    case 5:
      fmt.Printf("结果值: %s \t" , v.RDATAString)
    }
    fmt.Println()
  }
}




执行结果


查询域名: www.baidu.com         查询类型: A记录
查询结果:
请求域名: www.baidu.com         请求类型: CNAME记录     结果值: www.a.shifen.com.
请求域名: www.a.shifen.com      请求类型: A记录         结果值: 14.215.177.39
请求域名: www.a.shifen.com      请求类型: A记录         结果值: 14.215.177.38

怎么样,通过上述2个例子,是不是发现,构建DNS协议怎么会如此得心应手呢,可以尝试一下利用该工具半个小时编写一个返回A记录的DNS服务器吧


代码放在了gitee: gitee.com/pdudo/Sampl…


溜了! 溜了!




相关文章
|
1月前
|
存储 缓存 网络协议
阿里云特惠云服务器99元与199元配置与性能和适用场景解析:高性价比之选
2025年,阿里云长效特惠活动继续推出两款极具吸引力的特惠云服务器套餐:99元1年的经济型e实例2核2G云服务器和199元1年的通用算力型u1实例2核4G云服务器。这两款云服务器不仅价格亲民,而且性能稳定可靠,为入门级用户和普通企业级用户提供了理想的选择。本文将对这两款云服务器进行深度剖析,包括配置介绍、实例规格、使用场景、性能表现以及购买策略等方面,帮助用户更好地了解这两款云服务器,以供参考和选择。
|
1月前
|
存储 缓存 负载均衡
阿里云服务器实例选择指南:热门实例性能、适用场景解析对比参考
2025年,在阿里云的活动中,主售的云服务器实例规格除了轻量应用服务器之外,还有经济型e、通用算力型u1、计算型c8i、通用型g8i、计算型c7、计算型c8y、通用型g7、通用型g8y、内存型r7、内存型r8y等,以满足不同用户的需求。然而,面对众多实例规格,用户往往感到困惑,不知道如何选择。本文旨在全面解析阿里云服务器实例的各种类型,包括经济型、通用算力型、计算型、通用型和内存型等,以供参考和选择。
|
19天前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
219 3
|
1月前
|
存储 机器学习/深度学习 应用服务中间件
阿里云服务器架构解析:从X86到高性能计算、异构计算等不同架构性能、适用场景及选择参考
当我们准备选购阿里云服务器时,阿里云提供了X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等多种架构,每种架构都有其独特的特点和适用场景。本文将详细解析这些架构的区别,探讨它们的主要特点和适用场景,并为用户提供选择云服务器架构的全面指南。
284 18
|
1月前
|
存储 弹性计算 安全
阿里云服务器ECS通用型规格族解析:实例规格、性能基准与场景化应用指南
作为ECS产品矩阵中的核心序列,通用型规格族以均衡的计算、内存、网络和存储性能著称,覆盖从基础应用到高性能计算的广泛场景。通用型规格族属于独享型云服务器,实例采用固定CPU调度模式,实例的每个CPU绑定到一个物理CPU超线程,实例间无CPU资源争抢,实例计算性能稳定且有严格的SLA保证,在性能上会更加稳定,高负载情况下也不会出现资源争夺现象。本文将深度解析阿里云ECS通用型规格族的技术架构、实例规格特性、最新价格政策及典型应用场景,为云计算选型提供参考。
|
1月前
|
存储 机器学习/深度学习 人工智能
阿里云服务器第八代通用型g8i实例评测:性能与适用场景解析
阿里云服务器通用型g8i实例怎么样?g8i实例采用CIPU+飞天技术架构,并搭载最新的Intel 第五代至强可扩展处理器(代号EMR),不仅性能得到大幅提升,同时还拥有AMX加持的AI能力增强,以及全球范围内率先支持的TDX机密虚拟机能力。这些特性使得g8i实例在AI增强和全面安全防护两大方面表现出色,尤其适用于在线音视频及AI相关应用。本文将深入探讨g8i实例的产品特性、优势、适用场景及规格族,以帮助您更好地了解这款产品,以供参考和选择。
|
1月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
4月前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
360 76
|
2月前
|
云安全 人工智能 安全
阿里云网络安全体系解析:如何构建数字时代的"安全盾牌"
在数字经济时代,阿里云作为亚太地区最大的云服务提供商,构建了行业领先的网络安全体系。本文解析其网络安全架构的三大核心维度:基础架构安全、核心技术防护和安全管理体系。通过技术创新与体系化防御,阿里云为企业数字化转型提供坚实的安全屏障,确保数据安全与业务连续性。案例显示,某金融客户借助阿里云成功拦截3200万次攻击,降低运维成本40%,响应时间缩短至8分钟。未来,阿里云将继续推进自适应安全架构,助力企业提升核心竞争力。
|
2月前
|
域名解析 弹性计算 负载均衡
新手上云教程参考:阿里云服务器租用、域名注册、备案及域名解析流程图文教程
对于想要在阿里云上搭建网站或应用的用户来说,购买阿里云服务器和注册域名,绑定以及备案的流程至关重要。本文将以图文形式为您介绍阿里云服务器购买、域名注册、备案及绑定的全流程,以供参考,帮助用户轻松上手。

相关产品

  • 云解析DNS
  • 推荐镜像

    更多
    下一篇
    oss创建bucket