De plus, à cette époque, les attaques DDoS basées sur les DNS étaient vraiment courantes. Et gérer vos propres serveurs DNS pouvait rapidement devenir difficile car ils sont souvent la cible d’attaques.
Les protections DDoS sont assez coûteuses, et si vous ne disposez pas de systèmes de protection ou de solutions de surveillance et de logging suffisantes pour mettre en œuvre automatiquement la limitation de débit ou le bannissement d’IP avec des outils tels que dnsdist ou Crowdsec (oui, fail2ban est officiellement mort), vous pouvez rapidement rencontrer des problèmes…
C’est une des raisons pour lesquelles nous avons décidé d’héberger ces serveurs PowerDNS en dehors de notre réseau chez un fournisseur de cloud public avec une protection DDoS.
Plus tard, une instance dnsdist a été mise en place au dessus de PowerDNS pour limiter le débit et éviter trop de problèmes, cela s’est avéré efficace. Très efficace même, croyez-moi.
Voici un exemple de configuration dnsdist que nous avons utilisé :
-- tuning
setMaxUDPOutstanding(65000)
controlSocket('127.0.0.1:5199')
setKey("sup3rm4g4s3cur3k3y")
-- we should create as much addLocal() as we have CPU for intense workloads
addLocal('<our_public_ip>:53', {doTCP=true, reusePort=true})
-- allow all to recurse us
setACL("0.0.0.0/0")
newServer{address="<pdns_1_ip>", qps=10000, name="pdns-1", useClientSubnet=true, checkType="A", checkName="www.numberly.com.", mustResolve=true}
newServer{address="<pdns_2_ip>", qps=10000, name="pdns-2", useClientSubnet=true, checkType="A", checkName="www.numberly.com.", mustResolve=true}
setServerPolicy(roundrobin)
-- Drop ANY queries
addAction(QTypeRule(dnsdist.ANY), DropAction())
-- Apply Rate Limit for NXDomain and ServFail queries
local dbr = dynBlockRulesGroup()
dbr:setRCodeRate(dnsdist.NXDOMAIN, 5, 10, "Exceeded NXD rate", 60, DNSAction.Drop)
dbr:setRCodeRate(dnsdist.SERVFAIL, 5, 10, "Exceeded ServFail rate", 60, DNSAction.Drop)
dbr:excludeRange({"127.0.0.1/32", "10.0.0.0/8" })
function maintenance()
dbr:apply()
end
Quelques années plus tard, avec l’utilisation croissante de Kubernetes chez Numberly, nous avons dû connecter Kubernetes à PowerDNS afin de permettre à nos développeurs d’exposer leurs applications Web directement à partir de leur configuration de déploiements Kubernetes.
Mais l’un des inconvénients de l’API de PowerDNS est qu’elle n’est pas multi-tenant, PowerDNS vous donne une clé d’API unique.