น้ำท่วมเป็นวิธีที่ง่ายที่สุดและพบได้บ่อยที่สุดในการโจมตี DDoS การปกป้องเซิร์ฟเวอร์ Linux จากการฟลัด SYN: พื้นฐานและวิธีการ หากสิ่งอื่นล้มเหลว
การโจมตีแบบ syn-flood - ฝึกฝน
อเล็กซานเดอร์ อันติปอฟ
ผู้ให้บริการบางราย (และเมื่อเวลาผ่านไป ยิ่งปรากฏมากขึ้น) กรองการรับส่งข้อมูลของลูกค้าเพื่อปลอมแปลงที่อยู่ของผู้ส่ง มีความเป็นไปได้สูงที่ความเป็นไปได้ของการปลอมแปลงจะจำกัดอยู่ที่ซับเน็ตคลาส C นอกจากนี้ โฮสต์ที่ระบุที่อยู่ไว้ในคำขอเชื่อมต่อไม่ควรตอบสนองต่อการตอบสนองของเซิร์ฟเวอร์ - วิธีที่ง่ายที่สุดคือการเลือกที่อยู่ที่ไม่มี เครื่องจักร. ในการใช้งานจริง โดยเฉพาะอย่างยิ่งเมื่อสร้างเครื่องมือสากลสำหรับการโจมตีแบบประสานงาน คุณต้องคำนึงถึงคุณสมบัติทั้งสองนี้และดำเนินการโจมตีจากเครือข่ายย่อยของคุณและจากที่อยู่ที่ไม่ตอบสนองเท่านั้น ปัญหาอีกประการหนึ่งคือคุณต้องมีสิทธิ์ของผู้ดูแลระบบจึงจะสามารถโจมตีได้
ปัญหาที่อยู่นอกเหนือการควบคุมของผู้โจมตี
ผู้ให้บริการบางราย (และเมื่อเวลาผ่านไป ยิ่งปรากฏมากขึ้น) กรองการรับส่งข้อมูลของลูกค้าเพื่อปลอมแปลงที่อยู่ของผู้ส่ง มีความเป็นไปได้สูงที่ความเป็นไปได้ของการปลอมแปลงจะจำกัดอยู่ที่ซับเน็ตคลาส C นอกจากนี้ โฮสต์ที่ระบุที่อยู่ไว้ในคำขอเชื่อมต่อไม่ควรตอบสนองต่อการตอบสนองของเซิร์ฟเวอร์ - วิธีที่ง่ายที่สุดคือการเลือกที่อยู่ที่ไม่มี เครื่องจักร. ในการใช้งานจริง โดยเฉพาะอย่างยิ่งเมื่อสร้างเครื่องมือสากลสำหรับการโจมตีแบบประสานงาน คุณต้องคำนึงถึงคุณสมบัติทั้งสองนี้และดำเนินการโจมตีจากเครือข่ายย่อยของคุณและจากที่อยู่ที่ไม่ตอบสนองเท่านั้น ปัญหาอีกประการหนึ่งคือคุณต้องมีสิทธิ์ของผู้ดูแลระบบจึงจะสามารถโจมตีได้การใช้งานซอฟต์แวร์
เหมาะสำหรับการใช้งานบนแพลตฟอร์มทั้ง Unix และ Windows โปรแกรมจะต้องรันด้วยสิทธิ์รูทและผู้ดูแลระบบตามลำดับ ภายใต้ Unix มีการใช้งานสำเร็จรูปมากมาย เช่น sync4.c (ค้นหาด้วยเครื่องมือค้นหา) การใช้งานที่เชี่ยวชาญเฉพาะสำหรับการโจมตี DDoS แบบประสานงานนั้นหาได้ยากกว่า แต่ด้วยทักษะการเขียนโปรแกรมขั้นต่ำ คุณสามารถแก้ไขการโจมตีที่มีอยู่หรือสร้างขึ้นเองได้นอกเหนือจากซ็อกเก็ตดิบมาตรฐานแล้ว D0minat0r จาก Nerf ยังพบวิธีที่สวยงามมากในการใช้งาน SYN Flood บน Linux แต่ยังไม่ได้รับการทดสอบบนซ็อกเก็ตที่คล้าย Unix อื่นๆ และไม่สามารถใช้ได้กับ Win Linux อนุญาตให้รูทผูกซ็อกเก็ตกับที่อยู่ใดๆ รวมถึงที่อยู่ที่ไม่เป็นของโฮสต์ภายในเครื่อง หลังจากนี้ คุณสามารถเรียกเชื่อมต่อ () สำหรับซ็อกเก็ตนี้ และโฮสต์ภายในเครื่องจะส่งแพ็กเก็ต SYN จากที่อยู่ที่ซ็อกเก็ตนั้นอยู่ ถูกผูกไว้ หากซ็อกเก็ตอยู่ในโหมดไม่ปิดกั้นทันทีหลังจากเชื่อมต่อ () คุณสามารถเรียกปิด () และดำเนินการซ้ำได้
การใช้งาน Windows นั้นพบได้น้อยกว่าเนื่องจากมีความเชื่อผิด ๆ เกี่ยวกับความเป็นไปไม่ได้ในการสร้างแพ็คเกจดิบในระบบปฏิบัติการนี้ ในความเป็นจริง win98 รองรับซ็อกเก็ตระดับดิบจนถึงส่วนหัว IP และ win2k และ XP รองรับส่วนหัวด้วย (ตัวเลือก IP_HDRINCL) เช่น การดำเนินการโจมตีภายใต้ win2k และ XP นั้นแตกต่างจาก Unix เพียงไม่กี่บรรทัด การใช้งานที่เสร็จสมบูรณ์จากฉันซึ่งทดสอบบน win2k ครั้งหนึ่งบน www.nerf.ru แต่หลังจากเปลี่ยนโฮสติ้ง การออกจากกลุ่มนี้และฟอร์แมตก็หายไป หากใครยังมีอยู่โปรดติดต่อฉันแล้วฉันจะโพสต์ให้
กลไกการป้องกันระบบปฏิบัติการต่อ SYN-flood
ก) ความตึงมาตรฐาน การเชื่อมต่อแบบเปิดครึ่งหนึ่งจะถูกละทิ้งจากบัฟเฟอร์หลังจากผ่านไประยะหนึ่ง เมื่อบัฟเฟอร์หมด คำขอเชื่อมต่อไคลเอ็นต์จะส่งผ่านด้วยความน่าจะเป็น C1/C2 โดยที่ C1 คือจำนวนแพ็กเก็ต SYN จากไคลเอ็นต์ C2 คือจำนวนแพ็กเก็ต SYN จากคนอื่นๆ (รวมถึงผู้โจมตีด้วย) แม้ว่าจะมีโหลดในช่องของผู้โจมตี 6 แพ็กเก็ตต่อวินาที C1/C2 ก็อยู่ที่ประมาณ 1/100 กล่าวคือ บริการลดลง 99%
b) บัฟเฟอร์ไม่จำกัดสำหรับการเชื่อมต่อแบบครึ่งเปิด ด้วยโหลดบนแชนเนลของผู้โจมตีที่ 100 Mb/วินาที และหมดเวลาประมาณหนึ่งนาที คิวของการเชื่อมต่อแบบเปิดครึ่งหนึ่งจะใช้พื้นที่หน่วยความจำประมาณ 1 Gb ซึ่งไม่เป็นอันตรายถึงชีวิตสำหรับเซิร์ฟเวอร์ขนาดใหญ่ ผลข้างเคียง: เซิร์ฟเวอร์ที่ถูกโจมตีตอบสนองด้วยการรับส่งข้อมูลมากกว่าการรับส่งข้อมูลของผู้โจมตีถึง 3 เท่า (กล่าวคือ 4x DDoS) ซึ่งสามารถระบายแบนด์วิธของช่องสัญญาณได้ อย่างไรก็ตาม หากเป็นไปไม่ได้ที่จะทำให้ความกว้างของช่องสัญญาณหมดลง การป้องกันการโจมตีจะสมบูรณ์ และไม่มีการปฏิเสธการเชื่อมต่อไคลเอนต์แม้แต่ตัวเดียว
c) การทำความสะอาดการเชื่อมต่อแบบครึ่งเปิดที่เก่าแก่ที่สุด เมื่อบัฟเฟอร์ล้น การเชื่อมต่อครึ่งเปิดที่เก่าที่สุดจะถูกลบออกจากบัฟเฟอร์ ผลข้างเคียง: หากบัฟเฟอร์เต็มในเวลา t ในระหว่างการโจมตีไคลเอ็นต์จะไม่สามารถเชื่อมต่อระหว่างการโจมตีได้ หากเวลายืนยันการเชื่อมต่อมากกว่า t คำขอก็จะถูกโยนออกไปเช่นกัน ตัวอย่างเช่น สำหรับช่องของผู้โจมตีที่โหลด 4 Mbit/วินาที และความยาวบัฟเฟอร์ 512 (ค่าที่แนะนำสำหรับ Win2K) เวลา t คือประมาณ 50 มิลลิวินาที ซึ่งรับประกันว่าจะปฏิเสธความพยายามทั้งหมดในการเชื่อมต่อกับเซิร์ฟเวอร์จาก dialup และ มากมายจากสายการเช่า ด้วยการเพิ่มขนาดบัฟเฟอร์ การป้องกันสามารถลดลงไปเป็นตัวเลือกก่อนหน้าได้
ง) คุกกี้ซิน หลังจากบัฟเฟอร์หมด ข้อมูลที่ไม่พอดีกับบัฟเฟอร์จะถูกส่งไปยังไคลเอนต์ที่คาดว่าจะร้องขอ หากไคลเอนต์มีจริงก็จะส่งคืนข้อมูลกลับมา หากเป็นของปลอมก็จะสูญหายและกลไกจะถูกนำไปใช้ภายในกรอบงานของ RFC บน TCP เช่น นอกจากนี้ยังได้รับการสนับสนุนจากลูกค้าที่ไม่คุ้นเคยกับเทคโนโลยีนี้อีกด้วย ระบบปฏิบัติการที่มี SYN COOKIE โดยไม่คำนึงถึงขนาดของบัฟเฟอร์ของการเชื่อมต่อแบบเปิดครึ่งหนึ่ง จะคงกระพันต่อการโจมตี SYN-flood โดยสิ้นเชิง ผลข้างเคียง: ห้ามใช้ "หน้าต่างบานใหญ่"
สรุป: การโจมตี SYN-flood นั้นล้าสมัย และในปัจจุบันสามารถใช้เป็นการโจมตีแบบน้ำท่วมเป็นประจำเพื่อให้เกินความจุของช่องสัญญาณได้
DoS (คำย่อ การปฏิเสธการบริการ) คือการโจมตีของแฮ็กเกอร์ในระบบคอมพิวเตอร์โดยมีจุดประสงค์เพื่อทำให้ระบบล้มเหลว นั่นคือการสร้างเงื่อนไขที่ผู้ใช้ระบบโดยสุจริตไม่สามารถเข้าถึงทรัพยากรระบบที่ให้มา (เซิร์ฟเวอร์) หรือสิ่งนี้ เข้าถึงได้ยาก
การโจมตี DoS/DDoS มีอยู่สองประเภท และการโจมตีที่พบบ่อยที่สุดนั้นมีพื้นฐานมาจากแนวคิดเรื่องน้ำท่วม กล่าวคือ ครอบงำเหยื่อด้วยแพ็กเก็ตจำนวนมาก มีการฟลัดที่แตกต่างกัน: ฟลัด ICMP, ฟลัด SYN, ฟลัด UDP และฟลัด HTTP บอท DoS สมัยใหม่สามารถใช้การโจมตีทุกประเภทเหล่านี้พร้อมกันได้ ดังนั้นคุณควรดูแลล่วงหน้าให้มีการป้องกันที่เพียงพอต่อการโจมตีแต่ละประเภท
การตรวจจับการโจมตี DoS
SYN น้ำท่วม
การมีอยู่ของ SYN Flood นั้นเกิดขึ้นได้ง่าย ๆ โดยการนับจำนวนการเชื่อมต่อ TCP “แบบครึ่งเปิด” ในสถานการณ์ปกติ ไม่ควรมีเลย (หรือจำนวนน้อยมาก: สูงสุด 1-3)
ป้องกันการโจมตี DoS
บล็อกชิ้นส่วนของแพ็กเก็ต เนื่องจากวัตถุประสงค์การทำงานของโปรโตคอล แพ็กเก็ต ICMP จะต้องมีขนาดเล็กมากและพอดีกับ MTU ตามปกติ การมีอยู่ของแฟรกเมนต์มักจะบ่งบอกถึงข้อผิดพลาดหรือความพยายามในการโจมตี iptables -A อินพุต -p icmp -f -j DROP
ห้ามการปลอมแปลงในนามของคุณ iptables -A INPUT -m conntrack --ctstate ใหม่, ไม่ถูกต้อง -p tcp --tcp-flags SYN, ACK SYN, ACK -j LOG -- ข้อมูลระดับบันทึก -- คำนำหน้าบันทึก "DROP SYN, ACK:" iptables - อินพุต -m conntrack --ctstate ใหม่, ไม่ถูกต้อง -p tcp --tcp-flags SYN, ACK SYN, ACK -j REJECT -- ปฏิเสธด้วย tcp-reset
ท้ายที่สุด หากเราได้รับแพ็กเก็ตที่มีการตั้งค่าสถานะ SYN และ ACK (เฉพาะการตอบสนองต่อแพ็กเก็ต SYN เท่านั้นที่มีการรวมแฟล็กนี้) ผ่านการเชื่อมต่อที่ยังไม่เปิด นั่นหมายความว่ามีคนส่งแพ็กเก็ต SYN ไปยังโฮสต์อื่นในนามของเรา และคำตอบก็มาหาเรา แน่นอนว่าผู้โจมตียังต้องเดาหมายเลขลำดับ แต่จะเป็นการดีกว่าที่จะไม่ให้โอกาสเขาเช่นนั้น ตามกฎข้างต้นโฮสต์ของเราจะตอบกลับด้วยแพ็กเก็ต RST หลังจากได้รับซึ่งโฮสต์ที่ถูกโจมตีจะปิดการเชื่อมต่อ ขอแนะนำให้เพิ่มกฎดังกล่าวในการกำหนดค่าไฟร์วอลล์ของคุณ เพราะหากผู้โจมตีจัดการเพื่อดำเนินการโจมตีปลอมในนามของคุณ การสอบสวนจะนำคุณไปสู่
SYN น้ำท่วม
หนึ่งในวิธีทั่วไปที่ไม่เพียงแต่อุดตันช่องทางการสื่อสาร แต่ยังทำให้สแต็กเครือข่ายของระบบปฏิบัติการอยู่ในสถานะที่ไม่สามารถยอมรับคำขอเชื่อมต่อใหม่ได้อีกต่อไป อิงตามความพยายามที่จะเริ่มต้นการเชื่อมต่อ TCP จำนวนมากพร้อมกันโดยการส่งแพ็กเก็ต SYN พร้อมที่อยู่ผู้ส่งที่ไม่มีอยู่จริง หลังจากพยายามส่งแพ็กเก็ต ACK ตอบกลับไปยังที่อยู่ที่ไม่สามารถเข้าถึงได้หลายครั้ง ระบบปฏิบัติการส่วนใหญ่จะจัดคิวการเชื่อมต่อที่ยังไม่ได้สร้าง และหลังจากพยายามครั้งที่ n เท่านั้นการเชื่อมต่อจะถูกปิด เนื่องจากโฟลว์ของแพ็คเก็ต ACK มีขนาดใหญ่มาก คิวจึงเต็มในไม่ช้า และเคอร์เนลปฏิเสธความพยายามในการเปิดการเชื่อมต่อใหม่ บอท DoS ที่ฉลาดที่สุดยังวิเคราะห์ระบบก่อนเริ่มการโจมตีเพื่อส่งคำขอเฉพาะเพื่อเปิดพอร์ตที่สำคัญเท่านั้น การระบุการโจมตีดังกล่าวเป็นเรื่องง่าย เพียงลองเชื่อมต่อกับบริการใดบริการหนึ่ง มาตรการป้องกันมักจะรวมถึง:
การเพิ่มคิวของการเชื่อมต่อ TCP "ครึ่งเปิด":
# sysctl -w net.ipv4.tcp_max_syn_backlog=1024ลดเวลาการถือครองของการเชื่อมต่อแบบ "ครึ่งเปิด":
# sysctl -w net.ipv4.tcp_synack_retries=1การเปิดใช้งานกลไก TCP syncookies:
# sysctl -w net.ipv4.tcp_syncookies=1UDP น้ำท่วม
วิธีการฟลัดแบนด์วิธ ขึ้นอยู่กับการส่งแพ็คเก็ต UDP ไปยังพอร์ตของบริการ UDP ต่างๆ อย่างไม่มีที่สิ้นสุด สามารถกำจัดได้อย่างง่ายดายโดยการตัดบริการดังกล่าวจากโลกภายนอกและกำหนดจำนวนการเชื่อมต่อต่อหน่วยเวลา
#เรากำหนดขีดจำกัดการเชื่อมต่อ 5 รายการบนพอร์ต 80 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j REJECT # อนุญาตการเชื่อมต่อพร้อมกันเพียงครั้งเดียวจาก IP หนึ่งไปยัง smtp iptables -A FORWARD -p tcp --syn --dport smtp -m connlimit --connlimit-above 1 -j DROP #ตั้งค่าขีดจำกัดการเชื่อมต่อ 200 รายการบนพอร์ต 1720 iptables -A อินพุต -p tcp --syn --dport 1720 -m connlimit --connlimit- เหนือ 200 -j ปฏิเสธ # udp 5060 $IPT -A อินพุต -p udp --dport 5060 -m connlimit --connlimit-เหนือ 60 -j LOG --ข้อมูลระดับบันทึก --log-คำนำหน้า "ปฏิเสธ 5060:" $IPT -A INPUT -p udp --dport 5060 -m connlimit --connlimit-above 60 -j ปฏิเสธ # tcp 1720 $IPT -A อินพุต -p tcp --syn --dport 1720 -m connlimit --connlimit-above 60 -j LOG --log-level info --log-prefix "ปฏิเสธ 1720: " $IPT -A INPUT -p tcp --syn --dport 1720 -m connlimit --connlimit- เหนือ 60 -j ปฏิเสธ
ไอซีเอ็มพีน้ำท่วม
วิธีการดั้งเดิมในการอุดตันแบนด์วิดท์และสร้างโหลดบนสแต็กเครือข่ายผ่านการส่งคำขอโปรโตคอลการวินิจฉัยความแออัดของเครือข่าย ICMP ECHO (ping) ที่ซ้ำซากจำเจ ตรวจพบได้ง่ายโดยการวิเคราะห์กระแสการรับส่งข้อมูลในทั้งสองทิศทาง: ในระหว่างการโจมตีน้ำท่วม ICMP กระแสเหล่านี้เกือบจะเหมือนกัน วิธีการป้องกันแบบสัมบูรณ์ที่เกือบจะไม่เจ็บปวดนั้นขึ้นอยู่กับการปิดใช้งานการตอบสนองต่อคำขอ ICMP ECHO:
Sysctl net.ipv4.icmp_echo_ignore_all=1
หรือใช้ไฟร์วอลล์:
Iptables -A อินพุต -p icmp -j DROP --icmp-type 8
HTTP ฟลัด
จำนวนกระบวนการ ps aux | grep apache | สุขา -l
จำนวนการเชื่อมต่อบนพอร์ต 80 netstat -na | grep ":80\ " | สุขา -l
ดูรายการที่อยู่ IP ที่มีการร้องขอการเชื่อมต่อ: netstat -na | grep ":80\ " | เรียงลำดับ | ยูนิค -c | เรียงลำดับ -nr
ระบบ
การป้องกันการปลอมแปลง net.ipv4.conf.default.rp_filter = 1
ตรวจสอบการเชื่อมต่อ TCP ทุกนาที ถ้ามีรถถูกกฎหมายอีกฝั่งก็จะตอบสนองทันที ค่าเริ่มต้นคือ 2 ชั่วโมง net.ipv4.tcp_keepalive_time = 60
ลองอีกครั้งหลังจากผ่านไปสิบวินาที net.ipv4.tcp_keepalive_intvl = 10
จำนวนการตรวจสอบก่อนปิดการเชื่อมต่อ net.ipv4.tcp_keepalive_probes = 5
Debian: ต่อสู้กับ DDoS
ตามค่าเริ่มต้น Debian และระบบปฏิบัติการอื่นๆ จะไม่สามารถรองรับการเชื่อมต่อจำนวนมากที่สร้างโดยบ็อตเน็ตได้ จำเป็นต้องเปลี่ยนแปลงการตั้งค่าเคอร์เนลเพื่อทำให้สแต็ก TCP/IP แข็งแกร่งขึ้น ตัวอย่างของการกำหนดค่านี้:
Net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.core.rmem_max = 996777216 net.core.wmem_max = 996777216 net.ipv4 .tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_mem= 786432 1048576 996777216 net.ipv4.tcp_wmem = 4096 87380 4194304 net.ipv4.tcp_max_orphans = 225536 0 net.core.netdev_max_backlog = 10,000 net.ipv4.tcp_fin_timeout = 10 net.ipv4 tcp_keepalive_intvl = 15 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 494967295 kernel.shmall = 268435456 net.core.somax คอน= 16096
เปลี่ยนการกำหนดค่าเคอร์เนลอย่างระมัดระวังและรีบูตเซิร์ฟเวอร์...
FreeBSD: ต่อสู้กับ DDoS
เราลดเวลารอสำหรับแพ็กเก็ตตอบกลับคำขอ SYN-ACK (การป้องกัน SYN Flood):
# sysctl net.inet.tcp.msl=7500เปลี่ยนเซิร์ฟเวอร์ให้เป็นหลุมดำ วิธีนี้เคอร์เนลจะไม่ส่งแพ็กเก็ตตอบกลับเมื่อพยายามเชื่อมต่อกับพอร์ตว่าง (ลดภาระบนเครื่องระหว่าง DDoS บนพอร์ตสุ่ม):
# sysctl net.inet.tcp.blackhole=2 # sysctl net.inet.udp.blackhole=1เราจำกัดจำนวนการตอบกลับข้อความ ICMP ไว้ที่ 50 รายการต่อวินาที (การป้องกัน ICMP Flood):
# sysctl net.inet.icmp.icmplim=50เราเพิ่มจำนวนการเชื่อมต่อสูงสุดไปยังเซิร์ฟเวอร์ (การป้องกัน DDoS ทุกประเภท):
# sysctl kern.ipc.somaxconn=32768เราเปิดใช้งาน DEVICE_POLLING - การโพลอิสระของไดรเวอร์เครือข่ายโดยเคอร์เนลที่โหลดสูง (ลดภาระบนระบบลงอย่างมากระหว่าง DDoS):
เราสร้างเคอร์เนลใหม่ด้วยตัวเลือก “ตัวเลือก DEVICE_POLLING”; เปิดใช้งานกลไกการโพล: “sysctl kern.polling.enable=1”; เพิ่มรายการ “kern.polling.enable=1” ใน /etc/sysctl.conf
เพื่อหลีกเลี่ยงไม่ให้ตกอยู่ในสถานการณ์สิ้นหวังเมื่อพายุ DDoS โจมตีระบบของคุณ คุณต้องเตรียมระบบเหล่านี้อย่างระมัดระวังสำหรับสถานการณ์ดังกล่าว:
เซิร์ฟเวอร์ทั้งหมดที่เข้าถึงเครือข่ายภายนอกได้โดยตรงจะต้องเตรียมพร้อมสำหรับการรีบูตระยะไกลที่ง่ายและรวดเร็ว (sshd จะช่วยบิดาแห่งประชาธิปไตยรัสเซีย) ข้อได้เปรียบที่ยิ่งใหญ่คือการมีอินเทอร์เฟซเครือข่ายการดูแลระบบที่สองซึ่งคุณสามารถเข้าถึงเซิร์ฟเวอร์ได้หากช่องทางหลักอุดตัน
ซอฟต์แวร์ที่ใช้บนเซิร์ฟเวอร์จะต้องทันสมัยอยู่เสมอ ช่องโหว่ทั้งหมดได้รับการแก้ไขแล้ว มีการติดตั้งการอัปเดตแล้ว (ง่ายเหมือนการบู๊ต คำแนะนำที่หลายคนไม่ปฏิบัติตาม) วิธีนี้จะปกป้องคุณจากการโจมตี DoS ที่ใช้ประโยชน์จากจุดบกพร่องในบริการ
บริการเครือข่ายการฟังทั้งหมดที่มีไว้สำหรับการใช้งานด้านผู้ดูแลระบบควรซ่อนอยู่หลังไฟร์วอลล์จากใครก็ตามที่ไม่สามารถเข้าถึงได้ จากนั้นผู้โจมตีจะไม่สามารถใช้เพื่อโจมตี DoS หรือกำลังดุร้ายได้
เมื่อเข้าใกล้เซิร์ฟเวอร์ (เราเตอร์ที่ใกล้ที่สุด) ควรติดตั้งระบบวิเคราะห์การรับส่งข้อมูล (NetFlow เพื่อช่วยเหลือ) ซึ่งจะช่วยให้คุณเรียนรู้เกี่ยวกับการโจมตีที่เกิดขึ้นได้ทันทีและใช้มาตรการทันเวลาเพื่อป้องกันการโจมตี
จริงๆ แล้ว เราจะพูดถึงการป้องกันการโจมตี SYN ฟลัด:
การโจมตี DoS ที่ได้รับความนิยมอย่างมากเกี่ยวข้องกับการส่งแพ็กเก็ต SYN จำนวนมากไปยังเซิร์ฟเวอร์ของคุณ ในกรณีนี้ การติดตั้งการสื่อสาร TCP ยังไม่เสร็จสมบูรณ์ คิวคำขอเชื่อมต่อแบบเปิดครึ่งหนึ่งจะเต็มอย่างรวดเร็ว ส่งผลให้ไม่สามารถสร้างการเชื่อมต่อปกติได้ เนื่องจากไม่จำเป็นต้องยุติการเชื่อมต่อ การโจมตีดังกล่าวจึงไม่ต้องใช้ทรัพยากรจำนวนมากจากเครื่องโจมตี ดังนั้นจึงง่ายต่อการใช้งานและควบคุม
ตรวจจับการโจมตี SYN ได้ง่าย - คำสั่ง netstat จะสร้างรายการการเชื่อมต่อแบบเปิดครึ่งหนึ่งจำนวนมาก:
Netstat -n --tcp | grep SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:1084 SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:1228 SYN_RECV tcp 0 0 xxx .xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:2652 SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:3446 SYN_RECV
Netstat -n --tcp | grep SYN_RECV | สุขา -l 238
ขั้นแรก เรามาตรวจสอบพารามิเตอร์กันก่อน tcp_syncookies- จะต้องเท่ากับ 1:
แมว /proc/sys/net/ipv4/tcp_syncookies 1
ปล่อยมันไว้แบบนั้นเถอะ ตามค่าเริ่มต้น ตัวเลือกนี้จะเปิดใช้งานเสมอในการกระจายใหม่
หากตั้งค่าตัวเลือก tcp_syncookies (ใช้ได้เฉพาะเมื่อเคอร์เนลสร้างด้วย CONFIG_SYNCOOKIES) เคอร์เนลจะประมวลผลแพ็กเก็ต TCP SYN ตามปกติจนกว่าคิวจะเต็ม เมื่อคิวเต็ม กลไกคุกกี้ SYN จะถูกเปิดใช้งาน
คุกกี้ SYN ไม่ได้ใช้คิว SYN เลย เคอร์เนลจะตอบสนองต่อแพ็กเก็ต SYN แต่ละแพ็กเก็ตเหมือน SYN|ACK ปกติ แต่จะรวมหมายเลขที่สร้างขึ้นเป็นพิเศษตามที่อยู่ IP และพอร์ตต้นทางและปลายทาง ตลอดจนเวลาที่แพ็กเก็ตถูกส่ง ผู้โจมตีจะไม่ได้รับแพ็กเก็ตเหล่านี้ ดังนั้นจะไม่ตอบสนองต่อแพ็กเก็ตเหล่านี้ ในระหว่างการเชื่อมต่อปกติ แพ็กเก็ตที่สามที่มีหมายเลขจะถูกส่ง และเซิร์ฟเวอร์จะตรวจสอบว่าเป็นการตอบสนองต่อคุกกี้ SYN หรือไม่ และหากเป็นเช่นนั้น จะอนุญาตการเชื่อมต่อแม้ว่าจะไม่มีรายการที่เกี่ยวข้องในคิว SYN .
การเปิดใช้งานกลไกคุกกี้ SYN เป็นวิธีที่ง่ายมากในการต่อสู้กับการโจมตี SYN ฟลัด ซึ่งต้องใช้ CPU เพิ่มขึ้นเล็กน้อยเนื่องจากจำเป็นต้องสร้างและปรับคุกกี้ เนื่องจากทางเลือกอื่นคือการปฏิเสธคำขอการเชื่อมต่อทั้งหมด คุกกี้ SYN จึงเป็นตัวเลือกที่ดี
คุณต้องเพิ่มคิวของการเชื่อมต่อแบบเปิดครึ่งหนึ่งด้วย - tcp_max_syn_backlog(Debian Lenny มีการเชื่อมต่อ 1,024 รายการตามค่าเริ่มต้น):
แมว /proc/sys/net/ipv4/tcp_max_syn_backlog 1024
เพิ่มขึ้น:
เสียงสะท้อน "20000" > /proc/sys/net/ipv4/tcp_max_syn_backlog
นอกจากนี้เรายังสามารถลดเวลารอการเชื่อมต่อได้อีกด้วย tcp_synack_ลองใหม่:
cat /proc/sys/net/ipv4/tcp_synack_retries 5ค่าจำนวนเต็ม 1 ไบต์ tcp_synack_retries ระบุจำนวนครั้งในการลองใช้แพ็กเก็ต SYNACK อีกครั้งสำหรับการเชื่อมต่อ TCP แบบพาสซีฟ จำนวนครั้งในการพยายามไม่ควรเกิน 255 ค่าเริ่มต้นคือ 5 สอดคล้องกับเวลาประมาณ 180 วินาทีสำหรับความพยายามในการเชื่อมต่อ
ลดเหลือ 1 (ประมาณ 9 วินาที):
เสียงก้อง "1" > /proc/sys/net/ipv4/tcp_synack_retries
tcp_fin_timeout
แมว /proc/sys/net/ipv4/tcp_fin_timeout 60จำนวนเต็มในไฟล์ tcp_fin_timeout กำหนดระยะเวลาที่ซ็อกเก็ตยังคงอยู่ในสถานะ FIN-WAIT-2 หลังจากที่ปิดโดยฝั่งโลคัล เพียร์ไม่อาจปิดการเชื่อมต่อนี้ ดังนั้นควรปิดด้วยความคิดริเริ่มของตนเองหลังจากหมดเวลาหมดเวลาแล้ว การหมดเวลาเริ่มต้นคือ 60 วินาที โดยทั่วไปเคอร์เนลซีรีส์ 2.2 จะใช้ค่า 180 วินาที และคุณสามารถบันทึกค่านี้ได้ แต่โปรดจำไว้ว่าบนเซิร์ฟเวอร์เว็บที่ไม่ว่าง คุณเสี่ยงต่อการสิ้นเปลืองหน่วยความจำจำนวนมากเพื่อรักษาการเชื่อมต่อที่เสียหายครึ่งหนึ่ง ซ็อกเก็ตที่อยู่ในสถานะ FIN-WAIT-2 มีอันตรายน้อยกว่า FIN-WAIT-1 เนื่องจากใช้หน่วยความจำไม่เกิน 1.5 KB แต่สามารถใช้งานได้นานกว่า
เปลี่ยนเป็น 30:
เสียงก้อง "30" > /proc/sys/net/ipv4/tcp_fin_timeout
tcp_keepalive_probes
แมว /proc/sys/net/ipv4/tcp_keepalive_probes 9ตัวแปรจำนวนเต็ม tcp_keepalive_probes ระบุจำนวนของโพรบ Keepalive ที่ส่งก่อนที่การเชื่อมต่อจะถูกพิจารณาว่าปิด ตามค่าเริ่มต้น จะมีการส่งตัวอย่าง 9 ตัวอย่าง
เสียงสะท้อน "5" > /proc/sys/net/ipv4/tcp_keepalive_probes
tcp_keepalive_intvl
แมว /proc/sys/net/ipv4/tcp_keepalive_intvl 75ตัวแปรจำนวนเต็ม tcp_keepalive_intvl ระบุช่วงเวลาการสุ่มตัวอย่าง ผลิตภัณฑ์ tcp_keepalive_probes * tcp_keepalive_intvl กำหนดเวลาหลังจากที่การเชื่อมต่อจะถูกปิดหากไม่มีการตอบสนอง ช่วงเวลาเริ่มต้นคือ 75 วินาที กล่าวคือ เวลาในการตัดการเชื่อมต่อหากไม่มีการตอบสนองจะอยู่ที่ประมาณ 11 นาที
มาตั้งค่าเป็น 15:
เสียงก้อง "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl
netdev_max_backlog
นี่เป็นการระบุจำนวนแพ็กเก็ตสูงสุดที่จะเข้าคิวเพื่อประมวลผลหากอินเทอร์เฟซได้รับแพ็กเก็ตเร็วกว่าที่เคอร์เนลสามารถประมวลผลได้
แมว /proc/sys/net/core/netdev_max_backlog 1,000
เพิ่มขึ้น:
เสียงสะท้อน "20000" > /proc/sys/net/core/netdev_max_backlog
โซแมกซ์คอนน์
จำนวนซ็อกเก็ตเปิดสูงสุดที่รอการเชื่อมต่อ
แมว 1,024
เพิ่มขึ้น:
เสียงสะท้อน "20000" > /proc/sys/net/core/somaxconn
เนื่องจากการเปลี่ยนแปลงพารามิเตอร์เคอร์เนลดังกล่าวจะไม่ถูกบันทึกหลังจากรีบูตเราจึงเพิ่มเข้าไป /etc/rc.local:
เสียงก้อง "20000" > /proc/sys/net/ipv4/tcp_max_syn_backlog echo "1" > /proc/sys/net/ipv4/tcp_synack_retries echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl echo "20000" > /proc/sys/net/core/netdev_max_backlog echo "20000" > /proc/sys/ net/core/somaxconn
นอกจากนี้ คุณสามารถเพิ่มขีดจำกัดจำนวนแพ็กเก็ต SYN ต่อหน่วยเวลาใน iptables ได้:
Iptables -N syn_flood iptables -A INPUT -p tcp --syn -j syn_flood iptables -A syn_flood -m จำกัด --จำกัด 500/s --limit-burst 1500 -j RETURN iptables -A syn_flood -j DROP
จำนวนแพ็กเก็ต SYN ใหม่คือสูงสุด 500 ต่อวินาที หากเกินเกณฑ์ 1500 แพ็กเก็ตใหม่จะถูกบล็อก:
ชัดเจนยิ่งขึ้น เกณฑ์นี้สามารถจินตนาการได้ว่าเป็นภาชนะที่มีทางออกซึ่งพัสดุจำนวนหนึ่งจะผ่านไปต่อหน่วยเวลา (เช่น อัตรา "การไหลออก") อัตรา "การรั่วไหล" ถูกกำหนดอย่างแม่นยำโดยค่า --limit ค่า --limit-burst ระบุ "ปริมาณความจุ" ทั้งหมด ทีนี้ลองจินตนาการถึงกฎ --จำกัด 3/นาที --จำกัด-ระเบิด 5 จากนั้นหลังจากที่แพ็กเก็ตมาถึง 5 แพ็กเก็ต (ในระยะเวลาอันสั้นมาก) ความจุจะ "เต็ม" และแต่ละแพ็กเก็ตที่ตามมาจะทำให้ความจุ " ล้น” กล่าวคือ “การกระตุ้น” ของเกณฑ์ หลังจากผ่านไป 20 วินาที "ระดับ" ในถังจะลดลง (ตามค่า --limit) ดังนั้นจึงพร้อมที่จะรับแพ็คเก็ตอื่นโดยไม่ทำให้ถัง "ล้น" เช่น ทำให้เกิดเกณฑ์
Spoofed SYN คือการโจมตีที่มีการปลอมแปลงส่วนหัวของแพ็กเก็ตในลักษณะที่ที่อยู่ IP ที่ไม่มีตัวตนหรือไม่มีอยู่จริงเข้ามาแทนที่ผู้ส่งจริง
เพราะโดยพื้นฐานแล้ว SYN เป็นเครื่องมือทั่วไป" การแข่งขันที่รุนแรง“และในขณะเดียวกัน โซลูชันบรรเทา DDoS ส่วนใหญ่แสดงประสิทธิภาพที่น่าประทับใจต่อการโจมตีประเภทนี้ จากนั้นเราจะเริ่มต้นด้วยการโจมตีแบบ SYN-flood โดยพิจารณาว่าการโจมตีประเภทปลอมแปลงเป็นประเภทที่น่าเกรงขามที่สุด
ข้อสงวนสิทธิ์
ข้อสงวนสิทธิ์ #1
ทุกสิ่งที่อธิบายไว้ในหัวข้อนี้และหัวข้อต่อๆ ไปนั้นไม่ใช่ความรู้ความชำนาญ วิธีการทั้งหมดเป็นแบบเปิดและเผยแพร่ในโอเพ่นซอร์สไม่กี่ครั้ง (บางส่วนตั้งแต่ปี 2546) ฉันแค่เอาปัญหามารวมเข้าด้วยกันแล้วอธิบายว่า” กลยุทธ์ระดับโลก» การป้องกันมุ่งเป้าไปที่ผู้ดูแลระบบที่ให้บริการโครงการขนาดเล็กที่ตั้งอยู่บนเซิร์ฟเวอร์เฉพาะ (กลยุทธ์ที่อธิบายไว้สามารถนำไปใช้ในโครงการที่ใช้ร่วมกันได้ แต่การดำเนินการจะเป็นเช่นนั้น เกินกว่าความซีดมันแย่มากที่ฉันไม่มีความปรารถนาที่จะเขียนเกี่ยวกับเรื่องนี้)ข้อสงวนสิทธิ์ #2
ในหัวข้อ ไม่ได้รับการพิจารณาโซลูชันการป้องกันฮาร์ดแวร์ - ประการแรกพวกเขาได้รับการตรวจสอบอย่างดีในบทความจำนวนมากโดยผู้ผลิตโซลูชันเดียวกันเหล่านี้ ประการที่สอง โครงการที่มีเซิร์ฟเวอร์เดียวไม่สามารถจ่ายได้บ่อยครั้ง (พูดโดยคร่าวๆ ราคาสำหรับโซลูชันการทำงานเริ่มต้นที่ 20,000 ยูโร) ประการที่สาม - ผู้เขียน ไม่มีข้อมูลและประสบการณ์เพียงพอในการทำงานกับฮาร์ดแวร์พิเศษดังกล่าวเพื่อสรุปผลระดับโลกเกี่ยวกับวิธีการและประสิทธิผลของการป้องกันดังกล่าว - ไม่น่าเป็นไปได้ที่ใครจะสนใจการตรวจสอบโซลูชันจากผู้ขายสองรายจากหลายสิบรายซึ่งไม่ได้รับการสนับสนุนจาก สถิติการทำงานที่จริงจังเกี่ยวกับการใช้งาน แต่เป็นที่น่าสังเกตว่าโซลูชันฮาร์ดแวร์ทั้งสองที่ฉันใช้มักจะมีประสิทธิภาพในการป้องกันการโจมตี SYN มาก ขึ้นอยู่กับเงื่อนไขหลายประการ.ข้อสงวนสิทธิ์ #3
ในหัวข้อ ไม่ได้รับการพิจารณาผู้ให้บริการป้องกัน DDoS - วิศวกรบริการขององค์กรเหล่านี้จะสามารถอธิบายวิธีการทำงานของตนได้ดีขึ้นและละเอียดยิ่งขึ้น มันอาจจะคุ้มค่าที่จะสร้างภาพรวมของผู้ให้บริการเอง - จากมุมมองของลูกค้า (ในเวลาที่ต่างกัน โครงการที่ฉันเข้าร่วมคือลูกค้าของ Dragonara, Blacklotus, Gigenet, Vistnet (ปัจจุบัน), Prolexic (ปัจจุบัน) ) และผู้ขายบริการจำนวนหนึ่งจากบริษัทข้างต้น) แต่สิ่งนี้อยู่นอกขอบเขตของหัวข้อ เราจะพยายามพูดถึงเรื่องนี้ในภายหลัง เป็นที่น่าสังเกตว่าผู้ให้บริการความปลอดภัยทุกรายที่โครงการของผู้เขียนร่วมงานด้วยหรือเคยร่วมงานด้วย รับมือกับปัญหาการโจมตี SYN ซึ่งแสดงประสิทธิภาพที่ดีกลไกเล็กน้อยและวิกิพีเดีย
ฉันไม่อยากเปลี่ยนหัวข้อให้กลายเป็น RFC และอ้างความจริงที่รู้อยู่แล้ว ดังนั้นเราจะจำกัดตัวเองอยู่เพียงสิ่งที่น่าสนใจเกี่ยวกับ TCP จากมุมมองของการโจมตี SYN และก้าวข้ามไปด้านบนประการแรก TCP เป็นหนึ่งในโปรโตคอลการขนส่งที่ใช้มากที่สุด นอกเหนือจากนั้นยังมีโปรโตคอลแอปพลิเคชันส่วนใหญ่อยู่อีกด้วย ประการที่สอง มีคุณสมบัติพิเศษจำนวนหนึ่ง (มีการยืนยันการเริ่มต้นและสิ้นสุดการเชื่อมต่ออย่างชัดเจน การควบคุมโฟลว์ ฯลฯ) ซึ่งทำให้การใช้งานค่อนข้างซับซ้อนและใช้ทรัพยากรมาก
ในบริบทของบทความ เป็นเรื่องที่น่าสนใจที่จะพิจารณากลไกในการสร้างการเชื่อมต่อ TCP - การจับมือแบบสามทาง ในการประมาณครั้งแรกที่ระดับไคลเอนต์ - เซิร์ฟเวอร์จะมีลักษณะดังนี้: ไคลเอนต์ส่งแพ็กเก็ต SYN ไปยังเซิร์ฟเวอร์ซึ่ง SYN+ACK ตอบสนอง ไคลเอนต์ตอบสนองด้วย ACK ไปยัง SYN ของเซิร์ฟเวอร์และการเชื่อมต่อจะเข้าสู่รูปแบบที่สร้างขึ้น สถานะ.
การโจมตี SYN – การส่งแพ็กเก็ต SYN จำนวนมากไปยังพอร์ตเซิร์ฟเวอร์เปิดที่ไม่นำไปสู่การสร้างการเชื่อมต่อจริงด้วยเหตุผลใดก็ตาม ซึ่งก่อให้เกิดการสร้าง “การเชื่อมต่อแบบเปิดครึ่งหนึ่ง” ที่ล้นคิวการเชื่อมต่อ บังคับให้ เซิร์ฟเวอร์เพื่อปฏิเสธการให้บริการแก่ลูกค้ารายต่อไป นอกจากนี้ TCP RFC ยังกำหนดให้เซิร์ฟเวอร์ตอบสนองต่อ SYN ขาเข้าทุกรายการ ซึ่งส่งผลกระทบเพิ่มเติมทั้งทรัพยากรเซิร์ฟเวอร์และช่องทางการรับส่งข้อมูล อย่างไรก็ตาม หากคุณเคยเผชิญการโจมตี DDoS ใดๆ มาก่อน คุณจะรู้ว่าสิ่งที่อธิบายไว้ข้างต้นโดยไม่มีฉันคืออะไร มาดูคำแนะนำเฉพาะกันดีกว่า
คนเดียวในสนาม
ใช้สิ่งที่มีอยู่และอย่ามองหาสิ่งอื่น - คุณจะทำอย่างไรเมื่อเผชิญหน้าการโจมตี? พูดตามตรงไม่มาก แต่บางครั้งก็เพียงพอแล้ว ข้อมูลต่อไปนี้จะอธิบายว่าจะทำอย่างไรกับ FreeBSD เนื่องจากในโครงการของเราใน 90% ของกรณีระบบนี้ถูกใช้ อย่างไรก็ตาม OS ถึง OS จะมีความแตกต่างกันเล็กน้อย - หลักการเหมือนกันอันดับแรก– คุณต้องเข้าถึงเซิร์ฟเวอร์ (ใช่ นี่อาจเป็นเรื่องยากเช่นกัน โดยเฉพาะอย่างยิ่งหากการโจมตีมีขนาดใหญ่และ/หรือใช้เวลานาน - เซิร์ฟเวอร์ใช้บัฟเฟอร์ทั้งหมดหมดหรือมีโหลด CPU 100%) โดยปกติในการทำเช่นนี้ก็เพียงพอที่จะปิดบริการที่ถูกโจมตีด้วยไฟร์วอลล์หรือเพียงแค่ปิด - บริการ (อย่างไรก็ตามหากตรวจพบการโจมตีจะต้องดำเนินการไม่ว่าในกรณีใด ๆ หากเพียงเพื่อที่จะสามารถ ทำอย่างอื่นบนเซิร์ฟเวอร์)
ที่สอง– รับข้อมูลแรกเกี่ยวกับการโจมตี หากคุณได้ตรวจสอบการรับส่งข้อมูลขาเข้าแล้ว - ดีมากถ้าไม่ - ให้เปิดไฟร์วอลล์ / ยกระดับบริการและใช้ tcpdump และ netstat เก่าที่ดีเพื่อค้นหาว่าอะไรกำลังถูกโจมตีอย่างแน่นอนและขนาดของการโจมตีในแพ็คเก็ตต่อวินาทีคือเท่าใด ระหว่างทาง คุณสามารถดูเครือข่ายที่มีคำขอจำนวนมากเข้ามาได้อย่างรวดเร็ว ไม่ว่าเครือข่ายเหล่านั้นจะรวมอยู่ในกลุ่มผู้ชมทั่วไปสำหรับบริการของคุณหรือไม่ก็ตาม ทั้งหมดนี้จะเป็นประโยชน์ในอนาคต
ที่สาม– บนอินเทอร์เฟซที่มีที่อยู่ IP ที่ถูกโจมตีควรเหลือเพียงอันเดียว แต่ละนามแฝงจะลดประสิทธิภาพของระบบ ซึ่งแสดงเป็นตัวเลขที่แตกต่างกันสำหรับระบบที่แตกต่างกัน แต่ตัวเลขเหล่านี้ร้ายแรง แต่ละนามแฝงอาจมีราคาแพ็กเก็ตเพิ่มเติม 2-3,000 ต่อวินาที
ที่สี่– หากคุณใช้ไฟร์วอลล์ใด ๆ สำหรับการรับส่งข้อมูลขาเข้าไปยังที่อยู่ที่ถูกโจมตี กฎทั้งหมดยกเว้นการบล็อกควรถูกปิดใช้งาน ตัวอย่างเช่น ด้วยการโจมตี SYN ที่ปลอมแปลง ความเป็นไปได้ที่พร็อกซี SYN จาก PF จะช่วยคุณมีแนวโน้มที่จะเป็นศูนย์ และ CPU นี้ จะจริงจังมาก
ประการที่ห้า– การตั้งค่าระบบ จะไม่มีปาฏิหาริย์ที่นี่พวกเขาต้องการเปียโนในพุ่มไม้ในรูปแบบของไดรเวอร์ที่เตรียมไว้และการ์ดเครือข่ายที่ซื้อเป็นพิเศษและคำแนะนำทั่วไปเพียงสองข้อเท่านั้นที่ส่งผลกระทบร้ายแรงต่อความสามารถในการรับการโจมตี SYN ที่ทุกคนรู้จักมานานแล้ว:
- กระจายการประมวลผลอินเตอร์รัปต์ไปยังโปรเซสเซอร์เซิร์ฟเวอร์
- เปิดใช้งานคุกกี้ซินและปิดการใช้งานแคชแคช
การปรับแต่งระบบที่เหลือจะช่วยบีบแพ็กเก็ตเพิ่มเติมอีก 5-10,000 แพ็กเก็ตซึ่งไม่น่าจะแตกหักได้ภายใต้สภาวะการโจมตี ในกรณีที่เป็นประโยชน์สำหรับทุกคน นี่คือการกำหนดค่าทั่วไปที่สุด (โดยไม่ต้องเปิดใช้งานตัวเลือกที่จำเป็นต้องสร้างเคอร์เนลใหม่หรือไดรเวอร์พิเศษ):
Net.isr.direct=1 kern.ipc.nmbclusters=400000 net.inet.tcp.nolocaltimewait=1 net.inet.tcp.recvspace=16384 net.inet.tcp.sendspace=32768 net.inet.tcp.msl=5000 net.inet.tcp.blackhole=1 net.inet.ip.intr_queue_maxlen=3000 net.inet.tcp.blackhole=2 net.inet.udp.blackhole=1 net.inet.icmp.log_redirect=1 net.inet.ip .redirect=0 net.inet.icmp.maskrepl=1 net.inet.tcp.syncookies_only=1 net.route.netisr_maxqlen=4096 kern.ipc.maxsockbuf=83886080 net.inet.ip.intr_queue_maxlen=10240
ระบบระดับเดสก์ท็อปที่กำหนดค่าตามหลักเกณฑ์เหล่านี้:
อันดับแรก # netstat -w1 -h -d อินพุต (รวม) แพ็กเก็ตเอาท์พุตข้อผิดพลาด idrops ไบต์แพ็กเก็ตข้อผิดพลาดไบต์คอลคอลลดลง 260K 0 0 15M 230K 0 13M 0 0
ระบบระดับ IBM System x3630 M3 ที่กำหนดค่าตามคำแนะนำเหล่านี้:
# วินาที # netstat -w1 -h -d อินพุต (รวม) แพ็กเก็ตเอาท์พุตข้อผิดพลาด idrops ไบต์แพ็กเก็ตข้อผิดพลาดไบต์คอลคอลลดลง 477K 0 0 36M 457K 0 25M 0 0
ฉันจะพยายามบอกคุณเกี่ยวกับการกำหนดค่าโดยละเอียดของระบบปฏิบัติการและเครื่องและอันที่จริงเรามาถึงได้อย่างไรในหัวข้อถัดไป
มาทำสิ่งหนึ่งกัน
จะทำอะไรนอกจากปรับระบบ โดยหลักการแล้วก็มีสิ่งที่ต้องทำควรทำการพูดนอกเรื่องเล็กน้อยที่นี่ - บริษัท โฮสติ้งส่วนใหญ่จะลังเลอย่างยิ่งที่จะช่วยต่อสู้กับการโจมตีหากพวกเขาช่วยได้เลยและเป็นการยากที่จะตำหนิพวกเขาในเรื่องนี้ แต่อย่างน้อยที่สุด พวกเขาจะให้ข้อมูลเกี่ยวกับการโจมตี หากคุณต้องทำงานร่วมกับผู้ให้บริการด้านการป้องกัน ข้อมูลนี้เมื่อรวมกับข้อมูลที่คุณรวบรวมระหว่างการโจมตี จะทำให้ชีวิตง่ายขึ้นมาก
หากเจอเจ้าบ้านที่เข้าใจ (ซึ่งจริงๆ แล้ว หายากมาก) – จากนั้นเราทำงานตามอัลกอริทึมต่อไปนี้ - ขนานและบล็อก บล็อกและขนาน:
หากเรามีการ์ดเครือข่ายหลายตัว (หากไม่มี โปรดติดตั้ง) - เราเปิดใช้งานการ์ดเหล่านั้นเป็นโหมด LACP (สำหรับสิ่งนี้ เราจะต้องเปิดใช้งานตัวเลือกที่คล้ายกันบนสวิตช์ของโฮสต์) - สิ่งนี้จะทำให้ประสิทธิภาพเพิ่มขึ้นครึ่งหนึ่ง (เราจะดูรายละเอียดปลีกย่อยบางส่วนของกระบวนการในภายหลัง - เพื่อยอมรับความใหญ่โตภายในหัวข้อ แต่ก็ไม่ได้ผล) เรามาถึงประสิทธิภาพต่อไปนี้:
# วินาที # netstat -w1 -h -d อินพุต (รวม) แพ็กเก็ตเอาต์พุตผิดพลาด idrops ไบต์แพ็คเก็ตข้อผิดพลาดไบต์ colls ลดลง 1.2M 16K 0 65M 1.1M 0 59M 0 0
โปรดบล็อกพอร์ตและโปรโตคอลที่ไม่ได้ใช้ทั้งหมด - การโจมตี SYN สามารถถูกแทนที่ด้วยการโจมตี UDP ได้อย่างง่ายดาย
บริษัทโฮสติ้งแทบทุกแห่งสามารถดำเนินการเหล่านี้ได้ แต่ถ้าคุณโชคดีพอที่จะได้ร่วมงานกับบริษัทที่จริงจัง ลองขอให้ปิดกั้นการรับส่งข้อมูลจากภูมิภาคที่ผู้ชมส่วนใหญ่ในโครงการของคุณไม่ได้อาศัยอยู่ (เช่น จีน) ซึ่งโดยปกติแล้วจะหมายถึงการประกาศหลุมดำสำหรับเครือข่ายของคุณสำหรับผู้ให้บริการแกนหลัก ในบางภูมิภาค ตามกฎแล้ว การโจมตี SYN จะดำเนินการจากเอเชีย เนื่องจากราคาถูกและการกระจายจำนวนมาก ดังนั้นการประกาศดังกล่าวสามารถช่วยได้อย่างจริงจังในการต่อสู้กับการโจมตีหรือกำจัดความเป็นไปได้โดยสิ้นเชิง
นอกเหนือจากมาตรการที่อธิบายไว้ข้างต้นแล้ว เรายังสามารถแนะนำให้ใช้บริการที่คล้ายกับ GeoDNS ได้ - ภายใต้เงื่อนไขบางประการ (เช่น การโจมตีจะดำเนินการในโดเมน เป็นต้น) ซึ่งจะทำงานคล้ายกับการประกาศหลุมดำสำหรับบางเครือข่าย
ในที่สุด
ฉันหวังว่าบทความนี้จะช่วยคุณรับมือกับปัญหาน้ำท่วม SYN โดยไม่เกินงบประมาณประจำปีของประเทศในแอฟริกา แน่นอนว่ามีเพียงคำแนะนำทั่วไปที่สุดเท่านั้นที่ได้รับที่นี่ แต่เชื่อฉันเถอะว่าใน 90% ของกรณีเหล่านั้นก็เพียงพอแล้ว และที่สำคัญที่สุด - อย่าตกใจ!รปภ. กำลังเขียนความต่อเนื่องและจะโพสต์ที่นี่เร็วๆ นี้ อยู่กับเรา!
การโจมตีแบบฟลัด SYN คือรูปแบบหนึ่งของการโจมตีแบบปฏิเสธการให้บริการ โดยผู้โจมตีส่งคำขอ SYN จำนวนมากไปยังบริการของระบบเป้าหมายที่ใช้โปรโตคอล TCP สิ่งนี้ใช้ทรัพยากรเซิร์ฟเวอร์เพื่อทำให้ระบบไม่ตอบสนองต่อการรับส่งข้อมูลที่ถูกกฎหมาย การโจมตีนี้สามารถเกิดขึ้นได้กับบริการใดๆ ที่ใช้โปรโตคอล TCP แต่ส่วนใหญ่ใช้บริการบนเว็บ ในบทช่วยสอนนี้ เราจะอธิบายข้อมูลพื้นฐานของการโจมตี SYN Flood และขั้นตอนการบรรเทาผลกระทบโดยละเอียด
การโจมตี SYN Flood ใช้ประโยชน์จากลักษณะการใช้งานของ Transmission Control Protocol (TCP) ซึ่งเรียกว่าการจับมือแบบ 3 ทาง ต่อไปนี้เป็นขั้นตอนที่เกิดขึ้นในการจับมือ 3 ทางตามปกติ:
1. ไคลเอนต์ร้องขอการเชื่อมต่อโดยการส่งข้อความ SYN (ซิงโครไนซ์) ไปยังเซิร์ฟเวอร์
2. เซิร์ฟเวอร์รับทราบคำขอนี้โดยส่ง SYN-ACK กลับไปยังไคลเอนต์
3. ไคลเอนต์ตอบสนองด้วย ACK และสร้างการเชื่อมต่อแล้ว
การโจมตี SYN ฟลัดทำงานโดยไม่ตอบสนองต่อเซิร์ฟเวอร์ด้วยรหัส ACK ที่คาดไว้ ด้วยการเชื่อมต่อที่เปิดเพียงครึ่งเดียว เครื่องเป้าหมาย TCP backlog จะถูกเติมเต็ม และการเชื่อมต่อใหม่ทั้งหมดอาจถูกละเลย สิ่งนี้จะทำให้ผู้ใช้ที่ถูกกฎหมายถูกละเลยเช่นกัน
การโจมตีนี้สามารถเกิดขึ้นได้สองวิธี:
1. การโจมตีโดยตรง
ในการโจมตีประเภทนี้ ผู้โจมตีจะส่งเซ็กเมนต์ SYN อย่างรวดเร็วโดยไม่ปลอมแปลงที่อยู่ IP ของตน เมื่อตรวจพบ การโจมตีประเภทนี้จะป้องกันได้ง่ายมาก เนื่องจากเราสามารถเพิ่มกฎไฟร์วอลล์ง่ายๆ เพื่อบล็อกแพ็กเก็ตด้วยที่อยู่ IP ต้นทางของผู้โจมตีซึ่งจะโจมตี
2.การใช้การปลอมแปลงที่อยู่ IP
นี่เป็นรูปแบบการโจมตีที่ซับซ้อนมากกว่าการโจมตีโดยตรง ในวิธีนี้ เครื่องที่เป็นอันตรายจะส่งคำขอ SYN ฟลัดไปยังเครื่องเป้าหมายจากที่อยู่ IP ที่ถูกปลอมแปลง ทำให้เซิร์ฟเวอร์ส่ง SYN-ACK ไปยังที่อยู่ IP ปลอม - ซึ่งจะไม่ส่ง ACK เพราะ "รู้" ว่าไม่เคย ส่ง SYN แล้ว
การตรวจจับการโจมตีน้ำท่วมของ SYN
อาการทั่วไปของการโจมตี SYN Flood ต่อผู้เข้าชมเว็บไซต์คือไซต์ใช้เวลาในการโหลดนาน หรือโหลดองค์ประกอบบางส่วนของหน้าเว็บ แต่ไม่ใช่โหลดองค์ประกอบอื่นๆ หากคุณสงสัยว่ามีการโจมตี SYN Flood บนเว็บเซิร์ฟเวอร์ คุณสามารถใช้เพื่อตรวจสอบคำขอการเชื่อมต่อเว็บเซิร์ฟเวอร์ที่อยู่ในสถานะ “SYN_RECEIVED”
netstat -ทูน่า | grep:80 | grep SYN_RECV
หากแสดงการเชื่อมต่อจำนวนมากในสถานะนี้ แสดงว่าเซิร์ฟเวอร์อาจตกอยู่ภายใต้การโจมตี SYN Flood หากการโจมตีโดยตรงกับแพ็กเก็ต SYN_RECV จำนวนมากจากที่อยู่ IP เดียว คุณสามารถหยุดการโจมตีนี้ได้โดยการเพิ่มที่อยู่ IP นั้นในไฟร์วอลล์ หากคุณมี APF หรือไฟร์วอลล์ติดตั้งอยู่บนเซิร์ฟเวอร์ของคุณ คุณสามารถทำได้โดยดำเนินการคำสั่งต่อไปนี้:
apf –d IPADDRESS
csf –d ที่อยู่ IPADDRESS
ปกป้องการโจมตีน้ำท่วม SYN
การใช้คุกกี้ SYN
นี่เป็นวิธีการป้องกันที่มีประสิทธิภาพสูงสุดจากการโจมตี SYN Flood การใช้คุกกี้ SYN ช่วยให้เซิร์ฟเวอร์หลีกเลี่ยงการตัดการเชื่อมต่อเมื่อคิว SYN เต็ม แต่เซิร์ฟเวอร์จะทำงานเหมือนกับว่ามีการขยายคิว SYN แทน เซิร์ฟเวอร์ส่งการตอบสนอง SYN+ACK ที่เหมาะสมไปยังไคลเอนต์ แต่จะละทิ้งรายการคิว SYN หากเซิร์ฟเวอร์ได้รับการตอบกลับ ACK ตามมาจากไคลเอนต์ จะสามารถสร้างรายการคิว SYN ใหม่โดยใช้ข้อมูลที่เข้ารหัสในหมายเลขลำดับ TCP
คุณสามารถเปิดใช้งานคุกกี้ SYN ได้โดยเพิ่มสิ่งต่อไปนี้ใน /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
หลังจากแก้ไขไฟล์การกำหนดค่า sysctl คุณจะต้องดำเนินการคำสั่งต่อไปนี้เพื่อโหลดการตั้งค่า sysctl จากไฟล์ /etc/sysctl.conf
การเพิ่มคิวงานที่ค้างอยู่ใน SYN
เทคนิคการป้องกันเพิ่มเติมคือการเพิ่มขนาดคิวงานที่ค้างอยู่ของ SYS ขนาดเริ่มต้นคือ 1024 ซึ่งสามารถทำได้โดยการเพิ่มสิ่งต่อไปนี้ใน /etc/sysctl.conf
net.ipv4.tcp_max_syn_backlog = 2048
ลดการลอง SYN_ACK อีกครั้ง
การปรับแต่งพารามิเตอร์เคอร์เนล tcp_synack_retries ทำให้เคอร์เนลปิดการเชื่อมต่อสถานะ SYN_RECV ก่อนหน้านี้ ค่าเริ่มต้นคือ 5
net.ipv4.tcp_synack_retries = 3
กำลังตั้งค่าการหมดเวลา SYN_RECV
การลดค่าการหมดเวลาสำหรับ SYN_RECV จะช่วยลดการโจมตี SYN ฟลัด ค่าเริ่มต้นคือ 60 และเราสามารถลดเป็น 40 หรือ 45 ได้ ซึ่งสามารถทำได้โดยเพิ่มบรรทัดต่อไปนี้ใน sysctl.conf
net.ipv4.netfilter.ip_conntrack_tcp_timeout_syn_recv=45
การป้องกันการปลอมแปลง IP
พารามิเตอร์ sysctl ต่อไปนี้จะช่วยป้องกันการปลอมแปลง IP ซึ่งใช้สำหรับการโจมตี SYN ฟลัด
net.ipv4.conf.all.rp_filter = 1
บริษัทโฮสติ้งหลายแห่งให้การป้องกันการโจมตี SYN โดยการปรับใช้ไฟร์วอลล์ที่ใช้การป้องกันน้ำท่วมของ SYN เช่น Netscreen หรือ Appsafe