ฉันจะ จำกัด แบนด์วิดท์ของผู้ใช้ได้อย่างไร?


32

ในการสรุป: ฉันมีเซิร์ฟเวอร์เฉพาะที่มีเพื่อนสองสามคนกำลังเรียกใช้ไคลเอนต์ torrent กับ web gui ผู้ใช้แต่ละคนกำลังเรียกใช้ไคลเอนต์ภายใต้ชื่อผู้ใช้ของพวกเขาบนเซิร์ฟเวอร์เพื่อดาวน์โหลดไปใน dir ผู้ใช้ของพวกเขาและพวกเขาเท่านั้นที่สามารถเข้าถึงไฟล์ของตัวเอง ฯลฯ

ฉันจะตรวจสอบและ จำกัด แบนด์วิดท์ต่อเดือนเป็นรายต่อผู้ใช้ได้อย่างไร

ฉันคิดว่าต้องมีวิธีใช้ iptables บางที และโดยการตรวจสอบแบนด์วิดท์ที่ใช้โดยกระบวนการทั้งหมดของผู้ใช้ X และถ้าพวกเขาใช้มากขึ้นแล้วแบนด์วิดธ์ที่ได้รับอนุญาตรายเดือนของ Y GB พวกเขาได้รับข้อความแจ้งว่าและเครือข่ายถูกบล็อกสำหรับไคลเอนต์ฝนตกหนัก ฉันยังคิดเกี่ยวกับปลาหมึก แต่เห็นว่ามันจะใช้ไคลเอนต์ฝนตกหนักหลายแห่งนี้สามารถใช้ทรัพยากรเซิร์ฟเวอร์จำนวนมาก ...

ฉันใช้เงินเดเบียน

ฉันไม่แน่ใจว่าจะทำอย่างไร ...

สิ่งนี้จะเป็นไปได้หรือไม่? ฉันรู้สึกขอบคุณสำหรับการแก้ปัญหาเพียงบางส่วนของ ...


เราสามารถรู้ได้ว่าคุณใช้ระบบปฏิบัติการใดอยู่
— Sam Cogan

เดเบียน เพิ่มในการแก้ไข
— loco41211

แค่อยากรู้คุณกำลังใช้ TorrentFlux หรือไม่?
— cop1152

เป็นหนึ่งในสิ่งที่ฉันพยายาม ในขณะนี้เรากำลังมองหาสิ่งที่จะใช้สำหรับ seedbox ที่มีพื้นที่ดิสก์ จำกัด (ซึ่งเรามีวิธีแก้ปัญหา) และ จำกัด แบนด์วิดท์ที่เราติดอยู่ .... และเพื่อนของฉันบางคนใช้ประมาณ 1TB ต่อเดือนในขณะที่คนอื่น ๆ Mbs เพียงไม่กี่ ต้องการ จำกัด สิ่งนี้ต่อผู้ใช้อย่างเท่าเทียมกัน
— loco41211

คำตอบ:


13

คุณสามารถใช้คำสั่ง 'tc' traffic shaping

มอบพอร์ตที่แตกต่างให้เพื่อนของคุณแต่ละคนใช้สำหรับ BitTorrent ทำเครื่องหมายแพ็กเก็ต TCP ด้วย iptables สำหรับแต่ละพอร์ต

iptables -t mangle -A FORWARD -p tcp --sport 6881 -j MARK --set-mark 100
iptables -t mangle -A FORWARD -p tcp --dport 6881 -j MARK --set-mark 100

จากนั้นใช้คำสั่ง tc เพื่อตั้งค่าแบนด์วิดท์และอัตราสูงสุดสำหรับผู้ใช้แต่ละคน

ในตอนท้ายของเดือนคุณสามารถลบและเพิ่มคำสั่ง 'tc' เพื่อรีเซ็ตจำนวน

คุณสามารถตรวจสอบการใช้งานสำหรับผู้ใช้แต่ละคนโดย:

tc filter show dev ethX

หากคุณใช้ shorewall ติดตั้ง Debian มันทำให้การสร้างการรับส่งข้อมูลง่ายขึ้นโดยไม่ต้องยุ่งกับ iptables คุณเพิ่งแก้ไข tcdevices, tcclasses และ tcrules ในไดเร็กทอรี / etc / shorewall ข้อมูลเพิ่มเติมที่นี่: http://www.shorewall.net/traffic_shaping.htm

ตามที่คนอื่นแนะนำการทำเครื่องหมายแพ็คเก็ตโดยชื่อผู้ใช้อาจดีกว่าโดยพอร์ตวิธีที่พอร์ตสามารถเปลี่ยนแปลงได้โดยไม่ต้องอัปเดต iptables


คุณยกตัวอย่างการกำหนดวงเงินได้ไหม พูดว่า 100GB ทั้งขาเข้าและขาออกด้วยกันไหม
— loco41211

ทอร์เรนต์สามารถ (และที่จริงแล้ว) ใช้พอร์ตอื่นดังนั้นตัวอย่างจะไม่สามารถแก้ปัญหาได้
— cstamas

