echodns updated

This commit is contained in:
OldDrake
2022-11-24 18:40:52 +08:00
parent b21fc1d0ec
commit 4bb42822bb

View File

@@ -1,9 +1,12 @@
package main package main
import ( import (
"bytes"
"encoding/binary"
_ "fmt" _ "fmt"
"net" "net"
"strings" "strings"
"time"
"github.com/google/gopacket" "github.com/google/gopacket"
"github.com/google/gopacket/layers" "github.com/google/gopacket/layers"
@@ -12,20 +15,33 @@ import (
func serveDNS(u *net.UDPConn, clientaddr net.Addr, request *layers.DNS) { func serveDNS(u *net.UDPConn, clientaddr net.Addr, request *layers.DNS) {
replyMess := request replyMess := request
var dnsAnswer layers.DNSResourceRecord var dnsAnswer layers.DNSResourceRecord
dnsAnswer.Type = layers.DNSTypeA
if request == nil || request.Questions == nil || len(request.Questions) == 0 { if request == nil || request.Questions == nil || len(request.Questions) == 0 {
return return
} else { } else {
dnsAnswer.Name = []byte(request.Questions[0].Name) dnsAnswer.Name = []byte(request.Questions[0].Name)
} }
//fmt.Println(clientaddr.String()) //fmt.Println(clientaddr.String())
dnsAnswer.Class = layers.DNSClassIN
replyMess.QR = true replyMess.QR = true
replyMess.ANCount = 1 replyMess.ANCount = 1
replyMess.OpCode = layers.DNSOpCodeQuery replyMess.OpCode = layers.DNSOpCodeQuery
replyMess.AA = true replyMess.AA = true
dnsAnswer.IP = net.ParseIP(strings.Split(clientaddr.String(), ":")[0]) if request.Questions[0].Type == layers.DNSTypeA {
dnsAnswer.TTL = 1000 dnsAnswer.Type = layers.DNSTypeA
dnsAnswer.Class = layers.DNSClassIN
dnsAnswer.IP = net.ParseIP(strings.Split(clientaddr.String(), ":")[0])
dnsAnswer.TTL = 1000
} else if request.Questions[0].Type == layers.DNSTypeAAAA {
dnsAnswer.Type = layers.DNSTypeAAAA
dnsAnswer.Class = layers.DNSClassIN
t := time.Now().UnixMicro()
rdns_ipv4 := net.ParseIP(strings.Split(clientaddr.String(), ":")[0]).To4()
bytebuf := bytes.NewBuffer([]byte{})
binary.Write(bytebuf, binary.BigEndian, t)
binary.Write(bytebuf, binary.BigEndian, rdns_ipv4)
binary.Write(bytebuf, binary.BigEndian, []byte{0, 0, 0, 0})
dnsAnswer.IP = net.IP(bytebuf.Bytes())
dnsAnswer.TTL = 1000
}
replyMess.Answers = append(replyMess.Answers, dnsAnswer) replyMess.Answers = append(replyMess.Answers, dnsAnswer)
replyMess.ResponseCode = layers.DNSResponseCodeNoErr replyMess.ResponseCode = layers.DNSResponseCodeNoErr
buf := gopacket.NewSerializeBuffer() buf := gopacket.NewSerializeBuffer()
@@ -40,7 +56,7 @@ func serveDNS(u *net.UDPConn, clientaddr net.Addr, request *layers.DNS) {
func main() { func main() {
addr := net.UDPAddr{ addr := net.UDPAddr{
Port: 53, Port: 53,
IP: net.ParseIP("localhost.localdomain"), //localhost IP: net.ParseIP("localhost.localdomain"), //localhost
} }
u, _ := net.ListenUDP("udp", &addr) u, _ := net.ListenUDP("udp", &addr)