From: Remi Gacogne Date: Wed, 20 Jul 2016 13:59:49 +0000 (+0200) Subject: auth: Trust EDNS Client Subnet from a trusted notification proxy X-Git-Tag: auth-4.0.1~13^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a94fe494fb28b1bed101404977eff53fd90bccc3;p=thirdparty%2Fpdns.git auth: Trust EDNS Client Subnet from a trusted notification proxy This allows for example the use of dnsdist in front of supermaster slaves. dnsdist must be configured to send ECS to the backend with: * `useClientSubnet=true` on the corresponding `newServer()` * `setECSSourcePrefixV4(32)` and/or `setECSSourcePrefixV6(128)` so the exact source is sent to the slave * `setECSOverride(true)` so that any existing ECS information is overridden In addition, pdns must be configured to accept notification from dnsdist with `trusted-notification-proxy` and to process ECS with `edns-subnet-processing=yes`. --- diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index e85421fb3b..90a66d2790 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -759,15 +759,20 @@ int PacketHandler::trySuperMaster(DNSPacket *p, const DNSName& tsigkeyname) int PacketHandler::trySuperMasterSynchronous(DNSPacket *p, const DNSName& tsigkeyname) { + string remote = p->getRemote().toString(); + if(p->hasEDNSSubnet() && ::arg().contains("trusted-notification-proxy", remote)) { + remote = p->getRealRemote().toStringNoMask(); + } + Resolver::res_t nsset; try { Resolver resolver; uint32_t theirserial; - resolver.getSoaSerial(p->getRemote().toString(),p->qdomain, &theirserial); - resolver.resolve(p->getRemote().toString(), p->qdomain, QType::NS, &nsset); + resolver.getSoaSerial(remote,p->qdomain, &theirserial); + resolver.resolve(remote, p->qdomain, QType::NS, &nsset); } catch(ResolverException &re) { - L<qdomain<<" at: "<< p->getRemote() <<": "<qdomain<<" at: "<< remote <<": "<qdomain<<" at: "<< p->getRemote()<qdomain<<" at: "<< remote <qdomain<<" from potential supermaster "<getRemote()<<". Refusing."<qdomain<<" from potential supermaster "<getRemote().toString(), p->qdomain, nsset, &nameserver, &account, &db)) { - L<qdomain<<" for potential supermaster "<getRemote()<<". Remote nameservers: "<qdomain, nsset, &nameserver, &account, &db)) { + L<qdomain<<" for potential supermaster "<qdomain<<" for potential supermaster "<getRemote()<<": "<qdomain<<" for potential supermaster "<qdomain<<"' from supermaster "<getRemote()<qdomain<<"' from supermaster "<