我怎样才能限制每个用户的带宽?

总结一下:我有一个专门的服务器,有几个朋友用web gui运行一个torrent客户端。 每个用户都在服务器上以他们的用户名运行一个客户端,所以下载进入他们的用户目录,只有他们有权访问他们自己的文件等。

我如何根据每个用户监控和限制每月的带宽

我在想,也许一定有使用iptables的方法。 通过监视用户X的所有进程所使用的带宽,并且如果他们已经使用了超过Y GB的每月允许带宽,他们就会收到一条消息,说他们的BT客户端被阻塞,或者客户端被彻底杀死。 我也想到了鱿鱼,但看到它将使用多个洪stream客户端,这可能会使用大量的服务器资源…

我正在使用debian lenny。

我不知道该怎么做

这是可能的吗? 我很感激这个解决scheme。

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

通过这种方式,您可以在不限制用户的下载速度的情况下,按照时间段(日/周/月等)实施传输限制。

为了使数据包计数器保持不变,您必须定期(例如通过cron作业)保存数据包,以便在需要重新启动服务器或刷新防火墙规则的情况下进行恢复。

只是添加上面的问题。

您可以使用iptables和用户匹配来为数据包着色,如下所示:

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

然后使用'tc'来限制每个用户。

你可以使用'tc'stream量整形命令。

给你的每个朋友一个不同的端口用于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安装shorewall,那么可以很轻松地进行stream量整形而不会与iptables混淆。 你只需在/ etc / shorewall目录下编辑tcdevices,tcclasses和tcrules。 更多信息在这里: http : //www.shorewall.net/traffic_shaping.htm

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

根据每个用户每月想要允许的月stream量,可以使用其他用户build议的一些工具来相应地设置带宽限制。

例如,假设您要设置250 GB /月的最大下载限制。 现在,如果你用一个月的小时数(〜730)除以3600,那么你将得到最大的下载速率,在这个例子中,下载速度将达到100 KB / s

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

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

当然,这种方法可能对您的案例没有帮助(例如,如果您希望您的用户可以以最大可用速度下载,但仍然执行您的蒙牛限制,我的build议将不起作用)。

我知道这是一个旧的post,但即使我偶然发现了今天的答案,我最终拼凑了一些完美的作品。 我有一个25Mbs的下行链路和2.5Mbs的上行链路,有4个人和5个服务器共享此链接。 与服务器上行带宽是关键,但下行是有用的4人,所以没有人霸占这一切。

我作为路由器运行centos 6.3,但这些命令应该在任何Linux上工作。 eth0是我的上行提供商eth1是我的局域网通过24端口交换机和WiFi接入点我限制下载到25 Mbs(约500KB /秒)中的5个我限制上传到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端口以匹配您想要限制的用户

为了完整起见,有一个名为trickle的用户空间守护进程。 它可以用来限制单个进程的带宽。 用法非常简单:限制aptitude使用的带宽,你可以这样写: trickle -d 10 aptitude install wesnoth然而,因为它使用LD_PRELOAD,所以用shell访问的用户可以很容易地覆盖它。

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

考虑到useripacct创造者不得不诉诸内核补丁来获得你想要的行为,似乎不太可能有一个简单的方法默认情况下可用。 唯一的替代scheme似乎是带宽限制(通过诸如tc或trickle之类的东西),正如大多数其他答案(但不是您正在寻找的)所build议的,或者为每个用户创build一个虚拟机(使用轻量级操作系统虚拟化通过像OpenVZ这样的东西)和每个虚拟机的记帐stream量(这很容易通过诸如vnstat之类的东西来评估)。 这似乎是过度杀毒(突然你有一堆虚拟机pipe理,而不是一个系统)。