对于流量管理应用程序,我应该限制客户端 IP 地址的带宽,每个 IP 都有不同的限制
如何使用 tc-tbf 来获取特定 IP 地址
或者还有其他解决方案吗?
答案1
为了限制单个 IP 地址的带宽,我使用 HTB 进行 TC。以下是一些有用的链接:
- 主页:http://luxik.cdi.cz/~devik/qos/htb/
- 用户指南:http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm
- tcng 是一种相对简单的描述流量控制结构的方法:http://www.faqs.org/docs/Linux-HOWTO/Traffic-Control-tcng-HTB-HOWTO.html
举一个简单的例子,为了限制存储在 CLIENT_IP shell 变量中的各个 IP 地址的带宽,限制如下:
- 设备名称 = eth0
- 设备可用/允许的总带宽 = 1000kbps 至 1500kbps
- 默认带宽(针对不属于我们过滤器的客户端)= 1kbps 至 2kbps
- CLIENT_IP 的带宽 = 100kbps
- CLIENT_IP 的最大带宽(如果有更多可用带宽)= 200kbps
下面的命令就足够了:
tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:1 htb rate 1000kbps ceil 1500kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1kbps ceil 2kbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 100kbps ceil 200kbps
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src ${CLIENT_IP} flowid 1:11
答案2
与您的问题有点相关,限制客户端的带宽可能不是最佳解决方案,因为它必须基于每个客户端。您可能希望指定任何单个客户端可以消耗的最大带宽量,而不是通过 IP 地址指定。
最好的选择是 QoS,并根据流量类型为服务指定不同的优先级。
据我所知,您不能将 tc-tbf 用于特定的 IP 地址。
如果您只是想提高性能,请看一下这篇文章。
http://lists.debian.org/debian-firewall/2005/07/msg00088.html
答案3
本文介绍如何使用 iptables 对新连接进行速率限制:http://www.debian-administration.org/articles/187
您可以放弃对 NEW 的状态检查,而改为通过源 IP 进行限制。
答案4
几天后我做到了
我通过 freeradius 将它用于 openvpn
tc qdisc del dev br0 root
tc qdisc add dev br0 root handle 1: htb
tc class add dev br0 parent 1: classid 1:1 htb rate "LineBandwidth"kbit
tc class add dev br0 parent 1:1 classid 1:10 htb rate "MinUserBand"kbit ceil "MaxUserBand"kbit prio 2 #----- bandwidth and classid
tc filter add dev br0 parent 1:0 prio 2 protocol ip handle 10 fw flowid 1:10 #----- MarkID1 and classId
iptables -t mangle -A POSTROUTING -d "RealUserIP" -j MARK --set-mark 10 #----- RealIP and markID1
tc qdisc add dev br0 ingress
tc filter add dev br0 parent ffff: protocol ip handle 50 fw police rate "MinUserBand"kbit mtu 12k burst 10k drop #----- BandWidth and MarkID2
iptables -t mangle -A PREROUTING -s "RealUserIP" -j MARK --set-mark 50 #----- RealIP and MarkID2