Skip to content

Commit 87c7a25

Browse files
committed
dnsx: dns request origin indicator
1 parent 68defd9 commit 87c7a25

4 files changed

Lines changed: 24 additions & 9 deletions

File tree

intra/backend/dnsx.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ const ( // see dnsx/transport.go
4949
// dns resolver for dns resolvers and for firestack (built-in)
5050
// delegates queries to Bootstrap.
5151
IpMapper = "IpMapper"
52+
53+
// dns request origin indicators
54+
55+
// DNS request originated internally
56+
OriginInternal = "self"
57+
58+
// DNS request originated from tunnel read
59+
OriginTunnel = "tunnel"
5260
)
5361

5462
const ( // from dnsx/queryerror.go

intra/backend/dnsx_listener.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ type DNSListener interface {
9595
ResolverListener
9696
// OnQuery is called when a DNS query is received. The listener
9797
// can return a DNSOpts to specify how the query should be handled.
98-
OnQuery(uid, domain *Gostr, qtyp int) *DNSOpts
98+
OnQuery(who, uid, domain *Gostr, qtyp int) *DNSOpts
9999
// OnUpstreamAnswer is called before an upstream DNS answer (not blocked by firestack) is sent to the OS.
100100
// The listener may return DNSOpts to specify if another upstream should override that answer.
101101
// Another round of OnQuery is NOT called in this case, and OnResponse is called once after processing

intra/dns53/ipmapper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func (m *ipmapper) queryIP2(_ context.Context, network, host, uid string, tid ..
152152
if len(tid) > 0 { // always choose one among these tids
153153
val4, _ = m.ba.Do(key4(host, tid...), m.lookupon(q4, tid...))
154154
val6, _ = m.ba.Do(key6(host, tid...), m.lookupon(q6, tid...))
155-
} else if uid != core.UNKNOWN_UID_STR { // client code chooses a tid
155+
} else if uid != core.UNKNOWN_UID_STR { // client code chooses a tid depending on uid & "origin"
156156
val4, _ = m.ba.Do(key4(host, uid), m.lookupfor(q4, uid))
157157
val6, _ = m.ba.Do(key6(host, uid), m.lookupfor(q6, uid))
158158
} else { // either Default or System/Goos

intra/dnsx/transport.go

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ const (
5858
IpMapper = x.IpMapper
5959
NoDNS = ""
6060

61+
// DNS request origin indicators
62+
OriginInternal = x.OriginInternal
63+
OriginTunnel = x.OriginTunnel
64+
6165
invalidQname = "invalid.query"
6266

6367
// preferred network to use with t.Query
@@ -463,22 +467,25 @@ func (r *resolver) IsDnsAddr(ipport netip.AddrPort) bool {
463467
return r.isDns(ipport)
464468
}
465469

470+
// Lookup implements ResolverSelf.
466471
func (r *resolver) Lookup(q []byte, tids ...string) ([]byte, string, error) {
467472
if len(q) <= 0 {
468473
return nil, NoDNS, errNoQuestion
469474
}
470475
// if len(tids) == 0, use transport from preferences
471-
return r.forward(q, protect.UidSelf, tids...)
476+
return r.forward(q, OriginInternal, protect.UidSelf, tids...)
472477
}
473478

479+
// LookupForSelf implements ResolverSelf.
474480
func (r *resolver) LookupFor(q []byte, uid string) ([]byte, string, error) {
475481
if len(q) <= 0 {
476482
return nil, NoDNS, errNoQuestion
477483
}
478484

479-
return r.forward(q, uid)
485+
return r.forward(q, OriginInternal, uid)
480486
}
481487

488+
// LocalLookup implements ResovlerSelf.
482489
func (r *resolver) LocalLookup(q []byte) ([]byte, string, error) {
483490
if r.closed.Load() {
484491
return nil, NoDNS, errResolverClosed
@@ -496,13 +503,13 @@ func (r *resolver) LocalLookup(q []byte) ([]byte, string, error) {
496503
// msg may be nil
497504
if msg := xdns.AsMsg(ans); err != nil || xdns.IsNXDomain(msg) || !xdns.HasRcodeSuccess(msg) {
498505
log.I("dns: nxdomain via Default (err? %v); attempting Goos for %s", err, xdns.QName(msg))
499-
ans, tid, err = r.forward(q, protect.UidSelf, Goos) // Goos is System; see: determineTransport
506+
ans, tid, err = r.forward(q, OriginInternal, protect.UidSelf, Goos) // Goos is System; see: determineTransport
500507
} // else: rcode success and nil err; do not fallback on Goos/System
501508

502509
return ans, tid, err
503510
}
504511

505-
func (r *resolver) forward(q []byte, uid string, chosenids ...string) (res0 []byte, tid0 string, err0 error) {
512+
func (r *resolver) forward(q []byte, who, uid string, chosenids ...string) (res0 []byte, tid0 string, err0 error) {
506513
starttime := time.Now()
507514
ogsmm := &x.DNSSummary{
508515
ID: NoDNS,
@@ -538,7 +545,7 @@ func (r *resolver) forward(q []byte, uid string, chosenids ...string) (res0 []by
538545
}
539546

540547
pref, oqcompleted := core.Grx("r.onQuery", func(_ context.Context) (*x.DNSOpts, error) {
541-
return r.listener.OnQuery(x.StrOf(uid), x.StrOf(qname), qtyp), nil
548+
return r.listener.OnQuery(x.StrOf(who), x.StrOf(uid), x.StrOf(qname), qtyp), nil
542549
}, listenerTimeout)
543550
if !oqcompleted || pref == nil {
544551
log.W("dns: fwd: for %s; no preferences (%t) for %s:%d", uid, pref == nil, qname, qtyp)
@@ -806,7 +813,7 @@ func (r *resolver) determineTransport(id string) Transport {
806813

807814
// dnstcp queries the transport and writes answers to w, prefixed by length.
808815
func (r *resolver) dnstcp(q []byte, w io.WriteCloser, uid string) error {
809-
ans, _, err := r.forward(q, uid)
816+
ans, _, err := r.forward(q, OriginTunnel, uid)
810817

811818
rlen := len(ans)
812819
if rlen <= 0 && err != nil {
@@ -826,7 +833,7 @@ func (r *resolver) dnstcp(q []byte, w io.WriteCloser, uid string) error {
826833

827834
// dnsudp queries the transport and writes answers to w.
828835
func (r *resolver) dnsudp(q []byte, w io.WriteCloser, uid string) error {
829-
ans, _, err := r.forward(q, uid)
836+
ans, _, err := r.forward(q, OriginTunnel, uid)
830837

831838
rlen := len(ans)
832839
if rlen <= 0 && err != nil {

0 commit comments

Comments
 (0)