Încerc să găsesc QPS (Interogare pe secundă) maximă a VM-ului DNS Resolver.
Avem infrastructura noastră găzduită pe Azure, având o VM (bazată pe legare) care acționează ca un rezolutor care interogează DNS nativ Azure (168.63.129.16
), precum și DNS local. Nu memorez în cache nicio interogare pe resolver și fiecare înregistrare A are un TTL de 300 de secunde.
eu folosesc dnsperf
& respect
pentru a declanșa sarcina (doar înregistrări A). Acum, că pregătesc soluții DNS pentru a rezista atacurilor DDOS de până la 100K QPS. Mă confrunt cu probleme precum limitarea ratei de interogare între soluția mea și soluția DNS nativă azure. Ca rezultat, atunci când QPS este crescut, rezolutorul revine SERVFAIL
răspunsurile înapoi către client. Cu toate acestea, nu am văzut niciunul SERVFAIL
răspunsuri între soluție și DNS bazat pe site.
QPS maxim, am putut vedea în timp ce țintesc Azure DNS este în jur de 2100. Am căutat mult online dacă există o astfel de limitare a ratei făcută de Azure, dar nu am găsit nimic legat. Cumva, cred că VM-ul soluționar a lovit un blocaj, deoarece 2K QPS este foarte scăzut pentru scara infrastructurii Azure.
Câteva lucruri (modificări kernel sysctl), le-am schimbat la sfârșitul meu, ceea ce s-a îmbunătățit puțin, dar nu mult.
Modificări Bind Config ::
recursive-clienți
din 1000
-> 30000
UDP tamponează la o valoare mai mare decât 26214400
pentru a opri erorile de buffer::
net.core.rmem_max
net.core.rmem_default
Gama portului local de la 32768 61000
la 1024 61000
a avea maxim
porturi disponibile pentru DNS::
net.ipv4.ip_local_port_range
diverse modificari::
txqueuelen
din 1000
-> 20000
ulimite
schimbat la 100000
net.netfilter.nf_conntrack_max
schimbat la o valoare mult mai mare
Pe lângă cele de mai sus, am mărit dimensiunea VM de la (1 nucleu, 2 GB RAM) -> (4 nuclee, 8 GB RAM).După creștere, erorile de pachete au dispărut (verificat netstat -s
) dar nu s-a îmbunătățit SERVFAIL
erori.
Am activat tcpdump
pentru a verifica tiparul de SERVFAIL
erori. În caz de eșecuri, soluția încearcă să trimită interogarea către Azure DNS de 5 ori (fiecare după 1 secundă), dar nu a auzit nimic de la Azure DNS și, prin urmare, trimite SERVFAIL
răspuns înapoi către client. După ce a încărcat pcap
dosar pe Wireshark
, văd că Azure DNS trimite răspunsul înapoi către rezolutor
dar rezolutor
trimisese deja SERVFAIL
răspuns la client.
De ce conexiunea este închisă înainte de a primi răspunsul? Actual net.netfilter.nf_conntrack_udp_timeout
este lăsat neatins să 30
secunde dar rezolutor
trimite SERVFAIL
după 5 secunde către client.
Mai jos sunt tcpdump
busteni în timpul ServFail
::
citire din fișierul dns4.pcap, tip link EN10MB (Ethernet)
10.0.0.10.57710 > 10.0.0.11.domain: [udp sum ok] 1612+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.44513 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0x8cfd!] 52637+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=4096 DO (77)
10.0.0.11.32378 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0x3950!] 20672+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=512 DO (77)
10.0.0.11.59973 > 168.63.129.16.domain: [bad udp cksum 0xbecd -> 0xe2e5!] 15199+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. ar: . OPT UDPsize=512 DO (77)
10.0.0.11.29976 > 168.63.129.16.domain: [bad udp cksum 0xbec2 -> 0x051b!] 47104+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.43442 > 168.63.129.16.domain: [bad udp cksum 0xbec2 -> 0xe791!] 41199+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. (66)
10.0.0.11.domain > 10.0.0.10.57710: [bad udp cksum 0x2a89 -> 0x5e30!] 1612 ServFail q: A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net. 0/0/0 (66)
După cum puteți vedea din linia de jos ServFail
este trimis după 5 încercări.
Dacă ați ajuns până aici, trebuie să vă mulțumesc pentru că ați citit această întrebare lungă. Știu că este o întrebare prea mare, dar apreciez dacă aveți câteva indicii pentru mine, deoarece nu reușesc să înțeleg care este blocajul.
Postat inițial pe superutilizator Aici