使用 SampleDNSTool 快速构建 DNS 服务器

简介: 使用 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…


溜了! 溜了!




相关文章
|
21天前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
221 0
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
5月前
|
存储 缓存 网络协议
阿里云特惠云服务器99元与199元配置与性能和适用场景解析:高性价比之选
2025年,阿里云长效特惠活动继续推出两款极具吸引力的特惠云服务器套餐:99元1年的经济型e实例2核2G云服务器和199元1年的通用算力型u1实例2核4G云服务器。这两款云服务器不仅价格亲民,而且性能稳定可靠,为入门级用户和普通企业级用户提供了理想的选择。本文将对这两款云服务器进行深度剖析,包括配置介绍、实例规格、使用场景、性能表现以及购买策略等方面,帮助用户更好地了解这两款云服务器,以供参考和选择。
|
1月前
|
网络协议
利用Private Zone DNS - 搭建AD但不搭建DNS服务器如何加域
利用Private Zone DNS - 搭建AD但不搭建DNS服务器如何加域
利用Private Zone DNS - 搭建AD但不搭建DNS服务器如何加域
|
2月前
|
监控 Ubuntu 安全
Ubuntu系统下构建FTP服务器的步骤
记住,时不时的巡视(监控)农场,更新工具(软件和安全性更新),以及恰当的维护同样重要,这样你的FTP农场才能长久繁荣。
54 4
|
4月前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
1233 4
|
3月前
|
网络协议 安全 Linux
阿里云服务器国际站dns服务器不可用怎么办?dns可以随便改吗?
阿里云服务器国际站dns服务器不可用怎么办?dns可以随便改吗?
|
5月前
|
存储 弹性计算 安全
阿里云服务器ECS通用型规格族解析:实例规格、性能基准与场景化应用指南
作为ECS产品矩阵中的核心序列,通用型规格族以均衡的计算、内存、网络和存储性能著称,覆盖从基础应用到高性能计算的广泛场景。通用型规格族属于独享型云服务器,实例采用固定CPU调度模式,实例的每个CPU绑定到一个物理CPU超线程,实例间无CPU资源争抢,实例计算性能稳定且有严格的SLA保证,在性能上会更加稳定,高负载情况下也不会出现资源争夺现象。本文将深度解析阿里云ECS通用型规格族的技术架构、实例规格特性、最新价格政策及典型应用场景,为云计算选型提供参考。
|
5月前
|
存储 机器学习/深度学习 人工智能
阿里云服务器第八代通用型g8i实例评测:性能与适用场景解析
阿里云服务器通用型g8i实例怎么样?g8i实例采用CIPU+飞天技术架构,并搭载最新的Intel 第五代至强可扩展处理器(代号EMR),不仅性能得到大幅提升,同时还拥有AMX加持的AI能力增强,以及全球范围内率先支持的TDX机密虚拟机能力。这些特性使得g8i实例在AI增强和全面安全防护两大方面表现出色,尤其适用于在线音视频及AI相关应用。本文将深入探讨g8i实例的产品特性、优势、适用场景及规格族,以帮助您更好地了解这款产品,以供参考和选择。
|
5月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

相关产品

  • 云解析DNS
  • 推荐镜像

    更多
  • DNS
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等