ใช้ IPtables หรือเส้นทางที่ไม่มีค่าใช้จ่ายในการขึ้นบัญชีดำประมาณ 1 ล้านที่อยู่ IP ใช่ไหม


22

ฉันเจอสถานการณ์ที่ลูกค้าต้องการขึ้นบัญชีดำชุดของที่อยู่ IP ต่ำกว่า 1 ล้านรายการ (ไม่มีซับเน็ต) และประสิทธิภาพของเครือข่ายเป็นเรื่องที่น่ากังวล ในขณะที่ฉันคาดเดาว่ากฎ IPTables จะส่งผลกระทบต่อประสิทธิภาพน้อยกว่าเส้นทาง แต่นั่นเป็นเพียงการคาดเดา

ใครบ้างมีหลักฐานที่มั่นคงหรือเหตุผลอื่น ๆ เพื่อสนับสนุน IPTables หรือการกำหนดเส้นทางโมฆะเป็นวิธีการแก้ปัญหาในการขึ้นบัญชีดำรายการที่อยู่ยาว ในกรณีนี้ทุกอย่างเป็นไปโดยอัตโนมัติดังนั้นการใช้งานง่ายจึงไม่เป็นปัญหา

แก้ไข 26-Nov-11

หลังจากการทดสอบและการพัฒนาปรากฏว่าไม่มีตัวเลือกใดที่สามารถใช้งานได้ ดูเหมือนว่าทั้งการค้นหาเส้นทางและ iptables ทำการค้นหาเชิงเส้นผ่านชุดกฎและใช้เวลานานเกินไปในการประมวลผลกฎจำนวนมากนี้ บนฮาร์ดแวร์ที่ทันสมัยการวางรายการ 1M ในบัญชีดำ iptables ทำให้เซิร์ฟเวอร์ช้าลงประมาณ 2 โหลแพ็กเก็ตต่อวินาที ดังนั้นเส้นทาง IPTables และ null จึงหมดไป

ipsetตามคำแนะนำของ Jimmy Hedman จะดีมากยกเว้นว่าจะไม่อนุญาตให้คุณติดตามที่อยู่มากกว่า 65536 รายการในชุดดังนั้นฉันจึงไม่สามารถลองใช้งานได้หากไม่มีใครมีความคิดใด ๆ

เห็นได้ชัดว่าทางออกเดียวสำหรับการบล็อก IP จำนวนมากนี้กำลังทำการค้นหาที่มีการจัดทำดัชนีในชั้นแอปพลิเคชัน นั่นไม่ใช่เหรอ?


ข้อมูลมากกว่านี้:

กรณีการใช้งานในอินสแตนซ์นี้กำลังบล็อกรายการ "ที่รู้จักผู้กระทำผิด" ของที่อยู่ IP ไม่ให้เข้าถึงเนื้อหาแบบคงที่บนเว็บเซิร์ฟเวอร์ FWIW การทำการบล็อกผ่าน Apache Deny fromนั้นช้าพอ ๆ กัน (ถ้าไม่มาก) เช่นเดียวกันกับการสแกนเชิงเส้น


FYI: วิธีแก้ปัญหาการทำงานขั้นสุดท้ายคือการใช้ mod_rewrite ของ apache ร่วมกับแผนที่ berkeley DB เพื่อทำการค้นหากับบัญชีดำ ลักษณะที่เป็นดัชนีของ berkeley DBs อนุญาตให้รายการขยายขนาดด้วยประสิทธิภาพ O (บันทึก N)


5
ipset ( ipset.netfilter.org ) ไม่ได้ถูกออกแบบมาให้ใช้เพื่อจัดการกับปัญหาประเภทนี้มากกว่านี้หรือไม่
Jimmy Hedman

@JimmyHedman: คุณควรทำคำตอบนั้น และจากนั้นเพิ่มคำแนะนำเพื่อวัดประสิทธิภาพที่ทำได้ทั้ง 3 วิธี :)
กี้

ฉันอยากรู้ว่าคุณจะให้ข้อมูลเพิ่มเติมเกี่ยวกับปัญหาที่คุณพยายามแก้ไขได้ไหม บางทีการบล็อกที่อยู่ IP 1M ไม่ใช่วิธีการแก้ไขปัญหาใช่ไหม
SpacemanSpiff

มันจะช่วยได้มากในการทราบสาเหตุที่คุณต้องการปิดกั้นที่อยู่จำนวนมากและไม่ว่าคุณต้องการกรองการรับส่งข้อมูลของ INPUT หรือไปข้างหน้า
Juliano

