使用 SampleDNSTool 快速构建 DNS 服务器

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 使用 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…


溜了! 溜了!




相关文章
|
13天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
167 75
|
2月前
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
102 52
|
17天前
|
安全 编译器 Linux
深入解析与防范:基于缓冲区溢出的FTP服务器攻击及调用计算器示例
本文深入解析了利用缓冲区溢出漏洞对FTP服务器进行远程攻击的技术,通过分析FreeFlow FTP 1.75版本的漏洞,展示了如何通过构造过长的用户名触发缓冲区溢出并调用计算器(`calc.exe`)。文章详细介绍了攻击原理、关键代码组件及其实现步骤,并提出了有效的防范措施,如输入验证、编译器保护和安全编程语言的选择,以保障系统的安全性。环境搭建基于Windows XP SP3和Kali Linux,使用Metasploit Framework进行攻击演示。请注意,此内容仅用于教育和研究目的。
57 4
|
18天前
|
域名解析 弹性计算 安全
阿里云服务器租用、注册域名、备案及域名解析完整流程参考(图文教程)
对于很多初次建站的用户来说,选购云服务器和注册应及备案和域名解析步骤必须了解的,目前轻量云服务器2核2G68元一年,2核4G4M服务器298元一年,域名注册方面,阿里云推出域名1元购买活动,新用户注册com和cn域名2年首年仅需0元,xyz和top等域名首年仅需1元。对于建站的用户来说,购买完云服务器并注册好域名之后,下一步还需要操作备案和域名绑定。本文为大家展示阿里云服务器的购买流程,域名注册、绑定以及备案的完整流程,全文以图文教程形式为大家展示具体细节及注意事项,以供新手用户参考。
|
30天前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
2月前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
2月前
|
存储 机器学习/深度学习 编解码
阿里云服务器计算型c8i实例解析:实例规格性能及使用场景和最新价格参考
计算型c8i实例作为阿里云服务器家族中的重要成员,以其卓越的计算性能、稳定的算力输出、强劲的I/O引擎以及芯片级的安全加固,广泛适用于机器学习推理、数据分析、批量计算、视频编码、游戏服务器前端、高性能科学和工程应用以及Web前端服务器等多种场景。本文将全面介绍阿里云服务器计算型c8i实例,从规格族特性、适用场景、详细规格指标、性能优势、实际应用案例,到最新的活动价格,以供大家参考。
|
2月前
|
监控 持续交付 数据库
构建高效的后端服务:微服务架构的深度解析
在现代软件开发中,微服务架构已成为提升系统可扩展性、灵活性和维护性的关键。本文深入探讨了微服务架构的核心概念、设计原则和最佳实践,通过案例分析展示了如何在实际项目中有效地实施微服务策略,以及面临的挑战和解决方案。文章旨在为开发者提供一套完整的指导框架,帮助他们构建出更加高效、稳定的后端服务。
|
2月前
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器全解析_GPU价格收费标准_GPU优势和使用说明
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等场景。作为亚太领先的云服务商,阿里云GPU云服务器具备高灵活性、易用性、容灾备份、安全性和成本效益,支持多种实例规格,满足不同业务需求。
376 2
|
2月前
|
关系型数据库 API 数据库
后端开发的艺术:从零到一构建高效服务器
在数字化时代,后端开发是支撑现代互联网应用的基石。本文旨在探讨后端开发的核心概念、关键技术以及如何构建一个高效的服务器。我们将从基础的编程语言选择开始,逐步深入到数据库设计、API开发和性能优化等关键领域。通过实际案例分析,我们将揭示后端开发的复杂性和挑战性,同时提供实用的解决方案和最佳实践。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和启发。

相关产品

  • 云解析DNS
  • 推荐镜像

    更多