fix dns resolver
This commit is contained in:
parent
3271a50bdb
commit
56bc433cd6
10
chain.go
10
chain.go
@ -128,8 +128,14 @@ func (c *Chain) dial(addr string) (net.Conn, error) {
|
||||
if c != nil && c.Resolver != nil {
|
||||
host, port, err := net.SplitHostPort(addr)
|
||||
if err == nil {
|
||||
addrs, _ := c.Resolver.Resolve(host)
|
||||
log.Log(addr, addrs)
|
||||
addrs, er := c.Resolver.Resolve(host)
|
||||
if er != nil {
|
||||
log.Logf("[resolver] %s: %v", addr, er)
|
||||
return nil, er
|
||||
}
|
||||
if Debug {
|
||||
log.Logf("[resolver] %s %v", addr, addrs)
|
||||
}
|
||||
if len(addrs) > 0 {
|
||||
addr = net.JoinHostPort(addrs[0].IP.String(), port)
|
||||
}
|
||||
|
@ -265,6 +265,9 @@ func parseResolver(cfg string) gost.Resolver {
|
||||
if cfg == "" {
|
||||
return nil
|
||||
}
|
||||
timeout := 30 * time.Second
|
||||
var nss []gost.NameServer
|
||||
|
||||
f, err := os.Open(cfg)
|
||||
if err != nil {
|
||||
for _, s := range strings.Split(cfg, ",") {
|
||||
@ -272,13 +275,22 @@ func parseResolver(cfg string) gost.Resolver {
|
||||
if s == "" {
|
||||
continue
|
||||
}
|
||||
ss := strings.Split(s, "/")
|
||||
if len(ss) == 1 {
|
||||
nss = append(nss, gost.NameServer{
|
||||
Addr: ss[0],
|
||||
})
|
||||
}
|
||||
// return gost.NewBypass(matchers, reversed)
|
||||
if len(ss) == 2 {
|
||||
nss = append(nss, gost.NameServer{
|
||||
Addr: ss[0],
|
||||
Protocol: ss[1],
|
||||
})
|
||||
}
|
||||
}
|
||||
return gost.NewResolver(nss, timeout)
|
||||
}
|
||||
|
||||
timeout := 30 * time.Second
|
||||
|
||||
var nss []gost.NameServer
|
||||
scanner := bufio.NewScanner(f)
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
@ -310,14 +322,13 @@ func parseResolver(cfg string) gost.Resolver {
|
||||
}
|
||||
|
||||
var ns gost.NameServer
|
||||
if len(ss) == 1 {
|
||||
switch len(ss) {
|
||||
case 1:
|
||||
ns.Addr = ss[0]
|
||||
}
|
||||
if len(ss) == 2 {
|
||||
case 2:
|
||||
ns.Addr = ss[0]
|
||||
ns.Protocol = ss[1]
|
||||
}
|
||||
if len(ss) == 3 {
|
||||
default:
|
||||
ns.Addr = ss[0]
|
||||
ns.Protocol = ss[1]
|
||||
ns.Hostname = ss[2]
|
||||
|
@ -1,8 +1,8 @@
|
||||
# ip[:port] [protocol] [hostname]
|
||||
|
||||
# resolver timeout
|
||||
# resolver timeout, default 30s.
|
||||
timeout 10
|
||||
|
||||
# ip[:port] [protocol] [hostname]
|
||||
|
||||
1.1.1.1:853 tls cloudflare-dns.com
|
||||
8.8.8.8
|
||||
8.8.8.8 tcp
|
||||
|
@ -506,7 +506,6 @@ func (r *route) serve() error {
|
||||
)
|
||||
|
||||
chain.Resolver = parseResolver(node.Get("dns"))
|
||||
log.Log(chain.Resolver)
|
||||
|
||||
go srv.Serve(handler)
|
||||
}
|
||||
|
8
gost.go
8
gost.go
@ -44,19 +44,19 @@ var (
|
||||
)
|
||||
|
||||
var (
|
||||
// DefaultTLSConfig is a default TLS config for internal use
|
||||
// DefaultTLSConfig is a default TLS config for internal use.
|
||||
DefaultTLSConfig *tls.Config
|
||||
|
||||
// DefaultUserAgent is the default HTTP User-Agent header used by HTTP and websocket
|
||||
// DefaultUserAgent is the default HTTP User-Agent header used by HTTP and websocket.
|
||||
DefaultUserAgent = "Chrome/60.0.3112.90"
|
||||
)
|
||||
|
||||
// SetLogger sets a new logger for internal log system
|
||||
// SetLogger sets a new logger for internal log system.
|
||||
func SetLogger(logger log.Logger) {
|
||||
log.DefaultLogger = logger
|
||||
}
|
||||
|
||||
// GenCertificate generates a random TLS certificate
|
||||
// GenCertificate generates a random TLS certificate.
|
||||
func GenCertificate() (cert tls.Certificate, err error) {
|
||||
rawCert, rawKey, err := generateKeyPair()
|
||||
if err != nil {
|
||||
|
31
resolver.go
31
resolver.go
@ -6,7 +6,10 @@ import (
|
||||
"crypto/tls"
|
||||
"fmt"
|
||||
"net"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/go-log/log"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -29,6 +32,19 @@ type NameServer struct {
|
||||
Hostname string // for TLS handshake verification
|
||||
}
|
||||
|
||||
func (ns *NameServer) String() string {
|
||||
addr := ns.Addr
|
||||
prot := ns.Protocol
|
||||
host := ns.Hostname
|
||||
if !strings.Contains(addr, ":") {
|
||||
addr += ":53"
|
||||
}
|
||||
if prot == "" {
|
||||
prot = "udp"
|
||||
}
|
||||
return fmt.Sprintf("%s/%s %s", addr, prot, host)
|
||||
}
|
||||
|
||||
type resolver struct {
|
||||
Resolver *net.Resolver
|
||||
Servers []NameServer
|
||||
@ -54,6 +70,7 @@ func (r *resolver) init() {
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
log.Logf("[resolver] %s : %s", ns, err)
|
||||
}
|
||||
return
|
||||
},
|
||||
@ -63,11 +80,15 @@ func (r *resolver) init() {
|
||||
func (r *resolver) dial(ctx context.Context, ns NameServer) (net.Conn, error) {
|
||||
var d net.Dialer
|
||||
|
||||
switch ns.Protocol {
|
||||
addr := ns.Addr
|
||||
if !strings.Contains(addr, ":") {
|
||||
addr += ":53"
|
||||
}
|
||||
switch strings.ToLower(ns.Protocol) {
|
||||
case "tcp":
|
||||
return d.DialContext(ctx, "tcp", ns.Addr)
|
||||
return d.DialContext(ctx, "tcp", addr)
|
||||
case "tls":
|
||||
conn, err := d.DialContext(ctx, "tcp", ns.Addr)
|
||||
conn, err := d.DialContext(ctx, "tcp", addr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -81,7 +102,7 @@ func (r *resolver) dial(ctx context.Context, ns NameServer) (net.Conn, error) {
|
||||
case "udp":
|
||||
fallthrough
|
||||
default:
|
||||
return d.DialContext(ctx, "udp", ns.Addr)
|
||||
return d.DialContext(ctx, "udp", addr)
|
||||
}
|
||||
}
|
||||
|
||||
@ -104,7 +125,7 @@ func (r *resolver) String() string {
|
||||
b := &bytes.Buffer{}
|
||||
fmt.Fprintf(b, "timeout %v\n", r.Timeout)
|
||||
for i := range r.Servers {
|
||||
fmt.Fprintf(b, "%s/%s %s\n", r.Servers[i].Addr, r.Servers[i].Protocol, r.Servers[i].Hostname)
|
||||
fmt.Fprintln(b, r.Servers[i])
|
||||
}
|
||||
return b.String()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user