ที่นี่คุณสามารถดูวิธีที่ ipset สร้างกฎ iptables เกี่ยวกับ 11x เร็วกว่ากฎ iptables ปกติ daemonkeeper.net/781/mass-blocking-ip-addresses-with-ipsetหวังความช่วยเหลือนี้
Alien Torres

คำตอบ:


15

ลองใช้ iptables และสร้างแผนผังหลายระดับเพื่อลดจำนวนการค้นหา

iptables -N rules_0_0_0_0_2
iptables -N rules_64_0_0_0_2
iptables -N rules_128_0_0_0_2
iptables -N rules_192_0_0_0_2
iptables -N rules_0_0_0_0_4
iptables -N rules_16_0_0_0_4

iptables -A INPUT -p tcp --dport 80 -s 0.0.0.0/2 -j rules_0_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 64.0.0.0/2 -j rules_64_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 128.0.0.0/4 -j rules_128_0_0_0_2
iptables -A INPUT -p tcp --dport 80 -s 192.0.0.0/4 -j rules_192_0_0_0_2

iptables -A rules_0_0_0_0_2 -s 0.0.0.0/4 -j rules_0_0_0_0_4
iptables -A rules_0_0_0_0_2 -s 16.0.0.0/4 -j rules_16_0_0_0_4

และอื่น ๆ - เพิ่มระดับการซ้อน เห็นได้ชัดว่าคุณต้องการวิธีสร้างกฎโดยอัตโนมัติและคุณควรมีเครือข่ายสำหรับเครือข่ายที่คุณมีผู้กระทำความผิดหนึ่งคนหรือมากกว่า - ด้วยวิธีนี้คุณสามารถลดจำนวนการค้นหาที่ต้องทำค่อนข้างมากและฉันคิดว่ามันอาจ ใช้งานได้จริง


สิ่งนี้ฟังดูราวกับว่ามันสามารถใช้งานได้ช่วยลดความซับซ้อนของเวลาในการค้นหากฎไฟร์วอลล์จาก O (n) เป็น O (log n) ได้อย่างมีประสิทธิภาพสร้างแผนผังการค้นหาใน iptables ได้อย่างมีประสิทธิภาพ
ต่อ von Zweigbergk

หากคุณตัดสินใจที่จะใช้เส้นทางนี้อาจเป็นประโยชน์ในการใช้อัลกอริทึมเพื่อสร้างแผนภูมิการค้นหาแบบทวิภาคที่สมดุลจากรายการที่อยู่ IP จากนั้นเพียงแค่ทิ้งโครงสร้างของต้นไม้การค้นหานั้นเป็นชุดของกฎ IPtables
ต่อ von Zweigbergk

@Per von Zweigbergk - แน่นอน ... หรือเพียงแค่ตัดต้นไม้ในช่วงต้นที่ไม่จำเป็นต้องค้นหาลึก แม้ว่าการโหลดกฎที่ไม่ดีจะใช้เวลานาน
pQd

นี่เป็นวิธีการที่ดีมาก เห็นได้ชัดว่ามันต้องการการประมวลผลเล็กน้อยเพื่อรักษา แต่มันเป็นความคิดที่ถูกต้องฉันคิดว่า
tylerl

3
@pQd หลังจากความล้มเหลวก่อนหน้านี้ด้วย iptables และคณะฉันใช้โซลูชันใน apache โดยใช้RewriteMapกับฐานข้อมูล Berkeley แต่กลไกที่เร็วที่สุดของฉันโดยใช้ iptables ในลูปโหลดประมาณ 100 กฎต่อวินาทีในขณะที่ iptables-restore ได้ตั้งค่าทั้งหมดในเวลาประมาณ 4 วินาที นี่คือคอมพิวเตอร์เดสก์ท็อปที่ดีที่สุด กลไก RewriteMap มีผลกระทบต่อประสิทธิภาพการทำงานที่ต่ำมาก
tylerl

11

นี่คือสิ่งที่ipsetมีไว้สำหรับ

จากเว็บไซต์ของhttp://ipset.netfilter.org/ :

ถ้าคุณต้องการ

  • จัดเก็บที่อยู่ IP หลายแห่งหรือหมายเลขพอร์ตและจับคู่กับการรวบรวมโดย iptables ในคราวเดียว
  • อัปเดตกฎ iptables แบบไดนามิกกับที่อยู่ IP หรือพอร์ตโดยไม่มีการลงโทษประสิทธิภาพ
  • แสดงที่อยู่ IP ที่ซับซ้อนและชุดกฎที่อิงกับพอร์ตด้วยกฎ iptables เดียวและได้รับประโยชน์จากความเร็วของชุด IP

