
Ich versuche, die maximale Anzahl an QPS (Abfragen pro Sekunde) der DNS-Resolver-VM zu ermitteln.
Unsere Infrastruktur wird auf Azure gehostet, wobei eine VM (Bind-basiert) als Resolver fungiert und sowohl Azure-native DNS ( 168.63.129.16
) als auch lokale DNS abfragt. Ich speichere keine Abfragen auf dem Resolver im Cache und jeder A-Eintrag hat eine TTL von 300 Sekunden.
Ich verwende dnsperf
&, resperf
um die Ladung auszulösen (nur A-Einträge). Jetzt bereite ich DNS-Resolver vor, um DDOS-Angriffen von bis zu 100.000 QPS standzuhalten. Ich habe Probleme wie die Begrenzung der Abfragerate zwischen meinem Resolver und dem nativen Azure-DNS-Resolver. Wenn QPS erhöht wird, gibt der Resolver daher Antworten an den Client zurück. Wir haben jedoch keine Antworten zwischen Resolver und DNS vor Ort SERVFAIL
gesehen .SERVFAIL
Die maximale QPS, die ich beim Targeting von Azure DNS sehen konnte, liegt bei etwa 2100. Ich habe viel online gesucht, ob Azure eine solche Ratenbegrenzung vornimmt, konnte aber nichts Entsprechendes finden. Irgendwie habe ich das Gefühl, dass die Resolver-VM einen Engpass hat, da 2K QPS für die Größe der Azure-Infrastruktur sehr wenig ist.
Ich habe ein paar Dinge (Änderungen am Kernel-Sysctl) bei mir geändert, was eine leichte, aber keine große Verbesserung gebracht hat.
Änderungen an der Bind-Konfiguration ::
recursive-clients
von1000
->30000
UDP-Puffern auf einen höheren Wert als
26214400
um Pufferfehler zu verhindern::
net.core.rmem_max
net.core.rmem_default
Lokaler Portbereich von
32768 61000
bis,1024 61000
um die maximale Anzahl an Ports für DNS verfügbar zu haben::
net.ipv4.ip_local_port_range
diverse Änderungen:
txqueuelen
von1000
->20000
ulimits
geändert auf 100000net.netfilter.nf_conntrack_max
auf einen viel höheren Wert geändert
Zusätzlich zu dem oben genannten habe ich die VM-Größe von (1 Kern, 2 GB RAM) -> (4 Kerne, 8 GB RAM) erhöht. Nach der Erhöhung verschwanden die Paketfehler (überprüft netstat -s
), die Fehler wurden jedoch nicht verbessert SERVFAIL
.
Ich habe es aktiviert, tcpdump
um das Fehlermuster zu überprüfen SERVFAIL
. Im Fehlerfall versucht der Resolver 5 Mal (jeweils nach 1 Sekunde), die Abfrage an Azure DNS zu senden, hat aber nichts von Azure DNS gehört und sendet die Antwort daher an den Client zurück. Nachdem ich die Datei auf SERVFAIL
geladen habe , sehe ich, dass Azure DNS die Antwort an zurücksendet, die Antwort aber bereits an den Client gesendet hat .pcap
Wireshark
resolver
resolver
SERVFAIL
Warum wird die Verbindung geschlossen, bevor die Antwort eingeht? Die aktuelle Verbindung net.netfilter.nf_conntrack_udp_timeout
bleibt 30
einige Sekunden lang unberührt, wird aber nach 5 Sekunden an den Client resolver
gesendet .SERVFAIL
Nachfolgend finden Sie tcpdump
Protokolle während ServFail
::
reading from file dns4.pcap, link-type 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)
Wie Sie unten sehen können, ServFail
wird die Zeile nach 5 Versuchen gesendet.
Wenn Sie es bis hierher geschafft haben, muss ich Ihnen dafür danken, dass Sie diese lange Frage gelesen haben. Ich weiß, dass das zu viel verlangt ist, aber ich würde mich freuen, wenn Sie mir ein paar Hinweise geben könnten, da ich nicht weiß, wo der Engpass liegt.
Ursprünglich gepostet auf SuperuserHier
Antwort1
Also werde ich meine Frage beantworten.
Tatsächlich begrenzt Azure die Abfragerate pro Sekunde auf 1000
pro VM.
Es ist dokumentiertHier. Egal welche sysctl
Optimierung ich vornehme, wir haben aufgrund dieser Ratenbegrenzung immer noch Probleme mit Azure.