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