我们有一个透明的代理设置。 我试图在Linux中寻找stream量整形,而我所能find的所有方法都是通过接口(eth0 / eth1 …)来限制stream量。
我需要通过IP地址或IP范围限制带宽(从不超过特定的限制),我找不到一个方法来做到这一点。
有没有办法做到这一点?
内核的stream量整形层基本上是连接到网卡的数据包调度程序。 所以一个stream量整形策略适用于一个网卡。
在你的情况下,你可以做的是创build一个附加的IP和带宽列表,然后为每个IP创build:
@Zoredache给出的例子是有效的,但是我个人更喜欢使用Netfilterfunction而不是TC来过滤数据包,而HTB代替CBQ来实现合并algorithm。 所以你可以尝试这样的事情(需要Bash 4的关联数组):
#! /bin/bash NETCARD=eth0 MAXBANDWIDTH=100000 # reinit tc qdisc del dev $NETCARD root handle 1 tc qdisc add dev $NETCARD root handle 1: htb default 9999 # create the default class tc class add dev $NETCARD parent 1:0 classid 1:9999 htb rate $(( $MAXBANDWIDTH ))kbit ceil $(( $MAXBANDWIDTH ))kbit burst 5k prio 9999 # control bandwidth per IP declare -A ipctrl # define list of IP and bandwidth (in kilo bits per seconds) below ipctrl[192.168.1.1]="256" ipctrl[192.168.1.2]="128" ipctrl[192.168.1.3]="512" ipctrl[192.168.1.4]="32" mark=0 for ip in "${!ipctrl[@]}" do mark=$(( mark + 1 )) bandwidth=${ipctrl[$ip]} # traffic shaping rule tc class add dev $NETCARD parent 1:0 classid 1:$mark htb rate $(( $bandwidth ))kbit ceil $(( $bandwidth ))kbit burst 5k prio $mark # netfilter packet marking rule iptables -t mangle -A INPUT -i $NETCARD -s $ip -j CONNMARK --set-mark $mark # filter that bind the two tc filter add dev $NETCARD parent 1:0 protocol ip prio $mark handle $mark fw flowid 1:$mark echo "IP $ip is attached to mark $mark and limited to $bandwidth kbps" done #propagate netfilter marks on connections iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark
– 编辑:忘了默认的类,并在脚本的末尾传播标记。
类似这样的工作对我来说限制承包商的networking摄像机的有限的带宽量。 有关详细信息,请查看tc的手册页。
#!/bin/bash set -x DEV=eth0 export DEV tc qdisc del dev $DEV root tc qdisc del dev $DEV root tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 100mbit # setup a class to limit to 1500 kilobits/s tc class add dev $DEV parent 1: classid 1:1 cbq rate 1500kbit \ allot 1500 prio 5 bounded isolated # add traffic from 10.2.1.37 to that class tc filter add dev $DEV parent 1: protocol ip prio 16 u32 \ match ip src 10.2.1.37 flowid 1:1
我不确定我是否正确理解你的问题。
透明代理(如在Squid中用于HTTP)用于控制大部分传入数据。 stream量整形用于控制外发数据。
你需要提供更多的细节。 如果HTTP代理背后有很多工作站,并且试图限制下载速度,那么最好使用Squid +延迟池。