Làm thế nào tôi có thể giới hạn băng thông trên mỗi người dùng?


32

Tóm lại: Tôi có một máy chủ chuyên dụng với một vài người bạn đang chạy máy khách torrent với web gui. Mỗi người dùng đang chạy một ứng dụng khách dưới tên người dùng của họ trên máy chủ để tải xuống đi vào thư mục người dùng của họ và chỉ họ mới có quyền truy cập vào các tệp của riêng họ, v.v.

Làm cách nào tôi có thể theo dõi và giới hạn băng thông mỗi tháng trên cơ sở mỗi người dùng?

Tôi đã nghĩ rằng phải có một cách sử dụng iptables có thể. Và bằng cách giám sát băng thông được sử dụng bởi tất cả các quy trình của người dùng X. Và nếu họ đã sử dụng nhiều hơn thì băng thông Y GB được phép hàng tháng của họ, họ nhận được một thông báo nói rằng mạng bị chặn cho máy khách torrent của họ hoặc máy khách bị giết hoàn toàn. Tôi cũng đã nghĩ về mực, nhưng vì nó sẽ sử dụng nhiều máy khách torrent nên điều này có thể sử dụng nhiều tài nguyên máy chủ ...

Tôi đang sử dụng lenny debian.

Tôi không chắc làm thế nào để làm điều này ...

điều này sẽ có thể ở tất cả? Tôi biết ơn vì thậm chí chỉ là một phần giải pháp cho việc này ...


Chúng tôi có thể làm gì để biết bạn đang sử dụng hệ điều hành nào.
Sam Cogan

debian. Đã thêm vào một chỉnh sửa.
loco41211

chỉ tò mò, bạn đang sử dụng TorrentFlux?
cop1152

đó là một trong những điều tôi đang cố gắng Hiện tại chúng tôi đang xem xét bất cứ điều gì có thể sử dụng cho seedbox với giới hạn không gian đĩa (chúng tôi có giải pháp cho) và giới hạn băng thông mà chúng tôi đang mắc kẹt .... và một số bạn bè của tôi sử dụng khoảng 1TB mỗi tháng trong khi những người khác chỉ một vài Mbs. Thực sự muốn giới hạn điều này cho mỗi người dùng như nhau.
loco41211

Câu trả lời:


13

Bạn có thể sử dụng lệnh định hình lưu lượng 'tc'.

Cung cấp cho mỗi bạn bè của bạn một cổng khác nhau để sử dụng cho BitTorrent. Đánh dấu các gói TCP bằng iptables cho mỗi cổng.

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

Sau đó sử dụng lệnh tc để đặt băng thông và tốc độ tối đa cho mỗi người dùng.

Vào cuối tháng, bạn có thể xóa và thêm các lệnh 'tc' để đặt lại số đếm.

Bạn có thể theo dõi việc sử dụng cho từng người dùng bằng cách:

tc filter show dev ethX

Nếu bạn đang sử dụng Debian cài đặt Shorewall, việc tạo hình lưu lượng truy cập thực sự dễ dàng mà không gây rối với iptables. Bạn chỉ cần chỉnh sửa tcdevices, tcgroupes và tcrules trong thư mục / etc / shorewall. Thêm thông tin ở đây: http://www.oorwall.net/traffic_shaping.htm

Như người khác đề xuất, đánh dấu các gói theo tên người dùng có thể tốt hơn so với cổng, theo cách đó các cổng có thể được thay đổi mà không cần cập nhật iptables.


bạn có thể đưa ra một ví dụ về việc thiết lập một giới hạn? Nói 100GB đến và đi cùng nhau?
loco41211

torrent có thể (và thực tế là) sử dụng các cổng khác để ví dụ không thực sự giải quyết được vấn đề.
cstamas

loại bỏ hai tùy chọn đó như một giải pháp ...
loco41211

cstamas: bạn có thể đặt một cổng hoặc nhiều cổng khi sử dụng máy khách bittorrent. xem cái này: dessent.net/btfaq/#ports
chris.moos

13

