Skip to content

Commit 6af6923

Browse files
committed
dnsx: summarize all targets in dns answer
1 parent bdc1e24 commit 6af6923

File tree

5 files changed

+39
-5
lines changed

5 files changed

+39
-5
lines changed

intra/backend/dnsx_listener.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ type DNSSummary struct {
2222
QName string
2323
// Query type: A, AAAA, SVCB, HTTPS, etc. May be 0.
2424
QType int
25+
// CSV of all DNS aliases/names in the answer section (ex: CNAMEs)
26+
Targets string
2527
// Was this response returned from cache?
2628
Cached bool
2729
// DNS Response data, ex: a csv of ips for A, AAAA.
@@ -40,6 +42,8 @@ type DNSSummary struct {
4042
Status int
4143
// CSV of Rethink DNS+ blocklists (local or remote) names (if used).
4244
Blocklists string
45+
// Actual target (domain name) that was blocked (could be a CNAME or HTTPS/SVCB alias) by Blocklists
46+
BlockedTarget string
4347
// True if any among upstream transports (primary or secondary) returned blocked ans.
4448
// Only valid for A/AAAA queries. Unspecified IPs are considered as "blocked ans".
4549
UpstreamBlocks bool

intra/dnsx/rethinkdns.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ var (
6565
type RdnsResolver interface {
6666
x.RDNSResolver
6767
blockQ(Transport, Transport, *dns.Msg) (*dns.Msg, string, error)
68-
blockA(Transport, Transport, *dns.Msg, *dns.Msg, string) (*dns.Msg, string)
68+
blockA(Transport, Transport, *dns.Msg, *dns.Msg, string) (*dns.Msg, string, string)
6969
}
7070

7171
// ResolverSelf is for internal resolution needs.
@@ -333,7 +333,7 @@ func (r *rethinkdnslocal) blockQuery(msg *dns.Msg) (blocklists string, err error
333333
return
334334
}
335335

336-
func (r *rethinkdnslocal) blockAnswer(msg *dns.Msg) (blocklists string, err error) {
336+
func (r *rethinkdnslocal) blockAnswer(msg *dns.Msg) (blockedtarget, blocklists string, err error) {
337337
if msg == nil {
338338
err = errNoAnswer
339339
return
@@ -384,6 +384,7 @@ func (r *rethinkdnslocal) blockAnswer(msg *dns.Msg) (blocklists string, err erro
384384
target, _ = xdns.NormalizeQName(target)
385385
block, lists := r.ftrie.DNlookup(target, stamp)
386386
if block { // TODO: handle empty lists as err?
387+
blockedtarget = target
387388
blocklists = strings.Join(r.keyToNames(lists), ",")
388389
return
389390
}

intra/dnsx/transport.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,7 @@ func (r *resolver) forward(q []byte, uid string, chosenids ...string) (res0 []by
510510
qtyp := qtype(msg)
511511
ogsmm.QName = qname
512512
ogsmm.QType = qtyp
513+
ogsmm.Targets = qname
513514

514515
if len(qname) <= 0 { // unexpected; github.com/celzero/rethink-app/issues/1210
515516
ogsmm.Latency = time.Since(starttime).Seconds()
@@ -629,14 +630,17 @@ runagain:
629630
return res2, smm.ID, err
630631
}
631632

632-
ans2, blocklistnames := r.blockA(t, t2, msg, nonalg, smm.Blocklists)
633+
smm.Targets = xdns.GetTargets(ans1)
634+
635+
ans2, blockedtarget, blocklistnames := r.blockA(t, t2, msg, nonalg, smm.Blocklists)
633636

634637
isnewans := ans2 != nil
635638
hasblocklists := len(blocklistnames) > 0
636639
hasmsg := len(smm.Msg) > 0
637640

638641
if hasblocklists { // blocklists added even if pref.NOBLOCK is set
639642
smm.Blocklists = blocklistnames
643+
smm.BlockedTarget = blockedtarget
640644
}
641645
if !hasmsg {
642646
smm.Msg = errNop.Error() // no error

intra/dnsx/wall.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func applyBlocklists(b RDNS, q *dns.Msg) (ans *dns.Msg, blocklists string, err e
147147
// If blocklistStamp is empty, it resolves the answer to blocklist names, if blocked by local blocklists.
148148
// If blocklistStamp is empty and the answer is not blocked by local blocklists, it returns nil.
149149
// If blocklistStamp is empty and the answer is blocked by local blocklists, it returns a refused response.
150-
func (r *resolver) blockA(t, t2 Transport, q, ans *dns.Msg, blocklistStamp string) (finalans *dns.Msg, blocklistNames string) {
150+
func (r *resolver) blockA(t, t2 Transport, q, ans *dns.Msg, blocklistStamp string) (finalans *dns.Msg, blockedtarget, blocklistNames string) {
151151
br := r.getRdnsRemote()
152152
b := r.getRdnsLocal()
153153

@@ -185,7 +185,7 @@ func (r *resolver) blockA(t, t2 Transport, q, ans *dns.Msg, blocklistStamp strin
185185
return
186186
}
187187

188-
if blocklistNames, err = b.blockAnswer(ans); err != nil {
188+
if blockedtarget, blocklistNames, err = b.blockAnswer(ans); err != nil {
189189
if settings.Debug {
190190
log.D("wall: answer for %s not blocked %v", qname, err)
191191
}

intra/xdns/dnsutil.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,31 @@ func RTtl(msg *dns.Msg) int {
217217
return int(maxttl)
218218
}
219219

220+
func GetTargets(msg *dns.Msg) string {
221+
if msg == nil {
222+
return "--"
223+
}
224+
225+
if !msg.Response {
226+
return QName(msg)
227+
}
228+
229+
targets := make(map[string]struct{}, len(msg.Answer))
230+
for _, a := range msg.Answer {
231+
nom := a.Header().Name
232+
if len(nom) > 0 {
233+
targets[nom] = struct{}{}
234+
}
235+
}
236+
var sb strings.Builder
237+
sb.Grow(len(targets))
238+
for k := range targets {
239+
sb.WriteString(k)
240+
sb.WriteString(",")
241+
}
242+
return strings.TrimSuffix(sb.String(), ",")
243+
}
244+
220245
func GetInterestingRData(msg *dns.Msg) string {
221246
if msg == nil {
222247
return "--"

0 commit comments

Comments
 (0)