mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-11-01 12:32:45 +08:00
update fakedns backend DNS opt
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user