add backendDNS opt

This commit is contained in:
Jason
2019-08-17 15:45:01 +08:00
parent 2589ed1411
commit 5fc23e0c24
3 changed files with 22 additions and 10 deletions

View File

@@ -55,6 +55,7 @@ type CmdArgs struct {
FakeDNSAddr *string FakeDNSAddr *string
FakeDNSHosts *string FakeDNSHosts *string
HijackDNS *string HijackDNS *string
BackendDNS *string
// Session Statistics Monitor // Session Statistics Monitor
EnableMonitor *bool EnableMonitor *bool

View File

@@ -4,6 +4,7 @@ package main
import ( import (
"flag" "flag"
"strings"
"github.com/xjasonlyu/tun2socks/component/fakedns" "github.com/xjasonlyu/tun2socks/component/fakedns"
"github.com/xjasonlyu/tun2socks/log" "github.com/xjasonlyu/tun2socks/log"
@@ -15,6 +16,7 @@ func init() {
args.FakeIPRange = flag.String("fakeIPRange", "198.18.0.0/15", "Fake IP CIDR range for DNS") args.FakeIPRange = flag.String("fakeIPRange", "198.18.0.0/15", "Fake IP CIDR range for DNS")
args.FakeDNSHosts = flag.String("fakeDNSHosts", "", "DNS hosts mapping, e.g. 'example.com=1.1.1.1,example.net=2.2.2.2'") args.FakeDNSHosts = flag.String("fakeDNSHosts", "", "DNS hosts mapping, e.g. 'example.com=1.1.1.1,example.net=2.2.2.2'")
args.HijackDNS = flag.String("hijackDNS", "", "Hijack the DNS query to get a fake ip, e.g. '*:53' or '8.8.8.8:53,8.8.4.4:53'") args.HijackDNS = flag.String("hijackDNS", "", "Hijack the DNS query to get a fake ip, e.g. '*:53' or '8.8.8.8:53,8.8.4.4:53'")
args.BackendDNS = flag.String("backendDNS", "8.8.8.8:53", "Backend DNS to resolve !TypeA or !ClassINET query. (must support tcp)")
registerInitFn(func() { registerInitFn(func() {
if *args.EnableFakeDNS { if *args.EnableFakeDNS {
@@ -26,6 +28,7 @@ func init() {
// Set fakeDNS variables // Set fakeDNS variables
fakedns.ServeAddr = *args.FakeDNSAddr fakedns.ServeAddr = *args.FakeDNSAddr
fakedns.BackendDNS = strings.Split(*args.BackendDNS, ",")
// Start fakeDNS server // Start fakeDNS server
if err := fakeDNS.Start(); err != nil { if err := fakeDNS.Start(); err != nil {

View File

@@ -11,20 +11,28 @@ import (
) )
var ( var (
nameserver = "8.8.8.8:53" BackendDNS = []string{}
) )
func dnsExchange(r *D.Msg) *D.Msg { func dnsExchange(r *D.Msg) (msg *D.Msg) {
defer func() {
if msg == nil {
// empty DNS response
rr := &D.A{}
rr.Hdr = D.RR_Header{Name: r.Question[0].Name, Rrtype: D.TypeA, Class: D.ClassINET, Ttl: dnsDefaultTTL}
msg = r.Copy()
msg.Answer = []D.RR{rr}
setMsgTTL(msg, dnsDefaultTTL)
}
}()
c := new(D.Client) c := new(D.Client)
c.Net = "tcp" c.Net = "tcp"
msg, _, err := c.Exchange(r, nameserver) for _, dns := range BackendDNS {
if err != nil { msg, _, _ = c.Exchange(r, dns)
// empty DNS response if msg != nil {
rr := &D.A{} break
rr.Hdr = D.RR_Header{Name: r.Question[0].Name, Rrtype: D.TypeA, Class: D.ClassINET, Ttl: dnsDefaultTTL} }
msg = r.Copy()
msg.Answer = []D.RR{rr}
setMsgTTL(msg, dnsDefaultTTL)
} }
return msg return msg
} }