IPTABLES - อัตรา จำกัด ของ IP ขาเข้าเฉพาะ


103

ฉันไม่ต้องการ จำกัด อัตราการให้บริการเฉพาะ เป้าหมายของฉันคือการ จำกัด อัตราตามที่อยู่ IP ที่เข้ามาเท่านั้น ตัวอย่างเช่นการใช้กฎหลอก:

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

ฉันจะ จำกัด อัตราการใช้ IPTables ตามที่อยู่ IP ขาเข้าได้อย่างไร

คำตอบ:


165

IPTables ไม่ได้ถูกสร้างขึ้นสำหรับงานประเภทนี้ซึ่งต้องมีการวิเคราะห์แพ็คเก็ตจำนวนมากเพื่อทำการตัดสินใจเหล่านี้ IPTables เป็นคำตอบบางส่วน!

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

สมมติว่า eth0 เป็นอุปกรณ์ที่ส่งออกคุณจะต้องสร้างคิวควบคุมการรับส่งข้อมูลตามคลาสซึ่งโดยปกติแล้วจะส่งออกปริมาณการรับส่งข้อมูลผ่านคิว 'เร็ว' และใส่รายชื่อบุคคลลงในคิว 'ช้า'

ความสวยงามของสิ่งนี้คือคุณสามารถสร้างสถานการณ์ที่คุณอนุญาตการรับส่งข้อมูลขาออกจำนวนมากสำหรับผู้ใช้ที่ช้ายกเว้นคลาสที่มีการแทนที่ต้องการแบนด์วิดท์ แต่ตัวอย่างนี้ไม่ได้ทำ (จะให้ 10kbps แก่ผู้ใช้ที่ช้า) ระบบการเข้าคิวจะมีลักษณะดังนี้:

                         Inbound traffic
                              +
                              |
                              |
                              v
                     +------------------+
                     |   Class 1:1      |
                     |------------------|
                     |  Root (all flows)|
                     |       100mbit    |
                     +-----+-----+------+
                           |     |
                           |     |
                           |     |
                           |     |
                           |     |
          +----------+     |     |     +----------+
          |    1:11  +-----+     +-----+    1:12  |
          |----------|                 |----------|
          | Default  |                 | Slow     |
          |100mb-80kb|                 |   80kb   |
          +----------+                 +----------+

ในการทำสิ่งนี้ก่อนอื่นคุณจะต้องตั้งค่าวินัยการเข้าคิวในเคอร์เนล สิ่งต่อไปนี้จะทำเพื่อคุณ .. คุณต้องเรียกใช้สิ่งนี้เป็นสคริปต์เดียวทั้งหมด

#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit

tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo

"ค่าเริ่มต้น 11" มีความสำคัญเนื่องจากจะบอกเคอร์เนลว่าจะทำอย่างไรกับการรับส่งข้อมูลที่ไม่ได้จัดประเภท

เมื่อเสร็จแล้วคุณสามารถตั้งค่ากฎ iptables เพื่อจัดประเภทแพ็กเก็ตที่ตรงกับเกณฑ์ที่กำหนด หากคุณวางแผนที่จะนำผู้คนจำนวนมากเข้ามาในกฎที่ช้านี้กฎ ipset จะเหมาะสมกว่า (ซึ่งควรจะมีให้ใน rhel6 ฉันเชื่อว่า)

ดังนั้นสร้างฐานข้อมูล ipset เพื่อทำการจับคู่กับ ...

ipset create slowips hash:ip,port

จากนั้นสร้างกฎ iptables เพื่อทำการจับคู่ ..

iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12

สิ่งนี้สั่งให้เคอร์เนลว่าถ้าคุณจับคู่ IP ปลายทางกับพอร์ตต้นทางจากชุดให้แบ่งมันเป็นคิวช้าที่คุณตั้งค่าด้วยการควบคุมการจราจร

ทีนี้ในที่สุดเมื่อใดก็ตามที่คุณต้องการทำให้ IP ช้าลงคุณสามารถใช้คำสั่ง ipset เพื่อเพิ่ม ip ให้กับชุดเช่นนี้:

ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...

