From b21fc1d0ec252c1ac8c09d98f37db4a3fa2c6112 Mon Sep 17 00:00:00 2001 From: OldDrake <33509198+OldDrake@users.noreply.github.com> Date: Thu, 24 Nov 2022 16:02:53 +0800 Subject: [PATCH] Add files via upload --- echodns.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 echodns.go diff --git a/echodns.go b/echodns.go new file mode 100644 index 0000000..64f1a3e --- /dev/null +++ b/echodns.go @@ -0,0 +1,56 @@ +package main + +import ( + _ "fmt" + "net" + "strings" + + "github.com/google/gopacket" + "github.com/google/gopacket/layers" +) + +func serveDNS(u *net.UDPConn, clientaddr net.Addr, request *layers.DNS) { + replyMess := request + var dnsAnswer layers.DNSResourceRecord + dnsAnswer.Type = layers.DNSTypeA + if request == nil || request.Questions == nil || len(request.Questions) == 0 { + return + } else { + dnsAnswer.Name = []byte(request.Questions[0].Name) + } + //fmt.Println(clientaddr.String()) + dnsAnswer.Class = layers.DNSClassIN + replyMess.QR = true + replyMess.ANCount = 1 + replyMess.OpCode = layers.DNSOpCodeQuery + replyMess.AA = true + dnsAnswer.IP = net.ParseIP(strings.Split(clientaddr.String(), ":")[0]) + dnsAnswer.TTL = 1000 + replyMess.Answers = append(replyMess.Answers, dnsAnswer) + replyMess.ResponseCode = layers.DNSResponseCodeNoErr + buf := gopacket.NewSerializeBuffer() + opts := gopacket.SerializeOptions{} + err := replyMess.SerializeTo(buf, opts) + if err != nil { + panic(err) + } + u.WriteTo(buf.Bytes(), clientaddr) +} + +func main() { + addr := net.UDPAddr{ + Port: 53, + IP: net.ParseIP("localhost.localdomain"), //localhost + } + u, _ := net.ListenUDP("udp", &addr) + + for { + tmp := make([]byte, 1024) + _, addr, _ := u.ReadFrom(tmp) + clientaddr := addr + packet := gopacket.NewPacket(tmp, layers.LayerTypeDNS, gopacket.Default) + dnsPacket := packet.Layer(layers.LayerTypeDNS) + tcp, _ := dnsPacket.(*layers.DNS) + serveDNS(u, clientaddr, tcp) + } +}