From c24288b8725a982f21443825afbc3f095c7ddf3c Mon Sep 17 00:00:00 2001 From: Remi Gacogne Date: Wed, 14 Jun 2017 13:31:18 +0200 Subject: [PATCH] rec: Use the incoming ECS for cache lookup if `use-incoming-edns-subnet` is set Otherwise we insert into the cache based on the incoming ECS but later do the lookup based on the query's source IP. (cherry picked from commit 5736e55e0d2d8cd9a064b8377e87d08a540cb1b1) --- pdns/pdns_recursor.cc | 1 + pdns/syncres.cc | 10 +++++----- pdns/syncres.hh | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pdns/pdns_recursor.cc b/pdns/pdns_recursor.cc index 4890056ea..ef523a010 100644 --- a/pdns/pdns_recursor.cc +++ b/pdns/pdns_recursor.cc @@ -776,6 +776,7 @@ void startDoResolve(void *p) sr.d_incomingECSFound = dc->d_ecsFound; if (dc->d_ecsFound) { sr.d_incomingECS = dc->d_ednssubnet; + sr.d_incomingECSNetwork = sr.d_incomingECS ? sr.d_incomingECS->source.getMaskedNetwork() : ComboAddress(); } } diff --git a/pdns/syncres.cc b/pdns/syncres.cc index 63c473216..653c17682 100644 --- a/pdns/syncres.cc +++ b/pdns/syncres.cc @@ -541,7 +541,7 @@ vector SyncRes::getAddrs(const DNSName &qname, unsigned int depth, if(done) { if(j==1 && s_doIPv6) { // we got an A record, see if we have some AAAA lying around vector cset; - if(t_RC->get(d_now.tv_sec, qname, QType(QType::AAAA), &cset, d_requestor) > 0) { + if(t_RC->get(d_now.tv_sec, qname, QType(QType::AAAA), &cset, d_incomingECSFound ? d_incomingECSNetwork : d_requestor) > 0) { for(auto k=cset.cbegin();k!=cset.cend();++k) { if(k->d_ttl > (unsigned int)d_now.tv_sec ) { if (auto drc = std::dynamic_pointer_cast(k->d_content)) { @@ -592,7 +592,7 @@ void SyncRes::getBestNSFromCache(const DNSName &qname, const QType& qtype, vecto LOG(prefix< ns; *flawedNSSet = false; - if(t_RC->get(d_now.tv_sec, subdomain, QType(QType::NS), &ns, d_requestor) > 0) { + if(t_RC->get(d_now.tv_sec, subdomain, QType(QType::NS), &ns, d_incomingECSFound ? d_incomingECSNetwork : d_requestor) > 0) { for(auto k=ns.cbegin();k!=ns.cend(); ++k) { if(k->d_ttl > (unsigned int)d_now.tv_sec ) { vector aset; @@ -600,7 +600,7 @@ void SyncRes::getBestNSFromCache(const DNSName &qname, const QType& qtype, vecto const DNSRecord& dr=*k; auto nrr = getRR(dr); if(nrr && (!nrr->getNS().isPartOf(subdomain) || t_RC->get(d_now.tv_sec, nrr->getNS(), s_doIPv6 ? QType(QType::ADDR) : QType(QType::A), - doLog() ? &aset : 0, d_requestor) > 5)) { + doLog() ? &aset : 0, d_incomingECSFound ? d_incomingECSNetwork : d_requestor) > 5)) { bestns.push_back(dr); LOG(prefix< '"<getNS()<<"'"<getNS().isPartOf(subdomain)); @@ -713,7 +713,7 @@ bool SyncRes::doCNAMECacheCheck(const DNSName &qname, const QType &qtype, vector LOG(prefix< cset; vector> signatures; - if(t_RC->get(d_now.tv_sec, qname,QType(QType::CNAME), &cset, d_requestor, &signatures, &d_wasVariable) > 0) { + if(t_RC->get(d_now.tv_sec, qname,QType(QType::CNAME), &cset, d_incomingECSFound ? d_incomingECSNetwork : d_requestor, &signatures, &d_wasVariable) > 0) { for(auto j=cset.cbegin() ; j != cset.cend() ; ++j) { if(j->d_ttl>(unsigned int) d_now.tv_sec) { @@ -842,7 +842,7 @@ bool SyncRes::doCacheCheck(const DNSName &qname, const QType &qtype, vector> signatures; uint32_t ttl=0; - if(t_RC->get(d_now.tv_sec, sqname, sqt, &cset, d_requestor, d_doDNSSEC ? &signatures : 0, &d_wasVariable) > 0) { + if(t_RC->get(d_now.tv_sec, sqname, sqt, &cset, d_incomingECSFound ? d_incomingECSNetwork : d_requestor, d_doDNSSEC ? &signatures : 0, &d_wasVariable) > 0) { LOG(prefix<d_content->getZoneRepresentation()); diff --git a/pdns/syncres.hh b/pdns/syncres.hh index fdb0867f1..26b2a9ccc 100644 --- a/pdns/syncres.hh +++ b/pdns/syncres.hh @@ -353,7 +353,6 @@ public: } int asyncresolveWrapper(const ComboAddress& ip, bool ednsMANDATORY, const DNSName& domain, int type, bool doTCP, bool sendRDQuery, struct timeval* now, boost::optional& srcmask, LWResult* res); - static void doEDNSDumpAndClose(int fd); static std::atomic s_queries; @@ -374,6 +373,7 @@ public: std::unordered_map d_discardedPolicies; DNSFilterEngine::Policy d_appliedPolicy; boost::optional d_incomingECS; + ComboAddress d_incomingECSNetwork; #ifdef HAVE_PROTOBUF boost::optional d_initialRequestId; #endif -- 2.40.0