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

loc*_*211 34 linux bandwidth debian

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

如何在每个用户的基础上监控和限制每月的带宽?

我在想也许一定有一种使用 iptables 的方法。并且通过监控用户 X 的所有进程使用的带宽。如果他们使用的带宽超过了他们每月允许的 Y GB 带宽,他们会收到一条消息,说他们的 torrent 客户端的网络被阻止,或者客户端被完全杀死。我也考虑过鱿鱼,但看到它会使用多个 Torrent 客户端,这可能会使用大量服务器资源......

我正在使用 debian lenny。

我不知道该怎么做...

这可能吗?我很感激即使只是部分解决方案......

chr*_*oos 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
Run Code Online (Sandbox Code Playgroud)

然后使用 tc 命令为每个用户设置最大带宽和速率。

在月底,您可以删除和添加“tc”命令以重置计数。

您可以通过以下方式监控每个用户的使用情况:

tc filter show dev ethX
Run Code Online (Sandbox Code Playgroud)

如果您使用 Debian 安装 shorewall,它可以非常轻松地进行流量整形,而不会弄乱 iptables。您只需编辑 /etc/shorewall 目录中的 tcdevices、tcclasses 和 tcrules。更多信息在这里:http : //www.shorewall.net/traffic_shaping.htm

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


kat*_*iel 13

只是补充上面的问题。

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

iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner someuser -j MARK --set-mark 100
Run Code Online (Sandbox Code Playgroud)

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


ale*_*ini 13

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

通过这种方式,您可以在每个时间段(天/周/月/等)强制执行传输限制,而不必限制用户的下载速度。

为了使数据包计数器持久化,您必须定期保存它们(例如,通过 cron 作业),以便您可以在需要重新启动服务器或刷新防火墙规则时恢复它们。


mfr*_*man 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 下载。

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


Bri*_*May 7

我知道这是一篇旧帖子,但即使是我今天偶然发现它也在寻找答案,我最终拼凑了一些对我来说非常有用的东西。我有一个 25Mbs 的下行链路和 2.5Mbs 的上行链路,并且有 4 个人和 5 个服务器共享此链接。服务器上行带宽很重要,但下行带宽对 4 人很有用,所以没有人会全部占用。

我将 centos 6.3 作为路由器运行,但这些命令应该适用于任何 linux。eth0 是我到提供商的上行链路 eth1 是我通过 24 端口交换机和 wifi 接入点的局域网 我将下载限制为 25 Mbs 中的 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
Run Code Online (Sandbox Code Playgroud)

然后为了限制用户,您为每个用户使用 2 条 iptables 行

限制上传:

iptables -t mangle -A POSTROUTING -o eth0 -p tcp -s 192.168.0.100 -j CLASSIFY --set-class 1:11
Run Code Online (Sandbox Code Playgroud)

限制下载

iptables -t mangle -A POSTROUTING -o eth1 -p tcp -d 192.168.0.100 -j CLASSIFY --set-class 2:11
Run Code Online (Sandbox Code Playgroud)

只需更改您的 ip 地址和 eth 端口以匹配您要限制的人