bagaimana saya bisa membatasi per bandwidth pengguna?

32

Untuk meringkas: Saya memiliki server khusus dengan beberapa teman yang menjalankan klien torrent dengan web gui. Setiap pengguna menjalankan klien di bawah nama pengguna mereka di server sehingga unduhan masuk dalam dir pengguna mereka, dan hanya mereka yang memiliki akses ke file mereka sendiri dll.

Bagaimana saya bisa memonitor dan membatasi bandwidth per bulan pada basis per pengguna?

Saya berpikir mungkin ada cara menggunakan iptables mungkin. Dan dengan memantau bandwidth yang digunakan oleh semua proses pengguna X. Dan jika mereka telah menggunakan lebih dari bandwidth Y GB bulanan yang diizinkan, mereka mendapatkan pesan yang mengatakan bahwa dan jaringan diblokir untuk klien torrent mereka, atau klien terbunuh sepenuhnya. Saya juga berpikir tentang squid, tetapi karena akan menggunakan banyak klien torrent, ini bisa menggunakan banyak sumber daya server ...

Saya menggunakan lenny debian.

Saya tidak yakin bagaimana melakukan ini ...

apakah ini mungkin? Saya berterima kasih atas solusi parsial untuk ini ...

loco41211
sumber
Kita bisa lakukan dengan mengetahui OS apa yang Anda gunakan.
Sam Cogan
debian. Ditambahkan dalam pengeditan.
loco41211
hanya ingin tahu, apakah Anda menggunakan TorrentFlux?
cop1152
itu salah satu hal yang saya coba. Saat ini kami sedang mencari apa saja yang mungkin digunakan untuk seedbox dengan batasan ruang disk (yang kami punya solusinya) dan batasan bandwidth tempat kami terjebak .... dan beberapa teman saya menggunakan sekitar 1TB sebulan sementara yang lain hanya beberapa Mbs. Sangat ingin membatasi ini per pengguna secara merata.
loco41211

Jawaban:

13

Anda bisa menggunakan perintah traffic shaping 'tc'.

Berikan masing-masing teman Anda port yang berbeda untuk digunakan untuk BitTorrent. Tandai paket TCP dengan iptables untuk setiap port.

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

Kemudian gunakan perintah tc untuk mengatur bandwidth dan nilai maksimum untuk setiap pengguna.

Di akhir bulan Anda dapat menghapus dan menambahkan perintah 'tc' untuk mengatur ulang penghitungan.

Anda dapat memantau penggunaan untuk setiap pengguna dengan:

tc filter show dev ethX

Jika Anda menggunakan Debian install shorewall, sangat mudah untuk melakukan pembentukan lalu lintas tanpa mengacaukan iptables. Anda cukup mengedit tcdevices, tcclasses, dan tcrules di direktori / etc / shorewall. Info lebih lanjut di sini: http://www.shorewall.net/traffic_shaping.htm

Seperti yang disarankan orang lain, menandai paket dengan nama pengguna mungkin lebih baik daripada dengan port, dengan cara itu port dapat diubah tanpa memperbarui iptables.

chris.moos
sumber
dapatkah Anda memberi contoh tentang menetapkan batas? Katakanlah 100GB masuk dan keluar bersama?
loco41211
torrent dapat (dan sebenarnya) menggunakan port lain sehingga contohnya tidak benar-benar menyelesaikan masalah.
cstamas
yang menghilangkan dua pilihan sebagai solusi ...
loco41211
cstamas: Anda dapat mengatur satu port, atau beberapa port saat menggunakan klien bittorrent. lihat ini: dessent.net/btfaq/#ports
chris.moos
13

Anda dapat mencoba menggunakan --quotaopsi di iptables, yang memungkinkan Anda untuk menetapkan batas transfer dalam byte. Karena Anda menjalankan banyak klien torrent, masing-masing di bawah nama pengguna yang berbeda, Anda dapat menggabungkannya dengan --uid-owneropsi, seperti yang disarankan katriel.

Dengan cara ini Anda dapat menerapkan batas transfer per periode waktu (hari / minggu / bulan / dll) tanpa harus membatasi kecepatan unduh pengguna Anda.

Agar penghitung paket tetap ada, Anda harus menyimpannya secara berkala (misalnya, melalui tugas cron), sehingga Anda dapat memulihkannya jika perlu me-reboot server atau menghapus aturan firewall.

alemartini
sumber
sepertinya itu akan berhasil. Jadi dengan bantuan iptables saya dapat menandai semua lalu lintas yang masuk dan keluar untuk pengguna tertentu. Dan saya dapat membatasi untuk jangka waktu tertentu. Saya masih tidak bisa mengetahui bagaimana seluruh pengaturan akan terjadi. Jadi, apakah perintah tepat yang dapat saya gunakan untuk menandai lalu lintas masuk dan keluar: "iptables -t mangle -P OUTPUT -p tcp -m pemilik --uid-owner someuser -j MARK --set-mark 100"? Atau bagaimana saya melakukannya? Misalnya, apa perintah untuk menandai nama pengguna bob dengan id 56 dengan batas bulanan 100GB? Saya kira pekerjaan cron bulanan akan mengatur ulang penghitung lalu lintas?
loco41211
12

Hanya dengan menambahkan pertanyaan di atas.

Anda bisa menggunakan iptables dengan pencocokan pengguna untuk mewarnai paket-paket seperti:

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

Dan kemudian gunakan 'tc' untuk membatasi pada basis per pengguna.

