น้ำท่วมเป็นวิธีที่ง่ายที่สุดและพบได้บ่อยที่สุดในการโจมตี 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=1

UDP น้ำท่วม

วิธีการฟลัดแบนด์วิธ ขึ้นอยู่กับการส่งแพ็คเก็ต 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_ลองใหม่:

ค่าจำนวนเต็ม 1 ไบต์ tcp_synack_retries ระบุจำนวนครั้งในการลองใช้แพ็กเก็ต SYNACK อีกครั้งสำหรับการเชื่อมต่อ TCP แบบพาสซีฟ จำนวนครั้งในการพยายามไม่ควรเกิน 255 ค่าเริ่มต้นคือ 5 สอดคล้องกับเวลาประมาณ 180 วินาทีสำหรับความพยายามในการเชื่อมต่อ

cat /proc/sys/net/ipv4/tcp_synack_retries 5

ลดเหลือ 1 (ประมาณ 9 วินาที):

เสียงก้อง "1" > /proc/sys/net/ipv4/tcp_synack_retries

tcp_fin_timeout

จำนวนเต็มในไฟล์ tcp_fin_timeout กำหนดระยะเวลาที่ซ็อกเก็ตยังคงอยู่ในสถานะ FIN-WAIT-2 หลังจากที่ปิดโดยฝั่งโลคัล เพียร์ไม่อาจปิดการเชื่อมต่อนี้ ดังนั้นควรปิดด้วยความคิดริเริ่มของตนเองหลังจากหมดเวลาหมดเวลาแล้ว การหมดเวลาเริ่มต้นคือ 60 วินาที โดยทั่วไปเคอร์เนลซีรีส์ 2.2 จะใช้ค่า 180 วินาที และคุณสามารถบันทึกค่านี้ได้ แต่โปรดจำไว้ว่าบนเซิร์ฟเวอร์เว็บที่ไม่ว่าง คุณเสี่ยงต่อการสิ้นเปลืองหน่วยความจำจำนวนมากเพื่อรักษาการเชื่อมต่อที่เสียหายครึ่งหนึ่ง ซ็อกเก็ตที่อยู่ในสถานะ FIN-WAIT-2 มีอันตรายน้อยกว่า FIN-WAIT-1 เนื่องจากใช้หน่วยความจำไม่เกิน 1.5 KB แต่สามารถใช้งานได้นานกว่า

แมว /proc/sys/net/ipv4/tcp_fin_timeout 60

เปลี่ยนเป็น 30:

เสียงก้อง "30" > /proc/sys/net/ipv4/tcp_fin_timeout

tcp_keepalive_probes

ตัวแปรจำนวนเต็ม tcp_keepalive_probes ระบุจำนวนของโพรบ Keepalive ที่ส่งก่อนที่การเชื่อมต่อจะถูกพิจารณาว่าปิด ตามค่าเริ่มต้น จะมีการส่งตัวอย่าง 9 ตัวอย่าง

แมว /proc/sys/net/ipv4/tcp_keepalive_probes 9

เสียงสะท้อน "5" > /proc/sys/net/ipv4/tcp_keepalive_probes

tcp_keepalive_intvl

ตัวแปรจำนวนเต็ม tcp_keepalive_intvl ระบุช่วงเวลาการสุ่มตัวอย่าง ผลิตภัณฑ์ tcp_keepalive_probes * tcp_keepalive_intvl กำหนดเวลาหลังจากที่การเชื่อมต่อจะถูกปิดหากไม่มีการตอบสนอง ช่วงเวลาเริ่มต้นคือ 75 วินาที กล่าวคือ เวลาในการตัดการเชื่อมต่อหากไม่มีการตอบสนองจะอยู่ที่ประมาณ 11 นาที

แมว /proc/sys/net/ipv4/tcp_keepalive_intvl 75

มาตั้งค่าเป็น 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

สิ่งพิมพ์ที่เกี่ยวข้อง