Skip to content

Commit 7b9385d

Browse files
committed
dnsx: opt-in default transport as fallback
1 parent 6c630e7 commit 7b9385d

5 files changed

Lines changed: 19 additions & 5 deletions

File tree

intra/backend/netstat.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ type RDNSInfo struct {
158158
PanicTest bool
159159
FatalTest bool
160160
SystemDNSForUndelegated bool
161+
DefaultDNSAsFallback bool
161162
SetUserAgent bool
162163
OwnTunFd bool
163164
PortForward bool

intra/dnsx/transport.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -791,11 +791,12 @@ func (r *resolver) determineTransport(id string) Transport {
791791
tf = r.transports[Default]
792792
r.RUnlock()
793793

794-
if t0 != nil && activeTransport(t0) {
794+
mayusedefault := canUseDefaultDNS(id0)
795+
if t0 != nil && (t1 == nil || !mayusedefault || activeTransport(t0)) {
795796
return t0
796-
} else if t1 != nil {
797+
} else if t1 != nil && (!mayusedefault || activeTransport(t1)) {
797798
return t1
798-
} else if canUseDefaultDNS(id0) {
799+
} else if tf != nil && mayusedefault {
799800
log.W("dns: fwd: %s is missing; using default", id0)
800801
return tf // todo: assert tf != nil?
801802
}
@@ -1309,9 +1310,9 @@ func canUseDefaultDNS(id string) bool {
13091310
case Local, CT + Local:
13101311
return false
13111312
case Alg, Preferred, Plus, BlockFree:
1312-
return true
1313+
return settings.DefaultDNSAsFallback.Load()
13131314
case CT + Alg, CT + Preferred, CT + Plus, CT + BlockFree:
1314-
return true
1315+
return settings.DefaultDNSAsFallback.Load()
13151316
}
13161317
return false
13171318
}

intra/settings/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ var EndpointIndependentFiltering = atomic.Bool{}
5454
// for undelegated domains.
5555
var SystemDNSForUndelegatedDomains = atomic.Bool{}
5656

57+
// DefaultDNSAsFallback is a global flag to allow using the Default transport
58+
// as a fallback when the Preferred transport is missing or paused or ended.
59+
var DefaultDNSAsFallback = atomic.Bool{}
60+
5761
// SetUserAgent is a global flag to set User-Agent for DoH requests
5862
// to "Intra" and for HTTP "Reaches" checks to the Android default.
5963
var SetUserAgent = atomic.Bool{}

intra/tun2socks.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,13 @@ func UndelegatedDomains(useSystemDNS bool) {
192192
log.I("tun: resolve undelegated with system DNS? %t / ok? %t", useSystemDNS, ok)
193193
}
194194

195+
// DefaultDNSAsFallback allows using the Default transport as a fallback when
196+
// the Preferred transport is missing or paused or ended.
197+
func DefaultDNSAsFallback(y bool) {
198+
ok := settings.DefaultDNSAsFallback.CompareAndSwap(!y, y)
199+
log.I("tun: allow default DNS as fallback? %t / ok? %t", y, ok)
200+
}
201+
195202
// Transparency enables/disables endpoint-independent mapping/filtering.
196203
// Currently applies only for UDP (RFC 4787).
197204
func Transparency(eim, eif bool) {

intra/tunnel.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,7 @@ func (t *rtunnel) stat() (*x.NetStat, error) {
490490
out.RDNSIn.FatalTest = settings.FatalAtRandom.Load()
491491
out.RDNSIn.SetUserAgent = settings.SetUserAgent.Load()
492492
out.RDNSIn.SystemDNSForUndelegated = settings.SystemDNSForUndelegatedDomains.Load()
493+
out.RDNSIn.DefaultDNSAsFallback = settings.DefaultDNSAsFallback.Load()
493494
out.RDNSIn.Dialer4 = dialers.Use4()
494495
out.RDNSIn.Dialer6 = dialers.Use6()
495496
out.RDNSIn.DialerOpts = csv2ssv(settings.GetDialerOpts().String())

0 commit comments

Comments
 (0)