update fakedns backend DNS opt

This commit is contained in:
Jason
2019-08-19 17:45:19 +08:00
parent 3fb9601109
commit 9792ef0b97
3 changed files with 19 additions and 12 deletions

View File

@@ -19,11 +19,15 @@ func init() {
registerInitFn(func() { registerInitFn(func() {
if *args.EnableFakeDNS { if *args.EnableFakeDNS {
var err error var err error
fakeDNS, err = fakedns.NewResolver(*args.FakeDNSAddr, *args.Hosts, *args.BackendDNS) fakeDNS, err = fakedns.NewResolver(*args.FakeDNSAddr, *args.Hosts)
if err != nil { if err != nil {
log.Fatalf("Create fake DNS server failed: %v", err) log.Fatalf("Create fake DNS server failed: %v", err)
} }
// Register backend DNS
fakedns.RegisterDNS(*args.BackendDNS)
// Start FakeDNS
if err := fakeDNS.Start(); err != nil { if err := fakeDNS.Start(); err != nil {
log.Fatalf("Start fake DNS failed: %v", err) log.Fatalf("Start fake DNS failed: %v", err)
} }

View File

@@ -12,7 +12,13 @@ import (
F "github.com/xjasonlyu/tun2socks/common/fakeip" F "github.com/xjasonlyu/tun2socks/common/fakeip"
) )
func dnsExchange(backendDNS []string, r *D.Msg) (msg *D.Msg) { var backendDNS []string
func RegisterDNS(dns string) {
backendDNS = append(backendDNS, strings.Split(dns, ",")...)
}
func dnsExchange(r *D.Msg) (msg *D.Msg) {
defer func() { defer func() {
if msg == nil { if msg == nil {
// empty DNS response // empty DNS response
@@ -37,7 +43,7 @@ func dnsExchange(backendDNS []string, r *D.Msg) (msg *D.Msg) {
return msg return msg
} }
func resolve(hosts *T.Trie, pool *F.Pool, backendDNS []string, r *D.Msg) (msg *D.Msg) { func resolve(hosts *T.Trie, pool *F.Pool, r *D.Msg) (msg *D.Msg) {
defer func() { defer func() {
if msg != nil { if msg != nil {
msg.SetReply(r) msg.SetReply(r)
@@ -50,7 +56,7 @@ func resolve(hosts *T.Trie, pool *F.Pool, backendDNS []string, r *D.Msg) (msg *D
q := r.Question[0] q := r.Question[0]
if q.Qtype != D.TypeA || q.Qclass != D.ClassINET { if q.Qtype != D.TypeA || q.Qclass != D.ClassINET {
return dnsExchange(backendDNS, r) return dnsExchange(r)
} }
return fakeResolve(pool, r) return fakeResolve(pool, r)
@@ -113,9 +119,9 @@ func hostResolve(hosts *T.Trie, r *D.Msg) *D.Msg {
return msg return msg
} }
func newHandler(hosts *T.Trie, pool *F.Pool, backendDNS []string) handler { func newHandler(hosts *T.Trie, pool *F.Pool) handler {
return func(w D.ResponseWriter, r *D.Msg) { return func(w D.ResponseWriter, r *D.Msg) {
msg := resolve(hosts, pool, backendDNS, r) msg := resolve(hosts, pool, r)
w.WriteMsg(msg) w.WriteMsg(msg)
return return
} }

View File

@@ -25,7 +25,6 @@ const (
type handler = D.HandlerFunc type handler = D.HandlerFunc
type Resolver struct { type Resolver struct {
b []string
h handler h handler
p *F.Pool p *F.Pool
t *T.Trie t *T.Trie
@@ -88,7 +87,7 @@ func (r *Resolver) Resolve(request []byte) ([]byte, error) {
return nil, errors.New("cannot handle dns query: invalid question length") return nil, errors.New("cannot handle dns query: invalid question length")
} }
msg := resolve(r.t, r.p, r.b, req) msg := resolve(r.t, r.p, req)
if msg == nil { if msg == nil {
return nil, errors.New("cannot resolve dns query: msg is nil") return nil, errors.New("cannot resolve dns query: msg is nil")
} }
@@ -99,7 +98,7 @@ func (r *Resolver) Resolve(request []byte) ([]byte, error) {
return resp, nil return resp, nil
} }
func NewResolver(a, h, b string) (*Resolver, error) { func NewResolver(a, h string) (*Resolver, error) {
_, ipnet, _ := net.ParseCIDR(dnsFakeIPRange) _, ipnet, _ := net.ParseCIDR(dnsFakeIPRange)
pool, err := F.New(ipnet, dnsCacheSize) pool, err := F.New(ipnet, dnsCacheSize)
@@ -124,10 +123,8 @@ func NewResolver(a, h, b string) (*Resolver, error) {
return tree return tree
}(h) }(h)
backendDNS := strings.Split(b, ",") handler := newHandler(tree, pool)
handler := newHandler(tree, pool, backendDNS)
return &Resolver{ return &Resolver{
b: backendDNS,
h: handler, h: handler,
p: pool, p: pool,
t: tree, t: tree,