From e812edef95dd42fe36ccc4020c64cfbeb5dcacf2 Mon Sep 17 00:00:00 2001 From: Netch Date: Sat, 10 Jul 2021 13:38:55 +0800 Subject: [PATCH] Add aiodns --- Other/aiodns/README.md | 1 + Other/aiodns/dns.go | 48 +++++++++++++++++++++ Other/aiodns/go.mod | 5 +++ Other/aiodns/go.sum | 12 ++++++ Other/aiodns/main.go | 94 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 160 insertions(+) create mode 100644 Other/aiodns/README.md create mode 100644 Other/aiodns/dns.go create mode 100644 Other/aiodns/go.mod create mode 100644 Other/aiodns/go.sum create mode 100644 Other/aiodns/main.go diff --git a/Other/aiodns/README.md b/Other/aiodns/README.md new file mode 100644 index 00000000..bc32d9df --- /dev/null +++ b/Other/aiodns/README.md @@ -0,0 +1 @@ +# aiodns diff --git a/Other/aiodns/dns.go b/Other/aiodns/dns.go new file mode 100644 index 00000000..c2fa12c3 --- /dev/null +++ b/Other/aiodns/dns.go @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + "log" + + "github.com/miekg/dns" +) + +var ( + ChinaDNS = dns.Client{} + OtherDNS = dns.Client{} +) + +func handleServerName(w dns.ResponseWriter, m *dns.Msg) { + r := new(dns.Msg) + r.SetReply(m) + + for i := 0; i < len(m.Question); i++ { + rr, err := dns.NewRR(fmt.Sprintf("%s PTR Netch", m.Question[i].Name)) + if err != nil { + log.Printf("[aiodns][dns.NewRR] %v", err) + return + } + + r.Answer = append(m.Answer, rr) + } + + _ = w.WriteMsg(r) +} + +func handleChinaDNS(w dns.ResponseWriter, m *dns.Msg) { + r, _, err := ChinaDNS.Exchange(m, flags.ChinaDNS) + if err != nil { + log.Printf("[aiodns][handleChinaDNS] %v", err) + } + + _ = w.WriteMsg(r) +} + +func handleOtherDNS(w dns.ResponseWriter, m *dns.Msg) { + r, _, err := OtherDNS.Exchange(m, flags.OtherDNS) + if err != nil { + log.Printf("[aiodns][handleOtherDNS] %v", err) + } + + _ = w.WriteMsg(r) +} diff --git a/Other/aiodns/go.mod b/Other/aiodns/go.mod new file mode 100644 index 00000000..7391149d --- /dev/null +++ b/Other/aiodns/go.mod @@ -0,0 +1,5 @@ +module github.com/netchx/netch/other/aiodns + +go 1.16 + +require github.com/miekg/dns v1.1.43 diff --git a/Other/aiodns/go.sum b/Other/aiodns/go.sum new file mode 100644 index 00000000..e4731d19 --- /dev/null +++ b/Other/aiodns/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/Other/aiodns/main.go b/Other/aiodns/main.go new file mode 100644 index 00000000..7f238cd2 --- /dev/null +++ b/Other/aiodns/main.go @@ -0,0 +1,94 @@ +package main + +import ( + "bufio" + "flag" + "log" + "net" + "net/url" + "os" + "strings" + + "github.com/miekg/dns" +) + +var ( + flags struct { + Path string + Listen string + ChinaDNS string + OtherDNS string + } +) + +func main() { + flag.StringVar(&flags.Path, "c", "", "") + flag.StringVar(&flags.Listen, "l", ":53", "Listen") + flag.StringVar(&flags.ChinaDNS, "cdns", "tls://223.5.5.5:853", "China DNS") + flag.StringVar(&flags.OtherDNS, "odns", "tls://1.1.1.1:853", "Other DNS") + flag.Parse() + + { + { + info, err := url.Parse(flags.ChinaDNS) + if err != nil { + log.Fatalf("[aiodns][main][url.Parse] %v", err) + } + + switch info.Scheme { + case "tls": + ChinaDNS.Net = "tcp-tls" + default: + ChinaDNS.Net = "tcp" + } + + flags.ChinaDNS = info.Host + } + + { + info, err := url.Parse(flags.OtherDNS) + if err != nil { + log.Fatalf("[aiodns][main][url.Parse] %v", err) + } + + switch info.Scheme { + case "tls": + OtherDNS.Net = "tcp-tls" + default: + OtherDNS.Net = "tcp" + } + + flags.OtherDNS = info.Host + } + } + + mux := dns.NewServeMux() + if flags.Path != "" { + file, err := os.Open(flags.Path) + if err != nil { + log.Fatalf("[aiodns][main][os.Open] %v", err) + } + + scan := bufio.NewScanner(file) + for scan.Scan() { + mux.HandleFunc(dns.Fqdn(strings.TrimSpace(scan.Text())), handleChinaDNS) + } + } + mux.HandleFunc("in-addr.arpa.", handleServerName) + mux.HandleFunc(".", handleOtherDNS) + + tcpSocket, err := net.Listen("tcp", flags.Listen) + if err != nil { + log.Fatalf("[aiodns][main][net.Listen] %v", err) + } + + udpSocket, err := net.ListenPacket("udp", flags.Listen) + if err != nil { + log.Fatalf("[aiodns][main][net.ListenPacket] %v", err) + } + + log.Printf("[aiodns] Started") + + go dns.ActivateAndServe(tcpSocket, nil, mux) + dns.ActivateAndServe(nil, udpSocket, mux) +}