Bạn có thể thử sử dụng --quotatùy chọn trong iptables, cho phép bạn đặt giới hạn chuyển theo byte. Vì bạn đang chạy nhiều máy khách torrent, mỗi máy khách dưới một tên người dùng khác nhau, bạn có thể kết hợp điều đó với --uid-ownertùy chọn, như katriel đề xuất.

Bằng cách này, bạn có thể thực thi giới hạn chuyển tiền trong mỗi khoảng thời gian (ngày / tuần / tháng / v.v.) mà không phải giới hạn tốc độ tải xuống của người dùng.

Để duy trì bộ đếm gói liên tục, bạn phải lưu chúng định kỳ (ví dụ: thông qua công việc định kỳ), để bạn có thể khôi phục chúng trong trường hợp bạn cần khởi động lại máy chủ hoặc xóa quy tắc tường lửa.


Nghe có vẻ như nó sẽ làm việc. Vì vậy, với sự trợ giúp của iptables, tôi có thể đánh dấu tất cả lưu lượng truy cập đến và đi ra cho một người dùng đã đặt. Và tôi có thể giới hạn nó trong một khoảng thời gian định sẵn. Tôi vẫn không thể hiểu làm thế nào toàn bộ thiết lập sẽ được mặc dù. Vì vậy, lệnh chính xác mà tôi có thể sử dụng để đánh dấu lưu lượng đến và đi: Hoặc làm thế nào tôi sẽ làm điều đó? Ví dụ, lệnh nào sẽ đánh dấu tên người dùng bob với id 56 với giới hạn hàng tháng là 100 GB? Tôi đoán một công việc cron hàng tháng sẽ thiết lập lại bộ đếm giao thông?
loco41211

12

Chỉ cần thêm vào câu hỏi trên.

Bạn có thể sử dụng iptables với người dùng khớp để tô màu các gói như vậy:

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

Và sau đó sử dụng 'tc' để giới hạn trên cơ sở mỗi người dùng.


Bạn có thể đưa ra một ví dụ về cách sử dụng tc để đặt giới hạn 100 GB cho tên người dùng blablaX không? Và một ví dụ về mã nên được sử dụng để thiết lập lại giới hạn sau một tháng? Cảm ơn bạn
loco41211

Điều này sẽ giới hạn người dùng trên cơ sở vĩnh viễn, và không theo hạn ngạch được định thời gian
katriel

8

Tùy thuộc vào lượng lưu lượng truy cập hàng tháng bạn muốn cho phép cho mỗi người dùng mỗi tháng, bạn có thể đặt giới hạn băng thông tương ứng, sử dụng một số công cụ được đề xuất bởi những người dùng khác.

Ví dụ: giả sử bạn muốn đặt giới hạn tải xuống tối đa là 250 GB / tháng . Bây giờ, nếu bạn chia số đó cho số giờ trong một tháng (~ 730) và sau đó là 3600, bạn sẽ nhận được tốc độ tải xuống tối đa, trong ví dụ này sẽ là 100 KB / s .

Sau đó, nếu bạn đặt tốc độ DL tối đa 100 KB / s, bạn sẽ tự động thực thi giới hạn tải xuống 250 GB / tháng (giả sử tất nhiên là trình tạo lưu lượng truy cập của bạn hoạt động tốt). Nếu người dùng của bạn không thể tải xuống nhanh hơn 100 KB / giây, thì họ sẽ không thể tải xuống hơn 250 GB / tháng.

Để giới hạn tốc độ tải xuống, bạn có thể sử dụng tchoặc một số công cụ khác đã được đề cập. Nếu bạn không muốn giao dịch trực tiếp tc, bạn có thể sử dụng cbq.init , việc này khá đơn giản để thiết lập. Tập lệnh này đã có mặt trong Debian Etch dưới dạng shapergói, nhưng dường như nó đã bị xóa sau đó. Dù sao, nó chỉ là một tập lệnh đơn giản mà bạn có thể tải xuống từ SourceForge.