ที่เอาทั้งสองตัวเลือกเป็นวิธีแก้ปัญหา ...
— loco41211

cstamas: คุณสามารถตั้งค่าหนึ่งพอร์ตหรือหลายพอร์ตเมื่อใช้ไคลเอ็นต์ bittorrent ดูสิ่งนี้: dessent.net/btfaq/#ports
— chris.moos

13

คุณสามารถลองใช้--quotaตัวเลือกใน iptables ซึ่งอนุญาตให้คุณตั้งค่าขีด จำกัด การถ่ายโอนเป็นไบต์ เนื่องจากคุณใช้ไคลเอนต์ฝนตกหนักหลายตัวแต่ละชื่อภายใต้ชื่อผู้ใช้ที่แตกต่างกันคุณสามารถรวมกับ--uid-ownerตัวเลือกตามที่แนะนำ katriel

ด้วยวิธีนี้คุณสามารถบังคับใช้ขีด จำกัด การโอนต่อระยะเวลา (วัน / สัปดาห์ / เดือน / ฯลฯ ) โดยไม่ต้อง จำกัด ความเร็วในการดาวน์โหลดของผู้ใช้

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


ฟังดูเหมือนว่าจะใช้ได้ ดังนั้นด้วยความช่วยเหลือของ iptables ฉันสามารถทำเครื่องหมายปริมาณการใช้งานทั้งหมดที่เข้ามาและออกไปสำหรับผู้ใช้ชุด และฉันสามารถ จำกัด สำหรับช่วงเวลาที่กำหนด ฉันยังไม่สามารถบอกได้ว่าการตั้งค่าทั้งหมดจะเป็นอย่างไร ดังนั้นคำสั่งที่แน่นอนฉันสามารถใช้เพื่อทำเครื่องหมายการรับส่งข้อมูลขาเข้าและขาออก: "iptables -t mangle -A เอาท์พุท -p tcp เจ้าของ -m - uid- เจ้าของ someuser -j MARK - ชุดเครื่องหมาย 100"? หรือฉันจะทำอย่างไร ตัวอย่างเช่นคำสั่งจะทำเครื่องหมายชื่อผู้ใช้ bob ด้วยรหัส 56 ด้วยขีด จำกัด รายเดือนที่ 100GB ฉันเดางาน cron รายเดือนจะรีเซ็ตตัวนับปริมาณการใช้งานหรือไม่
— loco41211

12

เพียงเพิ่มคำถามข้างต้น

คุณสามารถใช้ iptables กับผู้ใช้ที่ตรงกับสีของแพ็กเก็ตดังนี้:

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner someuser -j MARK --set-mark 100

จากนั้นใช้ 'tc' เพื่อ จำกัด จำนวนต่อผู้ใช้


คุณสามารถยกตัวอย่างเกี่ยวกับวิธีใช้ tc เพื่อกำหนดขีด จำกัด 100GB สำหรับชื่อผู้ใช้ blablaX ได้หรือไม่ และตัวอย่างของรหัสที่ควรใช้เพื่อรีเซ็ตขีด จำกัด หลังจากหนึ่งเดือน? ขอบคุณ
— loco41211

วิธีนี้จะ จำกัด ผู้ใช้เป็นการถาวรและไม่ใช่ในโควต้าที่ตั้งเวลา
— katriel

8

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

ตัวอย่างเช่นสมมติว่าคุณต้องการที่จะกำหนดวงเงินสูงสุดในการดาวน์โหลด250 GB ตอนนี้ถ้าคุณหารด้วยจำนวนชั่วโมงในเดือน (~ 730) แล้วโดย 3600 คุณจะได้รับอัตราการดาวน์โหลดสูงสุดซึ่งในตัวอย่างนี้จะเป็น arount 100 กิโลไบต์ /วินาที

จากนั้นหากคุณตั้งค่าอัตรา DL สูงสุดที่ 100 KB / s คุณจะบังคับใช้ขีด จำกัด การดาวน์โหลด 250 GB / เดือนโดยอัตโนมัติ (โดยแน่นอนว่า Traffic Shaper ของคุณทำงานได้อย่างถูกต้อง) หากผู้ใช้ของคุณไม่สามารถดาวน์โหลดได้เร็วกว่า 100 KB / s ผู้ใช้จะไม่สามารถดาวน์โหลดได้มากกว่า 250 GB / เดือน

เพื่อ จำกัด อัตราการดาวน์โหลดคุณสามารถใช้tcหรือเครื่องมืออื่น ๆ ที่กล่าวถึง หากคุณไม่ต้องการติดต่อโดยตรงtcคุณสามารถใช้cbq.initซึ่งค่อนข้างง่ายในการตั้งค่า สคริปต์นี้มีอยู่ใน Debian Etch เป็นshaperแพ็คเกจ แต่ดูเหมือนว่าจะถูกลบออกหลังจากนั้น อย่างไรก็ตามมันเป็นสคริปต์ง่ายๆที่คุณสามารถดาวน์โหลดได้จาก SourceForge

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


