如何限制每个用户的带宽?


32

总结一下:我有一个专用服务器,其中有几个朋友使用Web gui运行torrent客户端。每个用户都在服务器上以其用户名运行客户端,因此下载进入其用户目录,并且只有他们可以访问自己的文件等。

如何按每个用户每月监视和限制带宽?

我当时想也许必须有一种使用iptables的方法。并且通过监视用户X的所有进程使用的带宽。如果他们使用了更多带宽,则每月允许的带宽为Y GB,他们会收到一条消息,指出torrent客户端被阻止了,或者该客户端被完全杀死。我也考虑过鱿鱼,但看到它将使用多个torrent客户端,这可能会占用大量服务器资源...

我正在使用Debian Lenny。

我不确定该怎么做...

这有可能吗?我很高兴能为此提供部分解决方案...


我们可以知道您使用的是什么操作系统。
山姆·科根

Debian。在编辑中添加。
loco41211 2009年

只是好奇,您在使用TorrentFlux吗?
cop1152 2009年

这是我正在尝试的事情之一。目前,我们正在寻找可用于具有磁盘空间限制(我们有解决方案)和带宽限制的种子箱的任何东西,我们一直坚持...。我的一些朋友每月使用大约1TB,而其他一些朋友只有几个Mb。确实想对每个用户平均限制此限制。
loco41211,2009年

Answers:


13

您可以使用“ tc”流量调整命令。

给您的每个朋友一个不同的端口,以用于BitTorrent。为每个端口的iptables标记TCP数据包。

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

如果您使用的是Debian install Shorewall,那么它很容易进行流量调整而不会弄乱iptables。您只需在/ etc / shorewall目录中编辑tcdevices,tcclasses和tcrules。此处提供更多信息:http : //www.shorewall.net/traffic_shaping.htm

正如其他人所建议的那样,用用户名标记数据包可能比用端口标记好,这样可以在不更新iptables的情况下更改端口。


您可以举一个设置限制的例子吗?一起说100GB传入和传出?
loco41211 2009年

torrent可以(实际上是)使用其他端口,因此该示例并不能真正解决问题。
cstamas

删除了这两个选项作为解决方案...
loco41211 2009年

cstamas:使用bittorrent客户端时,您可以设置一个端口或多个端口。看到这个:dessent.net/btfaq/#ports
chris.moos

13

您可以尝试使用--quotaiptables中的选项,该选项允许您设置传输限制(以字节为单位)。由于您正在运行多个torrent客户端,每个客户端使用不同的用户名,因此可以将其与--uid-owner选项结合使用,如katriel建议的那样。

这样,您可以在每个时间段(天/周/月/月/等)实施转移限制,而不必限制用户的下载速度。

为了使数据包计数器持续存在,您必须定期保存它们(例如,通过cron作业),以便可以在需要重新启动服务器或刷新防火墙规则的情况下将其还原。


听起来像可行。因此,在iptables的帮助下,我可以标记特定用户的所有进出流量。我可以将其限制为设定的时间段。我仍然无法弄清楚整个设置如何。那么,我可以用来标记传入和传出流量的确切命令是:“ iptables -t mangle -A OUTPUT -p tcp -m owner -uid-owner someuser -j MARK -set-mark 100”吗?还是我会怎么做?例如,该命令将标记ID为56的用户名bob的每月限制为100GB是什么?我想每月的Cron工作会重置流量计数器吗?
loco41211,2009年

12

只是补充上面的问题。

您可以使用具有用户匹配功能的iptables来为数据包着色,如下所示:

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

然后使用“ tc”对每个用户进行限制。


您能否举一个例子,说明如何使用tc为用户名blablaX设置100GB的限制?还有一个示例,该代码应在一个月后用于重置限额?谢谢
loco41211 2009年

这将永久限制用户,而不是
按时

8

根据您希望每个用户每月允许多少流量,可以使用其他用户建议的一些工具来相应地设置带宽限制。

例如,假设您要将最大下载限制设置为250 GB /月。现在,如果将其除以一个月的小时数(〜730),然后除以3600,则将获得最大下载速率,在此示例中,最大下载速率约为100 KB / s

然后,如果您将最大DL速率设置为100 KB / s,则将自动实施每月250 GB的下载限制(当然,假设流量整形器工作正常)。如果您的用户不能以超过100 KB / s的速度下载,那么他们将不能以每月250 GB的速度下载。

为了限制下载速度,您可以使用tc或提到的其他一些工具。如果您不想直接处理tc,则可以使用cbq.init,它的设置非常简单。该脚本作为shaper软件包存在于Debian Etch中,但此后似乎已被删除。无论如何,这只是一个简单的脚本,您可以从SourceForge下载。

当然,这种方法在您的情况下可能没有用(例如,如果您希望用户可以以最大可用速度下载,但仍然强制执行每月限制,则我的建议将行不通)。


我们使用种子箱而不是种子种子的主要原因是它更快,所以可悲的是这并不能解决问题...无论如何
loco41211

7

我知道这是一个旧帖子,但即使今天我偶然发现它也要寻找答案,我最终拼凑了一些对我来说很完美的东西。我有一个25Mbs的下行链路和2.5Mbs的上行链路,并且有4个人和5个服务器共享此链接。对于服务器,上行链路带宽至关重要,但下行链路对4个人有用,因此没人能做到。

我将centos 6.3作为路由器运行,但这些命令应在任何linux上都可以使用。eth0是我到提供商的上行链路eth1是我通过24端口交换机和wifi接入点的局域网,我将下载限制为25 Mb中的5个(大约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

为了完整起见,有一个名为的用户空间守护程序trickle。它可用于限制单个进程的带宽。用法非常简单:fe可以限制aptitude所使用的带宽,您可以这样写:trickle -d 10 aptitude install wesnoth但是,由于它使用LD_PRELOAD起作用,因此可以由具有shell访问权限的用户轻松覆盖。


除了我自己之外,没有其他用户具有外壳程序访问权限。另外,对于带宽限制,我的意思是每月或设定的时间段。那有可能吗?
loco41211,2009年

1
不,trick流限制了每秒的速度。
liori

2

看一下useripacct内核补丁(这实际上已有很长的历史了)。在旧版本文档中,它似乎还提供配额执行和监视功能,还可以提供自己的策略脚本。

鉴于useripacct创建者必须诉诸内核补丁才能获得所需的行为,因此默认情况下似乎不太可能有更简单的方法可用。唯一的替代方案似乎是带宽限制(如tc或细流),如此处大多数其他答案(但实际上不是您要寻找的)所建议的那样,或者为每个用户创建VM(使用轻量级的OS虚拟化)通过类似OpenVZ)和每个VM的计费流量(通过vnstat之类的方法很容易评估)。但是,这似乎有点过头了(突然,您要管理一堆VM,而不是一个系统)。


这有点用力过大,因为它会耗尽服务器资源。.但是谢谢您的支持!
loco41211
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.