-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathmain.go
More file actions
58 lines (45 loc) · 1.26 KB
/
main.go
File metadata and controls
58 lines (45 loc) · 1.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package main
import (
"flag"
"fmt"
"log"
"net"
"github.com/miekg/dns"
)
var resolveIP net.IP
func handleRequest(w dns.ResponseWriter, r *dns.Msg) {
q := r.Question[0]
info := fmt.Sprintf("Question: Type=%s Class=%s Name=%s", dns.TypeToString[q.Qtype], dns.ClassToString[q.Qclass], q.Name)
if q.Qtype == dns.TypeA && q.Qclass == dns.ClassINET {
m := new(dns.Msg)
m.SetReply(r)
a := new(dns.A)
a.Hdr = dns.RR_Header{Name: q.Name, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 600}
a.A = resolveIP
m.Answer = []dns.RR{a}
w.WriteMsg(m)
log.Printf("%s (RESOLVED)\n", info)
} else {
m := new(dns.Msg)
m.SetReply(r)
m.Rcode = dns.RcodeNameError // NXDOMAIN
w.WriteMsg(m)
log.Printf("%s (NXDOMAIN)\n", info)
}
}
func main() {
var addr = flag.String("addr", "127.0.0.1:5300", "listen address")
var ip = flag.String("ip", "127.0.0.1", "resolve ipv4 address")
flag.Parse()
resolveIP = net.ParseIP(*ip)
if resolveIP == nil {
log.Fatalf("Invalid ip address: %s\n", *ip)
}
if resolveIP.To4() == nil {
log.Fatalf("Invalid ipv4 address: %s\n", *ip)
}
server := &dns.Server{Addr: *addr, Net: "udp"}
server.Handler = dns.HandlerFunc(handleRequest)
log.Printf("Listening on %s, resolving to %s\n", *addr, *ip)
log.Fatal(server.ListenAndServe())
}