เหตุผลหลักที่เราใช้ seedbox แทน torrents บนคอมพิวเตอร์ของเราเพราะมันเร็วกว่ามากดังนั้นน่าเศร้าที่มันไม่สามารถแก้ปัญหาได้ ... ขอบคุณต่อไป
— loco41211

7

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่แม้ฉันจะสะดุดเมื่อมองหาคำตอบในวันนี้และในที่สุดฉันก็ปะติดปะต่อสิ่งที่เหมาะกับฉัน ฉันมี downlink 25Mbs และอัปลิงค์ 2.5Mbs และมี 4 คนและ 5 เซิร์ฟเวอร์ที่แชร์ลิงก์นี้ กับเซิร์ฟเวอร์อัปลิงค์แบนด์ที่มีความสำคัญ แต่ downlink เป็นประโยชน์กับ 4 คนดังนั้นจึงไม่มีใคร hogs มันทั้งหมด

ฉันใช้ centos 6.3 เป็นเราเตอร์ แต่คำสั่งเหล่านี้ควรทำงานบน linux ใด ๆ eth0 คืออัปลิงค์ของฉันไปยังผู้ให้บริการ eth1 คือ LAN ของฉันผ่านสวิตช์พอร์ต 24 พอร์ตและจุดเชื่อมต่อ wifi ฉัน จำกัด การดาวน์โหลดถึง 5 จาก 25 Mbs (ประมาณ 500KB / วินาที) ฉัน จำกัด การอัปโหลดที่ 200Kbit (ประมาณ 25KB / วินาที)

tc qdisc add dev eth0 root handle 1:0 htb default 99
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 200Kbit ceil 200Kbit prio 2
tc qdisc add dev eth0 parent 1:11 handle 10: sfq perturb 10

tc qdisc add dev eth1 root handle 2:0 htb default 99
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 100Mbit ceil 100Mbit
tc class add dev eth1 parent 2:1 classid 2:11 htb rate 5Mbit ceil 5Mbit prio 2
tc qdisc add dev eth1 parent 2:11 handle 20: sfq perturb 10

จากนั้นเพื่อ จำกัด ผู้ใช้ที่คุณใช้ 2 สาย iptables ต่อผู้ใช้

เพื่อ จำกัด การอัปโหลด:

iptables -t mangle -A POSTROUTING -o eth0 -p tcp -s 192.168.0.100 -j CLASSIFY --set-class 1:11

เพื่อ จำกัด การดาวน์โหลด

iptables -t mangle -A POSTROUTING -o eth1 -p tcp -d 192.168.0.100 -j CLASSIFY --set-class 2:11

เพียงแค่เปลี่ยนที่อยู่ IP และพอร์ต eth ของคุณเพื่อจับคู่คนที่คุณต้องการ จำกัด


3

เพื่อความสมบูรณ์มีภูต userspace trickleที่เรียกว่า สามารถใช้เพื่อ จำกัด แบนด์วิดท์ของกระบวนการเดียว การใช้งานง่ายมาก: fe เพื่อ จำกัด แบนด์วิดท์ที่ใช้โดยความถนัด, คุณสามารถเขียนได้: trickle -d 10 aptitude install wesnothอย่างไรก็ตามเนื่องจากมันทำงานโดยใช้ LD_PRELOAD, มันอาจถูกแทนที่ได้อย่างง่ายดายโดยผู้ใช้ที่เข้าถึงเชลล์.


ไม่มีผู้ใช้รายใดนอกจากตัวฉันเองที่มีสิทธิ์เข้าถึงเชลล์ นอกจากนี้ด้วยการ จำกัด แบนด์วิดท์ฉันหมายถึงต่อเดือนหรือช่วงเวลาที่กำหนด เป็นไปได้ไหม
— loco41211

1
ไม่หยด จำกัด ความเร็วต่อวินาที
— liori

2

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

เนื่องจากผู้สร้าง useripacct ต้องหันไปใช้ kernel patch เพื่อรับพฤติกรรมที่คุณต้องการดูเหมือนว่าไม่น่าจะมีวิธีที่ง่ายกว่าโดยค่าเริ่มต้น ทางเลือกเดียวที่ดูเหมือนจะ จำกัด แบนด์วิดท์ (โดยบางสิ่งบางอย่างเช่น tc หรือหยด) ตามคำแนะนำของคำตอบอื่น ๆ ส่วนใหญ่ที่นี่ (แต่ไม่จริงสิ่งที่คุณกำลังมองหา) หรือสร้าง VM สำหรับผู้ใช้แต่ละคน โดยบางอย่างเช่นOpenVZ ) และทราฟฟิกการบัญชีต่อ VM (ซึ่งประเมินได้ง่ายโดยvnstat ) ซึ่งดูเหมือนว่าเกินความจริง (ทันใดนั้นคุณมี VM จำนวนมากที่จะจัดการแทนระบบเดียว)


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