diff options
Diffstat (limited to 'rogue_ns.go')
| -rw-r--r-- | rogue_ns.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/rogue_ns.go b/rogue_ns.go new file mode 100644 index 0000000..b33a701 --- /dev/null +++ b/rogue_ns.go @@ -0,0 +1,64 @@ +package main + +import ( + "flag" + "net" + "strconv" + "strings" + + "github.com/miekg/dns" +) + +func rogue_delegation(w dns.ResponseWriter, r *dns.Msg) { + m := new(dns.Msg) + m.SetReply(r) + m.Compress = true + m.Authoritative = true + + qname := m.Question[0].Name + qtype := m.Question[0].Qtype + subdomain := strings.ToLower(strings.Split(qname, ".")[0]) + if qtype == dns.TypeA { + if subdomain == "ns1" || subdomain == "ns2" { + resp := &dns.A{ + Hdr: dns.RR_Header{Name: qname, Rrtype: dns.TypeA, Class: dns.ClassINET, Ttl: 10}, + A: net.ParseIP(CONFIG_NS), + } + m.Answer = append(m.Answer, resp) + } else if strings.Contains(subdomain, "rogue") { + var ns_target string + var resp *dns.NS + for i := 0; i < 5; i++ { + ns_target = strings.Join([]string{subdomain + strconv.Itoa(i), CONFIG_SLD}, ".") + resp = &dns.NS{ + Hdr: dns.RR_Header{Name: qname, Rrtype: dns.TypeNS, Class: dns.ClassINET, Ttl: 10}, + Ns: dns.Fqdn(ns_target), + } + m.Ns = append(m.Ns, resp) + } + } else { + m.MsgHdr.Rcode = dns.RcodeNameError + } + } else { + m.MsgHdr.Rcode = dns.RcodeNameError + } + w.WriteMsg(m) +} + +var CONFIG_SLD string +var CONFIG_NS string + +func main() { + flag.StringVar(&CONFIG_NS, "ns", "8.8.8.8", "nameserver ip address") + flag.StringVar(&CONFIG_SLD, "sld", "", "configure sld for rogue server") + flag.Parse() + if CONFIG_SLD == "" { + panic("Please configure the SLD for the echo dns server!\n") + } + dns.HandleFunc(dns.Fqdn(CONFIG_SLD), rogue_delegation) + server := &dns.Server{Addr: ":53", Net: "udp"} + if err := server.ListenAndServe(); err != nil { + println("Failed to set up the rogue server") + panic(err) + } +} |
