kullanıcı bant genişliği başına nasıl sınırlayabilirim?


32

Özetlemek gerekirse: web gui ile torrent istemcisi çalıştıran birkaç arkadaşımla birlikte özel bir sunucum var. Her kullanıcı sunucuda kullanıcı adı altında bir istemci kullanıyor, böylece indirmeler kendi kullanıcı dizinine giriyor ve yalnızca kendi dosyalarına erişebiliyorlar.

Aylık bant genişliğini kullanıcı bazında nasıl izleyebilir ve sınırlandırabilirim?

Belki iptables kullanmanın bir yolu olmalıydı. Ve X kullanıcısının tüm işlemlerinde kullanılan bant genişliğini izleyerek. Ve eğer daha sonra Y GB’nin aylık izin verilen bant genişliğini daha fazla kullandılarsa, torrent istemcileri için ağ bağlantısının engellendiğini veya müşterinin tamamen öldürüldüğünü söyleyen bir mesaj alırlar. Ayrıca kalamar hakkında da düşündüm, ama birçok torrent istemcisi kullanıyormuş gibi görünce, bu birçok sunucu kaynağı kullanabilirdi ...

Debian Lenny kullanıyorum.

Bunu nasıl yapacağımdan emin değilim.

Bu mümkün olabilir mi? Bunun için sadece kısmi çözümler için minnettarım ...


Hangi işletim sistemini kullandığınızı biliyoruz.
Sam Cogan,

debian. Düzenlemeye eklendi.
loco41211

Sadece merak ediyorum, TorrentFlux kullanıyor musunuz?
cop1152

denedim şeylerden biri. Şu anda disk alanı sınırlaması olan (bunun için bir çözümümüz var) ve bant genişliği sınırlaması olan bir tohumluk kutusu için kullanabileceğimiz herhangi bir şey arıyoruz ... ve bazı arkadaşlarım ayda 1 TB civarında kullanıyorlar ... sadece birkaç MB. Bunu kullanıcı başına eşit olarak sınırlamak istiyoruz.
loco41211

Yanıtlar:


13

'Tc' trafik şekillendirme komutunu kullanabilirsiniz.

Her arkadaşınıza BitTorrent için kullanabilecekleri farklı bir bağlantı noktası verin. TCP paketlerini her port için iptables ile işaretleyin.

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

Ardından, her kullanıcı için maksimum bant genişliğini ve oranı ayarlamak için tc komutunu kullanın.

Ayın sonunda, sayıları sıfırlamak için 'tc' komutlarını silebilir ve ekleyebilirsiniz.

Her kullanıcı için kullanımı takip ederek:

tc filter show dev ethX

Debian yükleme shorewall kullanıyorsanız, iptables ile uğraşmadan trafik şekillendirme yapmak gerçekten çok kolay. Sadece / etc / shorewall dizinindeki tcdevices, tcclasses ve tcrules öğelerini düzenlersiniz. Daha fazla bilgi burada: http://www.shorewall.net/traffic_shaping.htm

Diğer kişinin önerdiği gibi, paketleri kullanıcı adına göre işaretlemek muhtemelen porttan daha iyidir, bu şekilde portlar iptables güncellenmeden değiştirilebilir.


limit belirleme konusunda bir örnek verebilir misiniz? Birlikte 100GB gelen ve giden söyle?
loco41211

torrent (ve aslında) başka portlar kullanabilir, bu nedenle örnek problemi gerçekten çözmez.
cstamas

Bu iki seçeneği bir çözüm olarak ortadan kaldırıyor ...
loco41211

cstamas: Bir bittorrent istemcisi kullanırken bir bağlantı noktası veya birden fazla bağlantı noktası ayarlayabilirsiniz. bkz: dessent.net/btfaq/#ports
chris.moos

13

Bu --quotaseçeneği iptables'ta kullanmayı deneyebilirsiniz ; bu, bayt cinsinden bir aktarım limiti belirlemenizi sağlar. Her biri farklı bir kullanıcı adı altında birden fazla torrent istemcisi çalıştırdığınız için, bunu--uid-owner Katriel'in önerdiği gibi seçenekle .

Bu şekilde, kullanıcılarınızın indirme hızını sınırlamadan zaman periyodu başına bir gün (gün / hafta / ay / vb.) Bir transfer limiti uygulayabilirsiniz.

Paket sayaçlarını kalıcı kılmak için, düzenli aralıklarla (örneğin bir cron işi aracılığıyla) kaydetmeniz gerekir; böylece sunucuyu yeniden başlatmanız veya güvenlik duvarı kurallarını silmeniz gerekebilirse bunları geri yükleyebilirsiniz.


işe yarayacak gibi geliyor. Bu yüzden iptables yardımı ile ayarlanmış bir kullanıcı için gelen ve çıkan tüm trafiği işaretleyebiliyorum. Ve belli bir süre için sınırlayabilirim. Yine de tüm kurulumun nasıl olacağını çözemiyorum. Öyleyse, gelen ve giden trafiği işaretlemek için kullanabileceğim tam komut şu: "iptables -t mangle - A OUTPUT - p tcp - m sahibi --uid-sahibi bazı kullanıcı -j MARK - set-mark 100"? Veya nasıl yaparım? Örneğin bu komut kullanıcı adı bob'unu 56 id'lık aylık 100GB limiti ile işaretlemek için ne olurdu? Sanırım aylık bir cron işi trafik sayacını sıfırlar mı?
loco41211

12

Sadece yukarıdaki soruya eklemek için.

Paketleri renklendirmek için kullanıcı eşleştirmeli iptables kullanabilirsiniz:

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

