diff --git a/auth/auth.go b/auth/auth.go new file mode 100644 index 0000000..6f847a1 --- /dev/null +++ b/auth/auth.go @@ -0,0 +1,11 @@ +package auth + +type AuthenticationRequest struct { + User string + Password string + Domain string +} + +func IsAuthenticated(request AuthenticationRequest) (bool, error) { + return true, nil +} diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..469a8bc --- /dev/null +++ b/config/config.go @@ -0,0 +1,18 @@ +package config + +var Config *Configuration = nil + +type Configuration struct { + Port uint16 + Host string + Domains []string +} + +func Load() error { + Config = &Configuration{ + Port: 5353, + Host: "0.0.0.0", + Domains: []string{}, + } + return nil +} diff --git a/dns/dns.go b/dns/dns.go new file mode 100644 index 0000000..be3f57f --- /dev/null +++ b/dns/dns.go @@ -0,0 +1,84 @@ +package dns + +import ( + "fmt" + "log" + "strconv" + "sync" + + "github.com/MarekWojt/gertdns/config" + "github.com/miekg/dns" +) + +type domain struct { + Root string + Mutv4 sync.RWMutex + Mutv6 sync.RWMutex + Ipv4 map[string]string + Ipv6 map[string]string +} + +var Domains = []*domain{} + +func parseQuery(m *dns.Msg, currentDomain *domain) { + for _, q := range m.Question { + switch q.Qtype { + case dns.TypeA: + log.Printf("Query for A record of %s\n", q.Name) + currentDomain.Mutv4.RLock() + ip := currentDomain.Ipv4[q.Name] + currentDomain.Mutv4.RUnlock() + if ip != "" { + rr, err := dns.NewRR(fmt.Sprintf("%s A %s", q.Name, ip)) + if err == nil { + m.Answer = append(m.Answer, rr) + } + } + case dns.TypeAAAA: + log.Printf("Query for AAAA record of %s\n", q.Name) + currentDomain.Mutv6.RLock() + ip := currentDomain.Ipv6[q.Name] + currentDomain.Mutv6.RUnlock() + if ip != "" { + rr, err := dns.NewRR(fmt.Sprintf("%s AAAA %s", q.Name, ip)) + if err == nil { + m.Answer = append(m.Answer, rr) + } + } + } + } +} + +func handleDnsRequest(currentDomain *domain) func(w dns.ResponseWriter, r *dns.Msg) { + return func(w dns.ResponseWriter, r *dns.Msg) { + m := new(dns.Msg) + m.SetReply(r) + m.Compress = false + + switch r.Opcode { + case dns.OpcodeQuery: + parseQuery(m, currentDomain) + } + + w.WriteMsg(m) + } +} + +func Run() error { + // attach request handler func + for _, currentDomain := range Domains { + dns.HandleFunc(currentDomain.Root, handleDnsRequest(currentDomain)) + } + + // start server + port := config.Config.Port + server := &dns.Server{Addr: ":" + strconv.Itoa(int(port)), Net: "udp"} + log.Printf("Starting DNS at %d\n", port) + err := server.ListenAndServe() + if err != nil { + server.Shutdown() + return err + } + + return nil +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..91dd049 --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module github.com/MarekWojt/gertdns + +go 1.17 + +require github.com/miekg/dns v1.1.43 + +require ( + golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 // indirect + golang.org/x/sys v0.0.0-20210303074136-134d130e1a04 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..e4731d1 --- /dev/null +++ b/go.sum @@ -0,0 +1,12 @@ +github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04 h1:cEhElsAv9LUt9ZUUocxzWe05oFLVd+AA2nstydTeI8g= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/main.go b/main.go new file mode 100644 index 0000000..8422580 --- /dev/null +++ b/main.go @@ -0,0 +1,20 @@ +package main + +import ( + "log" + + "github.com/MarekWojt/gertdns/config" + "github.com/MarekWojt/gertdns/dns" +) + +func main() { + err := config.Load() + if err != nil { + log.Fatalf("Failed to load config: %s\n ", err.Error()) + } + + err = dns.Run() + if err != nil { + log.Fatalf("Failed to start DNS server: %s\n ", err.Error()) + } +} diff --git a/web/web.go b/web/web.go new file mode 100644 index 0000000..efb3895 --- /dev/null +++ b/web/web.go @@ -0,0 +1 @@ +package web