mirror of
https://github.com/MarekWojt/gertdns.git
synced 2025-12-13 12:19:53 +01:00
DNS, Config, Auth, Web (leer)
This commit is contained in:
11
auth/auth.go
Normal file
11
auth/auth.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package auth
|
||||||
|
|
||||||
|
type AuthenticationRequest struct {
|
||||||
|
User string
|
||||||
|
Password string
|
||||||
|
Domain string
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsAuthenticated(request AuthenticationRequest) (bool, error) {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
18
config/config.go
Normal file
18
config/config.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
84
dns/dns.go
Normal file
84
dns/dns.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
10
go.mod
Normal file
10
go.mod
Normal file
@@ -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
|
||||||
|
)
|
||||||
12
go.sum
Normal file
12
go.sum
Normal file
@@ -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=
|
||||||
20
main.go
Normal file
20
main.go
Normal file
@@ -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())
|
||||||
|
}
|
||||||
|
}
|
||||||
1
web/web.go
Normal file
1
web/web.go
Normal file
@@ -0,0 +1 @@
|
|||||||
|
package web
|
||||||
Reference in New Issue
Block a user