Ve sonra kullanıcı bazında sınırlamak için 'tc' kullanın.


BlablaX kullanıcı adı için 100GB sayısının sınırını belirlemek için tc kullanımına bir örnek verebilir misiniz? Ve bir ay sonra limiti sıfırlamak için kullanılması gereken kodun bir örneği? Thank you
loco41211

Bu, kullanıcıyı kalıcı olarak ve zamanlanmış bir kotaya göre
kısıtlayamaz

8

Aylık olarak her bir kullanıcı için ne kadar aylık trafiğe izin vermek istediğinize bağlı olarak, diğer kullanıcılar tarafından önerilen araçlardan bazılarını kullanarak buna uygun bir bant genişliği sınırı belirleyebilirsiniz.

Örneğin, maksimum 250 GB / ay indirme limiti belirlemek istediğinizi varsayalım . Şimdi, bunu aydaki saat sayısına (~ 730) ve ardından 3600'e bölerseniz, bu örnekte 100 KB / s olan maksimum indirme oranını elde edersiniz .

Ardından, maksimum 100 KB / sn DL hızını ayarlarsanız, 250 GB / ay indirme sınırınızı otomatik olarak zorlarsınız (elbette trafik düzenleyicinizin düzgün çalıştığını varsayarak). Kullanıcılarınız 100 KB / sn'den daha hızlı indiremezlerse, 250 GB / ay'dan daha fazla indirme yapamazlar.

İndirme oranını sınırlamak için tc, belirtilen diğer araçlardan bazılarını kullanabilirsiniz . Doğrudan uğraşmak istemiyorsanız tc, ayarlamak oldukça basit olan cbq.init'i kullanabilirsiniz . Bu senaryo Debian Etch’deshaper paket olarak mevcuttu, ancak bundan sonra kaldırılmış gibi görünüyor. Her neyse, SourceForge'dan indirebileceğiniz basit bir script.

Tabii ki bu yaklaşım sizin durumunuz için yararlı olmayabilir (örneğin, kullanıcılarınızın maksimum hızda indirmelerini ancak yine de aylık limitinizi uygulamanızı istemişseniz önerim işe yaramaz).


Sadece bizim tohumlarımızda sadece selesi olan bir tohum kutusu kullanmamızın ana nedeni çok daha hızlı, bu yüzden ne yazık ki bu sorunu çözmüyor ... Yine de teşekkürler
loco41211

7

Bunun eski bir yazı olduğunu biliyorum ama bugün bile cevaplar aramak yerine tökezledim ve sonunda benim için mükemmel sonuç veren bir araya getirdim. 25Mbs downlink ve 2.5Mbs uplink'im var ve bu linki paylaşan 4 kişi ve 5 sunucu var. server uplink bandwith ile kritik ancak downlink 4 kişi için yararlı, bu yüzden kimse hepsini beklemiyor.

Yönlendirici olarak centos 6.3 kullanıyorum ancak bu komutlar herhangi bir linux üzerinde çalışmalı. eth0, sağlayıcıya uplink bağlantımdır eth1, 24 port switch ve wifi erişim noktası aracılığıyla lan'ımdır.

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

daha sonra kullanıcıları sınırlamak için kullanıcı başına 2 iptables satırı kullanıyorsunuz

yüklemeleri sınırlamak için:

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

indirmeleri sınırlamak için

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

ip adresinizi ve eth portlarınızı sınırlamak istediğiniz kişiyle eşleşecek şekilde değiştirin


3

Tamamlanması için, denilen bir kullanıcı alanı arka plan programı var trickle. Tek bir işlemin bant genişliğini sınırlamak için kullanılabilir. Kullanımı çok basittir: yetenek tarafından kullanılan bant genişliğini sınırlamak için şunu yazabilirsiniz: trickle -d 10 aptitude install wesnothAncak LD_PRELOAD kullanılarak çalıştığından, kabuk erişimine sahip bir kullanıcı tarafından kolayca geçersiz kılınabilir.


Kendim dışında hiçbir kullanıcının kabuk erişimi yok. Ayrıca, bant genişliği sınırlaması ile ayda veya belirli bir zaman diliminde demek istiyorum. bu mümkün olabilir mi?
loco41211

1
Hayır, damlama saniyede olduğu gibi hızı sınırlar.
liori

2

Bir göz atın useripacct çekirdek yama (bu aslında oldukça uzun bir sahiptir geçmişi ). Eski sürüm için dokümanlarda da izlenmesi yanı sıra kota uygulanmasını sağlamak için görünür ve bu kendi politikası komut sağlamak da mümkündür.

Useripacct yaratıcılarının, istediğiniz davranışı elde etmek için bir çekirdek yamasına başvurmaları gerektiğine göre, varsayılan olarak daha basit bir yöntem mevcut görünmektedir. Buradaki tek alternatif, buradaki diğer cevapların çoğu tarafından önerildiği gibi (ancak aslında aradığınız şeyi değil) bant genişliği sınırlaması (tc veya damlama gibi bir şey) veya her kullanıcı için bir VM oluşturmak (hafif işletim sistemi sanallaştırması kullanarak) görünmektedir. OpenVZ gibi bir şeyle ve VM başına muhasebe trafiği ( vnstat gibi bir şey tarafından oldukça kolay bir şekilde değerlendirilir ). Bu gerçekte fazla gözüküyor gibi gözüküyor (aniden bir sistem yerine yönetmek için bir sürü VM'niz var).


Sunucu kaynaklarını boşaltacağından biraz daha fazla .. ama fikir için teşekkürler
loco41211
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.