使用 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…


溜了! 溜了!




相关文章
|
4月前
|
人工智能 JavaScript API
零基础构建MCP服务器:TypeScript/Python双语言实战指南
作为一名深耕技术领域多年的博主摘星,我深刻感受到了MCP(Model Context Protocol)协议在AI生态系统中的革命性意义。MCP作为Anthropic推出的开放标准,正在重新定义AI应用与外部系统的交互方式,它不仅解决了传统API集成的复杂性问题,更为开发者提供了一个统一、安全、高效的连接框架。在过去几个月的实践中,我发现许多开发者对MCP的概念理解透彻,但在实际动手构建MCP服务器时却遇到了各种技术壁垒。从环境配置的细节问题到SDK API的深度理解,从第一个Hello World程序的调试到生产环境的部署优化,每一个环节都可能成为初学者的绊脚石。因此,我决定撰写这篇全面的实
758 67
零基础构建MCP服务器:TypeScript/Python双语言实战指南
|
2月前
|
存储 域名解析 弹性计算
阿里云上云流程参考:云服务器+域名+备案+域名解析绑定,全流程图文详解
对于初次通过阿里云完成上云的企业和个人用户来说,很多用户不仅是需要选购云服务器,同时还需要注册域名以及完成备案和域名的解析相关流程,从而实现网站的上线。本文将以上云操作流程为核心,结合阿里云的活动政策与用户系统梳理云服务器选购、域名注册、备案申请及域名绑定四大关键环节,以供用户完成线上业务部署做出参考。
|
3月前
|
人工智能 自然语言处理 安全
Python构建MCP服务器:从工具封装到AI集成的全流程实践
MCP协议为AI提供标准化工具调用接口,助力模型高效操作现实世界。
629 1
|
4月前
|
网络协议
利用Private Zone DNS - 搭建AD但不搭建DNS服务器如何加域
利用Private Zone DNS - 搭建AD但不搭建DNS服务器如何加域
利用Private Zone DNS - 搭建AD但不搭建DNS服务器如何加域
|
3月前
|
人工智能 JavaScript 前端开发
用 Go 语言轻松构建 MCP 服务器
本文介绍了使用 Go 语言构建 MCP 服务器的完整过程,涵盖创建服务器实例、注册工具、资源和提示词,以及通过 stdio 和 sse 模式启动服务的方法,帮助开发者快速集成 LLM 应用与外部系统。
|
5月前
|
监控 Ubuntu 安全
Ubuntu系统下构建FTP服务器的步骤
记住,时不时的巡视(监控)农场,更新工具(软件和安全性更新),以及恰当的维护同样重要,这样你的FTP农场才能长久繁荣。
91 4
|
7月前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
1670 4
|
6月前
|
网络协议 安全 Linux
阿里云服务器国际站dns服务器不可用怎么办?dns可以随便改吗?
阿里云服务器国际站dns服务器不可用怎么办?dns可以随便改吗?
|
17天前
|
弹性计算 运维 安全
阿里云轻量应用服务器与云服务器ECS啥区别?新手帮助教程
阿里云轻量应用服务器适合个人开发者搭建博客、测试环境等低流量场景,操作简单、成本低;ECS适用于企业级高负载业务,功能强大、灵活可扩展。二者在性能、网络、镜像及运维管理上差异显著,用户应根据实际需求选择。
149 10

相关产品

  • 云解析DNS
  • 推荐镜像

    更多
  • DNS