以下情况:我们是一群学生,负责管理当地宿舍的互联网连接,总共有大约 2000 名最终用户。
我们有一个流量积分系统,每下载或上传 MB 都会花费积分,每小时都会增加新的积分。目前,当用户用完所有积分时,我们会阻止其访问互联网(通过在我们的 Debian 网关路由器的 iptables 中将其置于 REJECT 策略中)。
我们只想限制用户的带宽。最好的方法是什么?
简单的答案是设置用户交换机端口(主要是 Cisco Catalyst 3550)的速率限制。但是,这是不可取的,因为我们自己的网络和大学网络内的流量应该保持不受限制。有没有办法在 Cisco IOS 中仅限制具有特定目标或源 IP 范围(即出站和入站)的数据包的带宽?我什么也没找到。
另一种方法是控制网关路由器上的流量。我想到了一些解决方案:
tc 或 tcng - 似乎两者都有相当晦涩的语法,并且都没有提供针对每个 IP 进行流量控制的良好功能。如此多的用户使用专用的 QDisc 可能会大大降低路由器的速度。此外,两者的文档都相当过时。
shorewall - 似乎有一个相当简洁的配置语法,但是,我不确定它是否能处理这么多的流量和用户,以及它是否适合每个 IP 的流量限制
pfSense - 看起来像是一个为我们这样的目的而设计的操作系统。但是,它需要我们完全重新安装我们的网关路由器。我们没有其他 BSD 系统,而且 pfSense 也需要具有非常好的流量统计功能(我们目前在那里使用 fprobe-ulog 和 ulog-acctd)。
您的经验是什么?哪种解决方案适合我们的需求并且最容易维护?您还有其他想法吗?
如果您需要有关我们的系统任何其他信息,请随时询问。
提前致谢。
编辑:我已经与iptables
和实现了该系统tc
。
每个用户都有一个 /28 子网、一个 VPN IP(均来自 10.0.0.0/8)和一个外部 IP,所有这些都通过一个 iptables 链进行控制。此链只有一条规则,即简单的RETURN
。
每五分钟,Python 脚本就会读出这些规则的字节计数器。它会重置计数器并更新我们 PostgreSQL 数据库中的用户流量点帐户。
如果用户的点数余额低于某个阈值,则将为该用户创建两个 tc 类(一个用于网关路由器上的传入接口,一个用于传出接口),IP 将输入属于这些类的 tc 过滤器。这些类的速度受 HTB 限制。
fprobe-ulog
与以前的系统相比ulog-acctd
,由于字节计数是由 iptables 完成的,因此速度要快得多。
对于我们的用户来说,网络速度已经有了显著的提升。
答案1
我不确定你是否有兴趣重新配置你的整个设置(即替换 Debian),或者在你的网关后面放置这样的东西是否可行,但 FreeBSD 在 ipfw 中有一项功能称为虚拟网络。由于您似乎不想购买专用的硬件流量整形器,因此这可能是您的一个选择。我们目前使用它来通过我们的一个代理网关来抑制 SMTP 流量的入站和出站,以防止老化的 NFS 后端系统不堪重负并随后变得无响应。
通过编写一些脚本并智能配置规则集,就可以对数千个单独的 IP 地址进行流量控制。
答案2
我必须问一下我们在使用什么,但我们的 ResTek 人员在互联网边界有一个设备,可以执行服务质量功能。它对未分类的流具有默认优先级,并根据规则对其他流量进行优先级排序。优先级功能才是它的真正卖点,因为他们还运行一个基于 Squid 的缓存集群,该集群在边界设备中被列为最高优先级。然后,他们网络上的人们可以选择以标准(有点糟糕)优先级浏览网页,或者使用代理并获得非常快速的响应。他们还接受游戏服务器优先级请求,因为它们对延迟敏感但带宽较低,这是理所当然的。
处理游戏服务器请求的工作量相当大,但随着越来越多的游戏不再使用私人服务器,这些工作正在慢慢被淘汰。总的来说,我听说这对他们来说效果很好。他们可以防止像 bittorrent 这样的程序淹没所有其他流量,同时仍能保持人们的 YouTube 加载时间很快。
答案3
随着用户数量的增加,大多数基于简单软件的东西将开始崩溃。
考虑看看packeteer和类似的设备。如今它们几乎比直接购买更多带宽还要贵(在美国和欧洲,我们澳大利亚的穷人仍然要付很高的费用)。
答案4
tc 应该可以正常工作..我相信您想要做的是将当前的 iptables 规则更改为标记而不是拒绝流量,然后您可以使用少量 tc 规则将流量整形应用于那些标记的流。
另外,请查看 ipset 来管理受限制用户列表http://ipset.netfilter.org/