57 lines
1.5 KiB
Go
57 lines
1.5 KiB
Go
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)
|
|
}
|
|
}
|