mirror of
https://github.com/xjasonlyu/tun2socks.git
synced 2025-11-01 12:32:45 +08:00
add backendDNS opt
This commit is contained in:
@@ -55,6 +55,7 @@ type CmdArgs struct {
|
||||
FakeDNSAddr *string
|
||||
FakeDNSHosts *string
|
||||
HijackDNS *string
|
||||
BackendDNS *string
|
||||
|
||||
// Session Statistics Monitor
|
||||
EnableMonitor *bool
|
||||
|
||||
@@ -4,6 +4,7 @@ package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"strings"
|
||||
|
||||
"github.com/xjasonlyu/tun2socks/component/fakedns"
|
||||
"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.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.BackendDNS = flag.String("backendDNS", "8.8.8.8:53", "Backend DNS to resolve !TypeA or !ClassINET query. (must support tcp)")
|
||||
|
||||
registerInitFn(func() {
|
||||
if *args.EnableFakeDNS {
|
||||
@@ -26,6 +28,7 @@ func init() {
|
||||
|
||||
// Set fakeDNS variables
|
||||
fakedns.ServeAddr = *args.FakeDNSAddr
|
||||
fakedns.BackendDNS = strings.Split(*args.BackendDNS, ",")
|
||||
|
||||
// Start fakeDNS server
|
||||
if err := fakeDNS.Start(); err != nil {
|
||||
|
||||
@@ -11,14 +11,12 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
nameserver = "8.8.8.8:53"
|
||||
BackendDNS = []string{}
|
||||
)
|
||||
|
||||
func dnsExchange(r *D.Msg) *D.Msg {
|
||||
c := new(D.Client)
|
||||
c.Net = "tcp"
|
||||
msg, _, err := c.Exchange(r, nameserver)
|
||||
if err != nil {
|
||||
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}
|
||||
@@ -26,6 +24,16 @@ func dnsExchange(r *D.Msg) *D.Msg {
|
||||
msg.Answer = []D.RR{rr}
|
||||
setMsgTTL(msg, dnsDefaultTTL)
|
||||
}
|
||||
}()
|
||||
|
||||
c := new(D.Client)
|
||||
c.Net = "tcp"
|
||||
for _, dns := range BackendDNS {
|
||||
msg, _, _ = c.Exchange(r, dns)
|
||||
if msg != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
return msg
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user