ฉันกำลังพยายามค้นหา QPS (Query Per Second) สูงสุดของ DNS Resolver VM
เรามีโครงสร้างพื้นฐานของเราที่โฮสต์บน Azure โดยมี VM (ตามการผูก) ทำหน้าที่เป็นตัวแก้ไขการสืบค้น DNS เนทีฟของ Azure (168.63.129.16
) เช่นเดียวกับ DNS ภายในองค์กร ฉันไม่ได้แคชแบบสอบถามใด ๆ บนตัวแก้ไข & บันทึก A แต่ละรายการมี TTL 300 วินาที
ฉันกำลังใช้ dnsperf
& ตอบกลับ
เพื่อทริกเกอร์โหลด (เฉพาะ A-records) ตอนนี้ฉันกำลังเตรียมตัวแก้ไข DNS เพื่อต้านทานการโจมตี DDOS สูงถึง 100,000 QPS ฉันประสบปัญหาเช่นการจำกัดอัตราการสืบค้นระหว่างตัวแก้ไขและตัวแก้ไข DNS เนทีฟสีฟ้า ด้วยเหตุนี้ เมื่อ QPS เพิ่มขึ้น ตัวแก้ไขจะส่งกลับ SERVFAIL
ตอบกลับไปยังลูกค้า อย่างไรก็ตาม เราไม่เห็นอะไรเลย SERVFAIL
การตอบสนองระหว่างตัวแก้ไขและ DNS ในสถานที่
QPS สูงสุดที่ฉันเห็นในขณะที่กำหนดเป้าหมาย Azure DNS อยู่ที่ประมาณ 2100 ฉันค้นหาทางออนไลน์เป็นจำนวนมากว่า Azure มีการจำกัดอัตราดังกล่าวหรือไม่ แต่ไม่พบสิ่งที่เกี่ยวข้อง ยังไงก็ตาม ฉันลางสังหรณ์ VM ประสบปัญหาคอขวดเนื่องจาก 2K QPS นั้นต่ำมากสำหรับโครงสร้างพื้นฐานของ Azure
บางสิ่ง (การเปลี่ยนแปลงเคอร์เนล sysctl) ฉันเปลี่ยนในตอนท้ายซึ่งปรับปรุงเล็กน้อย แต่ไม่มาก
การเปลี่ยนแปลง Config ของ Bind ::
ลูกค้าเรียกซ้ำ
จาก 1000
-> 30000
บัฟเฟอร์ UDP เป็นค่าที่สูงกว่า 26214400
เพื่อหยุดความล้มเหลวของบัฟเฟอร์::
net.core.rmem_max
net.core.rmem_default
ช่วงพอร์ตท้องถิ่นจาก 32768 61000
ถึง 1024 61000
ให้มีสูงสุด
พอร์ตสำหรับ DNS::
net.ipv4.ip_local_port_range
การเปลี่ยนแปลงเบ็ดเตล็ด::
txqueuelen
จาก 1000
-> 20000
ขีด จำกัด
เปลี่ยนเป็น 100,000
net.netfilter.nf_conntrack_max
เปลี่ยนเป็นมูลค่าที่สูงขึ้นมาก
นอกเหนือจากข้างต้น ฉันได้เพิ่มขนาด VM จาก (1 คอร์, 2 GB RAM) -> (4 คอร์, 8 GB RAM)หลังจากเพิ่มขึ้น ข้อผิดพลาดของแพ็กเก็ตก็หายไป (ตรวจสอบแล้ว netstat -s
) แต่ไม่ดีขึ้น SERVFAIL
ข้อผิดพลาด
ฉันเปิดใช้งานแล้ว tcpdump
เพื่อตรวจสอบรูปแบบของ SERVFAIL
ข้อผิดพลาด ในกรณีที่เกิดความล้มเหลว ตัวแก้ไขจะพยายามส่งแบบสอบถามไปยัง Azure DNS 5 ครั้ง (แต่ละครั้งหลังจาก 1 วินาที) แต่ไม่ได้ยินอะไรเลยจาก DNS ของ Azure และด้วยเหตุนี้จึงส่ง SERVFAIL
ตอบกลับไปยังลูกค้า โหลดมาแล้ว พีซีแคป
ไฟล์ลงบน ไวร์ชาร์ค
ฉันเห็น Azure DNS ส่งการตอบกลับกลับไป ตัวแก้ไข
แต่ ตัวแก้ไข
ได้ส่งของแล้ว SERVFAIL
ตอบสนองต่อลูกค้า
เหตุใดการเชื่อมต่อจึงปิดก่อนที่จะมีการตอบกลับ ปัจจุบัน net.netfilter.nf_conntrack_udp_timeout
ถูกทิ้งไว้โดยไม่มีใครแตะต้อง 30
วินาที แต่ ตัวแก้ไข
ส่ง SERVFAIL
หลังจาก 5 วินาทีถึงลูกค้า
ด้านล่างนี้คือ tcpdump
บันทึกระหว่าง เซิร์ฟเวอร์ล้มเหลว
::
อ่านจากไฟล์ dns4.pcap ประเภทลิงก์ 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 อาร์: . OPT UDPsize=4096 DO (77)
10.0.0.11.32378 > 168.63.129.16.domain: [udp cksum 0xbecd ไม่ถูกต้อง -> 0x3950!] 20672+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net อาร์: . OPT UDPsize=512 DO (77)
10.0.0.11.59973 > 168.63.129.16.domain: [udp cksum 0xbecd ไม่ถูกต้อง -> 0xe2e5!] 15199+% [1au] A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net อาร์: . OPT UDPsize=512 DO (77)
10.0.0.11.29976 > 168.63.129.16.domain: [udp cksum 0xbec2 ไม่ถูกต้อง -> 0x051b!] 47104+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net (66)
10.0.0.11.43442 > 168.63.129.16.domain: [udp cksum 0xbec2 ไม่ถูกต้อง -> 0xe791!] 41199+ A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net (66)
10.0.0.11.domain > 10.0.0.10.57710: [udp cksum 0x2a89 ไม่ถูกต้อง -> 0x5e30!] 1612 ServFail q: A? SZxvvdyDYy.ns.westeurope.xx.yy.zz.net 0/0/0 (66)
ดังที่คุณเห็นจากบรรทัดล่างสุด เซิร์ฟเวอร์ล้มเหลว
ถูกส่งหลังจากพยายาม 5 ครั้ง
ถ้ามาถึงขั้นนี้แล้ว ผมต้องขอขอบคุณที่อ่านคำถามยาวนี้ ฉันรู้ว่านี่เป็นการถามมากเกินไป แต่ฉันขอขอบคุณหากคุณมีคำแนะนำให้ฉันเพราะฉันไม่รู้ว่าอะไรคือปัญหาคอขวด
โพสต์ครั้งแรกที่ superuser ที่นี่