katriel
sumber
Bisakah Anda memberikan contoh tentang cara menggunakan tc untuk menetapkan batas katakanlah 100GB untuk nama pengguna blablaX? Dan contoh kode yang harus digunakan untuk mengatur ulang batas setelah satu bulan? Terima kasih
loco41211
Ini akan membatasi pengguna secara permanen, dan bukan pada kuota waktunya
katriel
8

Bergantung pada seberapa banyak lalu lintas bulanan yang ingin Anda izinkan untuk setiap pengguna per bulan, Anda dapat menetapkan batas bandwidth yang sesuai, menggunakan beberapa alat yang disarankan oleh pengguna lain.

Misalnya, katakanlah Anda ingin menetapkan batas unduhan maksimum 250 GB / bulan . Sekarang, jika Anda membaginya dengan jumlah jam dalam sebulan (~ 730), dan kemudian pada 3600, Anda akan mendapatkan tingkat unduhan maksimum, yang dalam contoh ini akan menjadi 100 KB / s .

Kemudian, jika Anda menetapkan tingkat DL maksimum 100 KB / s, Anda akan secara otomatis memberlakukan batas unduhan 250 GB / bulan Anda (dengan asumsi tentu saja bahwa pembentuk lalu lintas Anda berfungsi dengan baik). Jika pengguna Anda tidak dapat mengunduh lebih cepat dari 100 KB / s, maka mereka tidak akan dapat mengunduh lebih dari 250 GB / bulan.

Untuk membatasi laju unduhan, Anda dapat menggunakan tcatau beberapa alat lain yang telah disebutkan. Jika Anda tidak ingin berurusan langsung dengan tc, Anda bisa menggunakan cbq.init , yang cukup sederhana untuk diatur. Skrip ini hadir dalam Debian Etch sebagai shaperpaket, tetapi tampaknya telah dihapus setelah itu. Bagaimanapun, ini hanya skrip sederhana yang dapat Anda unduh dari SourceForge.

Tentu saja pendekatan ini mungkin tidak berguna dalam kasus Anda (misalnya, jika Anda ingin agar pengguna Anda dapat mengunduh dengan kecepatan maksimum yang tersedia tetapi tetap menegakkan batas bulanan Anda, saran saya tidak akan berhasil).

mfriedman
sumber
Alasan utama kita menggunakan seedbox bukannya hanya torrents pada pcs kami karena itu adalah jauh lebih cepat, sehingga sayangnya ini tidak menyelesaikan masalah ... Thanks anyway
loco41211
7

Saya tahu ini adalah posting lama tapi bahkan saya menemukan jawaban hari ini dan akhirnya saya mengumpulkan sesuatu yang bekerja dengan baik untuk saya. Saya memiliki downlink 25Mbs dan uplink 2,5Mbs dan ada 4 orang dan 5 server berbagi tautan ini. dengan server uplink bandwidth sangat penting tetapi downlink berguna dengan 4 orang sehingga tidak ada yang memakan semuanya.

Saya menjalankan centos 6.3 sebagai router tetapi perintah ini harus bekerja pada linux apa pun. eth0 adalah uplink saya ke provider eth1 adalah lan saya melalui 24 port switch dan jalur akses wifi Saya membatasi unduhan hingga 5 dari 25 Mbs (sekitar 500KB / detik) Saya membatasi unggahan hingga 200Kbit (sekitar 25KB / detik)

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

lalu untuk membatasi pengguna Anda menggunakan 2 baris iptables per pengguna

untuk membatasi unggahan:

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

untuk membatasi unduhan

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

cukup ubah alamat ip dan port et sesuai dengan yang ingin Anda batasi

BrierMay
sumber
3

Untuk kelengkapan, ada daemon userspace yang disebut trickle. Ini dapat digunakan untuk membatasi bandwidth dari satu proses tunggal. Penggunaannya sangat sederhana: untuk membatasi bandwidth yang digunakan oleh aptitude, Anda dapat menulis: trickle -d 10 aptitude install wesnothNamun karena berfungsi menggunakan LD_PRELOAD, ini bisa dengan mudah diganti oleh pengguna dengan akses shell.

liori
sumber
Tidak ada pengguna selain saya yang memiliki akses shell. Juga, dengan membatasi bandwidth yang saya maksud per bulan, atau periode waktu tertentu. Apakah itu mungkin?
loco41211
1
Tidak, tetesan batas kecepatan seperti dalam per detik.
liori
2

Lihatlah patch kernel useripacct (ini sebenarnya memiliki sejarah yang cukup panjang ). Dalam dokumen untuk versi lama , tampaknya juga memberikan penegakan kuota serta pemantauan, dan juga memungkinkan untuk memberikan skrip kebijakan Anda sendiri.

Mengingat pencipta useripacct harus menggunakan patch kernel untuk mendapatkan perilaku yang Anda inginkan, tampaknya tidak mungkin ada metode yang lebih sederhana tersedia secara default. Satu-satunya alternatif tampaknya membatasi bandwidth (dengan sesuatu seperti tc atau trickle) seperti yang disarankan oleh sebagian besar jawaban lain di sini (tetapi sebenarnya bukan yang Anda cari), atau membuat VM untuk setiap pengguna (menggunakan virtualisasi OS ringan) oleh sesuatu seperti OpenVZ ) dan lalu lintas akuntansi per VM (yang cukup mudah dinilai oleh sesuatu seperti vnstat ). Namun sepertinya itu berlebihan (tiba-tiba Anda memiliki banyak VM untuk dikelola, bukan satu sistem).

timday
sumber
itu agak berlebihan karena akan menguras sumber daya server .. tapi terima kasih atas idenya!
loco41211