คุณสามารถทดสอบการทำงานโดยใช้คำสั่ง "tc -s class show dev eth0" และคุณจะเห็นสถิติในนั้นระบุว่าแพ็คเก็ตจะถูกเปลี่ยนเส้นทางไปยังคิวช้า

โปรดทราบข้อเสียที่แท้จริงเพียงอย่างเดียวของเรื่องนี้คือการทำให้อยู่รอดได้ ฉันไม่คิดว่ามีสคริปต์เริ่มต้นใด ๆ ที่สามารถสร้าง ipsets จากการทิ้งเมื่อรีบูต (และต้องสร้างก่อนกฎ iptables) และฉันมั่นใจว่าไม่มีสคริปต์เริ่มต้นที่จะรีเซ็ตกฎการควบคุมปริมาณการใช้งานเมื่อรีบูต หากคุณไม่ใส่ใจคุณสามารถสร้างสิ่งใหม่ทั้งหมดจากการเรียกใช้สคริปต์ใน rc.local


3
ฉันไม่สามารถขอบคุณได้มากพอ นี่เป็นคำอธิบายและให้ข้อมูลที่ดีมาก ต่อมาฉันก็รู้ว่าความรู้เกี่ยวกับ TC นั้นจำเป็นและฉันก็เริ่มมองหาสิ่งนี้ ขอบคุณอีกครั้ง!
James

โอ้และสำหรับการสูญเสียการเชื่อมต่อ ฉันกำลังทำให้แน่ใจว่าฉันมีการกำหนดค่าลงก่อนที่จะย้ายจาก VPS ของฉันไปยังเครื่องโฮสต์ นอกจากนี้ฉันมีการเข้าถึง VPN ไปยังเครือข่ายส่วนตัวบน ETH0 ฉันจะทำงานกับ ETH1 เท่านั้นโดยทางทฤษฎีแล้วฉันไม่มีปัญหา แต่ได้ยินคำเตือน!
James

2
ฉันไม่สามารถบอกคุณได้ว่าฉันได้อ่านบทแนะนำที่คล้ายกันกี่ครั้งนี่เป็นครั้งแรกที่ทำให้รู้สึก
RC1140

5
โดยทั่วไปแล้วมันมีความเหมาะสมมากกว่าที่จะทำข้อ จำกัด ทรัพยากรเช่นนี้ในกลุ่มควบคุม (อีกครั้งเป็นไปได้และยังใช้งานน้อยและยอดเยี่ยม) เนื่องจากคุณสามารถกำหนดขีด จำกัด ต่อแอปพลิเคชันในซีพียูหน่วยความจำ IO และเครือข่ายในที่เก็บนโยบายส่วนกลาง ' แต่ยังไม่ได้เห็นคำถามดังกล่าวกำลังโพสต์เพื่อเสนอคำตอบ
Matthew Ife

2
หากคุณไม่ชอบtcไวยากรณ์คุณสามารถลองใช้tcngซึ่งเพิ่มภาษาที่เป็นมิตรกับผู้ใช้ที่สร้างtcคำสั่งขึ้นอีกเล็กน้อย echo '... multi line tcng configuration ...' | tcng | shฉันได้ใช้ที่ชอบในสคริปต์เปลือก:
Mattias Wadman

5

ง่ายเหมือนการกำหนดกฎการ จำกัด อัตราและเพิ่ม-sสวิตช์ -sสวิทช์ตรงกับ IP ที่เข้ามา ตัวอย่างเช่นiptables -A INPUT -s 1.1.1.1จากนั้นใช้วิธีการ จำกัด อัตราที่คุณต้องการสำหรับกฎนั้น


ขอบคุณสำหรับคำตอบที่รวดเร็ว น่าเสียดายที่ปัญหาหลักของฉันคือครึ่งหลัง ฉันได้ดู --limit แล้วและฉันไม่ได้เห็นสิ่งใดที่อนุญาตให้ฉัน จำกัด ตาม KB / s - ทิศทางใดที่คุณสามารถชี้ฉันได้
James

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