Skip to content

Commit

Permalink
dnsforward: imp code
Browse files Browse the repository at this point in the history
  • Loading branch information
Mizzick committed Dec 8, 2023
1 parent 8dedb4a commit e941f5e
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 39 deletions.
33 changes: 1 addition & 32 deletions internal/dnsforward/filter.go
Expand Up @@ -95,7 +95,7 @@ func (s *Server) filterDNSRequest(dctx *dnsContext) (res *filtering.Result, err
dctx.origQuestion = q
req.Question[0].Name = dns.Fqdn(res.CanonName)
case res.Reason == filtering.Rewritten:
pctx.Res = s.filterRewritten(req, host, res, q.Qtype)
pctx.Res = s.getCNAMEWithIPs(req, res.IPList, res.CanonName)
case res.Reason.In(filtering.RewrittenRule, filtering.RewrittenAutoHosts):
if err = s.filterDNSRewrite(req, res, pctx); err != nil {
return nil, err
Expand All @@ -105,37 +105,6 @@ func (s *Server) filterDNSRequest(dctx *dnsContext) (res *filtering.Result, err
return res, err
}

// filterRewritten handles DNS rewrite filters. It returns a DNS response with
// the data from the filtering result. All parameters must not be nil.
func (s *Server) filterRewritten(
req *dns.Msg,
host string,
res *filtering.Result,
qt uint16,
) (resp *dns.Msg) {
resp = s.makeResponse(req)
name := host
if len(res.CanonName) != 0 {
resp.Answer = append(resp.Answer, s.genAnswerCNAME(req, res.CanonName))
name = res.CanonName
}

for _, ip := range res.IPList {
switch qt {
case dns.TypeA:
a := s.genAnswerA(req, ip)
a.Hdr.Name = dns.Fqdn(name)
resp.Answer = append(resp.Answer, a)
case dns.TypeAAAA:
a := s.genAnswerAAAA(req, ip)
a.Hdr.Name = dns.Fqdn(name)
resp.Answer = append(resp.Answer, a)
}
}

return resp
}

// checkHostRules checks the host against filters. It is safe for concurrent
// use.
func (s *Server) checkHostRules(
Expand Down
14 changes: 7 additions & 7 deletions internal/dnsforward/msg.go
Expand Up @@ -66,15 +66,17 @@ func (s *Server) genDNSFilterMessage(
// If Safe Search generated the necessary IP addresses, use them.
// Otherwise, if there were no errors, there are no addresses for the
// requested IP version, so produce a NODATA response.
return s.genFltSafeSearch(req, ipsFromRules(res.Rules), res.CanonName)
return s.getCNAMEWithIPs(req, ipsFromRules(res.Rules), res.CanonName)
default:
return s.genForBlockingMode(req, ipsFromRules(res.Rules))
}
}

// genFltSafeSearch generates a filtered response to req for safe search filter.
// Adds a CNAME record if cname if provided.
func (s *Server) genFltSafeSearch(req *dns.Msg, ips []netip.Addr, cname string) (resp *dns.Msg) {
// getCNAMEWithIPs generates a filtered response to req for with CNAME record
// and provided ips.
func (s *Server) getCNAMEWithIPs(req *dns.Msg, ips []netip.Addr, cname string) (resp *dns.Msg) {
resp = s.makeResponse(req)

originalName := req.Question[0].Name

var ans []dns.RR
Expand All @@ -83,6 +85,7 @@ func (s *Server) genFltSafeSearch(req *dns.Msg, ips []netip.Addr, cname string)

// The given IPs actually are resolved for this cname.
req.Question[0].Name = dns.Fqdn(cname)
defer func() { req.Question[0].Name = originalName }()
}

switch req.Question[0].Qtype {
Expand All @@ -98,9 +101,6 @@ func (s *Server) genFltSafeSearch(req *dns.Msg, ips []netip.Addr, cname string)
// Go on and return an empty response.
}

req.Question[0].Name = originalName

resp = s.makeResponse(req)
resp.Answer = ans

return resp
Expand Down

0 comments on commit e941f5e

Please sign in to comment.