Tất nhiên cách tiếp cận này có thể không hữu ích trong trường hợp của bạn (ví dụ: nếu bạn muốn người dùng của mình có thể tải xuống ở tốc độ tối đa có sẵn nhưng vẫn thực thi giới hạn hợp lý của bạn, đề xuất của tôi sẽ không hiệu quả).


Lý do chính khiến chúng tôi sử dụng seedbox thay vì chỉ dùng torrent trên chiếc của chúng tôi vì nó nhanh hơn rất nhiều, thật đáng buồn vì điều này không giải quyết được vấn đề ... Dù sao cũng cảm ơn
loco41211

7

Tôi biết đây là một bài viết cũ nhưng thậm chí tôi đã tình cờ tìm thấy câu trả lời ngày hôm nay và cuối cùng tôi đã ghép lại một cái gì đó hoạt động hoàn hảo cho tôi. Tôi có đường xuống 25Mbs và đường lên 2,5Mbs và có 4 người và 5 máy chủ chia sẻ liên kết này. với các máy chủ đường lên băng thông là rất quan trọng nhưng đường xuống là hữu ích với 4 người nên không ai có thể làm được tất cả.

Tôi đang chạy centos 6.3 như một bộ định tuyến nhưng các lệnh này sẽ hoạt động trên mọi linux. eth0 là đường lên của tôi tới nhà cung cấp eth1 là lan của tôi thông qua 24 cổng chuyển đổi và điểm truy cập wifi Tôi giới hạn tải xuống ở mức 5 trong số 25 Mbs (khoảng 500KB / giây) Tôi giới hạn tải lên ở mức 200Kbit (khoảng 25KB / giây)

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

sau đó để giới hạn người dùng, bạn sử dụng 2 dòng iptables cho mỗi người dùng

để hạn chế tải lên:

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

để hạn chế tải xuống

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

chỉ cần thay đổi địa chỉ IP và cổng eth của bạn để phù hợp với người bạn muốn giới hạn


3

Để hoàn thiện, có một daemon không gian người dùng được gọi trickle. Nó có thể được sử dụng để giới hạn băng thông của một quá trình duy nhất. Cách sử dụng rất đơn giản: để hạn chế băng thông được sử dụng bởi aptitude, bạn có thể viết: trickle -d 10 aptitude install wesnothTuy nhiên vì nó hoạt động bằng LD_PRELOAD, nó có thể dễ dàng bị ghi đè bởi người dùng có quyền truy cập shell.


Không ai trong số những người dùng ngoài bản thân tôi có quyền truy cập shell. Ngoài ra, với giới hạn băng thông tôi có nghĩa là mỗi tháng hoặc một khoảng thời gian được đặt. Điều đó có thể không?
loco41211

1
Không, nhỏ giọt giới hạn tốc độ như trong mỗi giây.
liori

2

Hãy xem bản vá kernel useripacct (điều này thực sự có một lịch sử khá dài ). Trong các tài liệu cho phiên bản cũ, nó dường như cũng cung cấp việc thực thi hạn ngạch cũng như giám sát và cũng có thể cung cấp các tập lệnh chính sách của riêng bạn.

Do người tạo useripacct phải dùng đến bản vá kernel để có được hành vi bạn muốn, có vẻ như không có phương thức đơn giản hơn có sẵn theo mặc định. Các lựa chọn thay thế duy nhất có vẻ là giới hạn băng thông (bằng cách nào đó như tc hoặc nhỏ giọt) như được đề xuất bởi hầu hết các câu trả lời khác ở đây (nhưng không thực sự là những gì bạn đang tìm kiếm) hoặc tạo VM cho mỗi người dùng (sử dụng ảo hóa hệ điều hành nhẹ bởi một cái gì đó như OpenVZ ) và lưu lượng kế toán trên mỗi VM (khá dễ dàng được đánh giá bởi một cái gì đó như vnstat ). Điều đó có vẻ như quá mức cần thiết (đột nhiên bạn có một loạt các máy ảo để quản trị thay vì một hệ thống).


đó là một chút quá mức vì nó sẽ làm cạn kiệt tài nguyên máy chủ .. nhưng cảm ơn bạn vì ý tưởng này!
loco41211
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.