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


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.