ipset อาจเป็นเครื่องมือที่เหมาะสมสำหรับคุณ

มันถูกเขียนโดยสมาชิกในทีมหลักของเน็ตฟิลเตอร์ Jozsef Kadlecsik (ผู้ที่เขียนเป้าหมาย REJECT) ดังนั้นนี่จึงเป็นตัวเลือกที่ดีที่สุดที่ฉันสามารถนึกได้

มันรวมอยู่ในเมล็ดข้าวด้วย


เท่าที่ฉันเห็น ipset จะมีจำนวนที่อยู่ IP 65k มีชุดประเภทใดบ้างที่สามารถจัดการรายการ 1M ได้หรือไม่?
tylerl

7
หากคุณใช้ประเภทชุดแฮช: ip คุณสามารถมีที่อยู่จำนวนมากได้ ฉันลอง 1000000 และประสิทธิภาพก็ค่อนข้างดี หากคุณตั้งค่ากฎ -m - สถานะ ESTABLISHED ก่อนตรวจสอบชุดของคุณคุณสามารถตรวจสอบให้แน่ใจว่าคุณตรวจสอบชุดการเชื่อมต่อใหม่ซึ่งจะเพิ่มประสิทธิภาพเมื่อจัดการกับแพ็คเก็ตจำนวนมาก
Matthew Ife

มูลค่าการกล่าวถึงแม้ว่าการใช้หน่วยความจำของ ipset ที่มีที่อยู่ 1M เริ่มมีขนาดใหญ่ขึ้น ตามโพสต์นี้ในรายชื่อผู้รับจดหมาย netfilterสูตร 2015 ปัจจุบันสำหรับขนาดแฮช ipset H * 40byte + (N/4 + N%4) * 4 * element sizeซึ่งมีขนาดประมาณ 64MB สำหรับที่อยู่ 1M ในแฮชสล็อต 1.5 ม. การใช้โซลูชัน apache / berkdb จัดเก็บข้อมูลบนดิสก์และโหลดหน้าของที่อยู่ที่ใช้งานอยู่เท่านั้น
M Conrad

5

ฉันยังไม่ได้ทดสอบตัวเอง แต่เมื่อฉันได้ยินคำอธิบายปัญหาของคุณฉันคิดทันที " pf" (จาก OpenBSD)

pfมีแนวคิดของตารางที่อยู่ซึ่งอาจเป็นสิ่งที่คุณกำลังมองหา

ตามที่บางมากipsetวิจัยคร่าวๆที่ผมทำก็จะดูเหมือนว่าเรื่องนี้มีศักยภาพที่จะขนาดดีกว่า ตามบทของคำถามที่พบบ่อยเกี่ยวกับตัวเลือกรันไทม์ของ PF โดยไม่ต้องปรับจูน pf สนับสนุนทั้งหมด 1,000 ตารางโดยมีทั้งหมด 200,000 รายการในทุกตารางโดยค่าเริ่มต้น (100,000 ถ้าระบบมีหน่วยความจำกายภาพ <100MB) สิ่งนี้ทำให้ฉันเชื่อว่าอย่างน้อยก็คุ้มค่าที่จะลองทดสอบเพื่อดูว่ามันใช้งานได้ในระดับที่มีประโยชน์หรือไม่

แน่นอนฉันสมมติว่าคุณกำลังใช้เซิร์ฟเวอร์ของคุณบน Linux ดังนั้นคุณต้องมีกล่องไฟร์วอลล์แยกต่างหากที่ใช้ระบบปฏิบัติการบางตัวที่มี pf (เช่น OpenBSD หรือ FreeBSD) คุณยังสามารถปรับปรุงทรูพุตได้ด้วยการกรองแพ็คเก็ตที่มีประสิทธิภาพ


การแปลงสถาปัตยกรรมเซิร์ฟเวอร์ของลูกค้าเป็น BSD ไม่ใช่ตัวเลือกจริงๆ อย่างน้อยก็คิดนอกกรอบ
tylerl

2
คุณไม่ต้องแปลงสถาปัตยกรรมเซิร์ฟเวอร์ทั้งหมดเป็น BSD มันจะเพียงพอที่จะสร้างไฟร์วอลล์เพื่อวางไว้ด้านหน้าเซิร์ฟเวอร์จริง (ง่ายพอที่จะทำใน VM.)
ต่อ von Zweigbergk

2

คุณตรวจสอบโดยใช้ FIB_TRIE แทน FIB_HASH

