Add aiodns

This commit is contained in:
Netch
2021-07-10 13:38:55 +08:00
parent dac78cce21
commit e812edef95
5 changed files with 160 additions and 0 deletions

1
Other/aiodns/README.md Normal file
View File

@@ -0,0 +1 @@
# aiodns

48
Other/aiodns/dns.go Normal file
View File

@@ -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)
}

5
Other/aiodns/go.mod Normal file
View File

@@ -0,0 +1,5 @@
module github.com/netchx/netch/other/aiodns
go 1.16
require github.com/miekg/dns v1.1.43

12
Other/aiodns/go.sum Normal file
View 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=

94
Other/aiodns/main.go Normal file
View File

@@ -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)
}