FIB_TRIE น่าจะมีขนาดที่ดีขึ้นสำหรับจำนวนคำนำหน้าของคุณ (เส้นทางที่เป็นโมฆะ / 32s ยังคงเป็นคำนำหน้าเฉพาะที่เฉพาะเจาะจงมาก)

คุณอาจต้องคอมไพล์เคอร์เนลของคุณเองเพื่อใช้งาน แต่มันก็ช่วยได้

FIB_TRIE หมายเหตุ


2

สำหรับลูกหลาน: ตามipsetเอกสารขนาดเริ่มต้นของชุดคือ 65536 สิ่งนี้สามารถเปลี่ยนแปลงได้โดยตัวเลือก

maxelem พารามิเตอร์นี้ใช้ได้สำหรับคำสั่งสร้างของชุดแฮชทั้งหมด มันจะกำหนดจำนวนสูงสุดขององค์ประกอบที่สามารถเก็บไว้ในชุดเริ่มต้น 65536 ตัวอย่าง:ipset create test hash:ip maxelem 2048.

ฉันใส่ที่นี่เพราะฉันยังไม่สามารถแสดงความคิดเห็น


1

หมายเหตุที่เป็นประโยชน์สำหรับทุกคนที่สะดุดปัญหานี้ในอนาคต:

ก่อนอื่นอย่าวิเคราะห์ปริมาณข้อมูลที่คุณไม่ต้องการ หากคุณบล็อกการรับส่งข้อมูล TCP ตัวอย่างเช่นกรองแพ็กเก็ต SYN เท่านั้นซึ่งเป็นวิธีที่คุณกดตัวกรองเพียงครั้งเดียวต่อการเชื่อมต่อ คุณสามารถใช้-m stateหากคุณต้องการ แต่การติดตามการเชื่อมต่อมีโอเวอร์เฮดของตัวเองซึ่งคุณอาจต้องการหลีกเลี่ยงหากประสิทธิภาพการทำงานเป็นปัญหา

ประการที่สองการใส่กฎหลายล้านกฎลงใน iptables ใช้เวลานาน: หลายนาที หากคุณจำเป็นต้องติดตามเอนทิตีหลาย ๆ แห่งคุณควรหลีกเลี่ยง Netfliter ขนาดที่แท้จริงของ ruleset สร้างความแตกต่าง

ประการที่สามเป้าหมายคือเพื่อหลีกเลี่ยงการสแกนเชิงเส้น แต่น่าเสียดายที่ทั้ง iptables และ iproute2 นั้นเป็นเส้นตรง คุณสามารถแบ่งกฎของคุณออกเป็น binary-tree-style เป็น chain จำนวนมากซึ่ง จำกัด จำนวนกฎที่คุณต้องปรึกษา แต่ถึงกระนั้น iptables ก็ไม่เหมาะสำหรับปัญหานี้ มันจะใช้งานได้ แต่เป็นการสูญเสียทรัพยากรที่มีค่า

ข้อที่สี่และที่สำคัญที่สุดคือการผลักภาระงานของคุณไปยังพื้นที่ผู้ใช้ไม่ใช่ความคิดที่ไม่ดี สิ่งนี้ช่วยให้คุณสามารถเขียนรหัสที่รัดกุมของคุณเองหรือใช้วิธีแก้ปัญหาแบบ off-the-shelf ที่ปรับไปยังชุดปัญหาของคุณ ทางออกของฉันเองสำหรับปัญหานี้ดังที่กล่าวมาคือการใช้การค้นหา BDB ที่ถูกเรียกผ่านระบบ mod_rewrite ของ apache สิ่งนี้มีประโยชน์เพิ่มเติมในการทริกเกอร์การค้นหาหนึ่งครั้งต่อเซสชันเท่านั้นและหลังจากที่ส่งคำขอที่ถูกต้องเท่านั้น ในกรณีนี้ประสิทธิภาพการทำงานเร็วมากและค่าใช้จ่ายของบล็อกลิสต์นั้นเล็กน้อยมาก

คุณสามารถทำเช่นการจัดการ userspace คล้ายกับ iptables โดยใช้เป้าหมายร่วมกับ-j QUEUE libnetfilter_queueเครื่องมือนี้มีประสิทธิภาพเรียบง่ายและมีเอกสารไม่ดี ฉันขอแนะนำให้อ่านมากที่สุดเท่าที่เป็นไปได้จากแหล่งที่มากที่สุดเท่าที่จะหาได้เนื่องจากมีเนื้อหาที่น่าสนใจมากมายกระจายอยู่ทั่วเว็บซึ่งไม่ได้เป็นส่วนหนึ่งของเอกสารทางการใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.