如何限制每个用户在Linux上传带宽?

任何人都可以提供tc命令来限制Debian Lenny中每个用户的上传带宽

我发现用iptables标记每个用户的数据包,我可以使用下面的命令

 iptables -t mangle -A OUTPUT -p tcp -m owner --uid-owner testuser -j MARK --set-mark 500 

但我不知道如何使用tc

更新

通过运行以下命令,我设法限制testuser上传带宽到10Mbit

 iptables -t mangle -N HTB_OUT iptables -t mangle -I POSTROUTING -j HTB_OUT iptables -t mangle -A HTB_OUT -j MARK --set-mark 30 iptables -t mangle -A HTB_OUT -m owner --uid-owner testuser -j MARK --set-mark 10 tc qdisc replace dev eth0 root handle 1: htb default 30 tc class replace dev eth0 parent 1: classid 1:1 htb rate 10Mbit burst 5k tc class replace dev eth0 parent 1:1 classid 1:10 htb rate 10Mbit ceil 10Mbit tc qdisc replace dev eth0 parent 1:10 handle 10: sfq perturb 10 tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10 

现在的问题是,我不想限制testuser的FTP带宽,但通过运行上面的命令FTP速度也限制在10Mbit。

问候

几个明显的问题,我看到你的htbconfiguration。

首先,你没有1:30的句柄,你应该, default 30 。 也许你的意思是default 1 ? 这会将所有stream量附加到classid 1:1,除非规则将stream量附加到不同的类别。

其次,您需要将您的费率设置为1:1的最高等级,以合理且低于您的线路费率。 例如,如果你的线路速率是100Mbit,速率应该是90Mbit:90Mbit。 有些人推荐更保守的设置,比如75%的线速; 我以90%的速度玩一场危险的游戏,这对我来说确实很好 – 如果你注意到丢包或不适当的带宽分配,那就减less一下。 后者表示上游缓冲。

第三,你的速率限制级别应该configuration一个rate设置为你愿意分配的保证带宽类和ceil设置为您允许用户的最高级别。 例如,假设您要给testuser 400kbit的保证带宽,但是如果线路空闲,让它增长到线路速率。 设置rate 400kbit和ceil,无论您以1:1的比例投入。 如果你不设置ceil,它默认为rate。

第四,要完成您的FTPstream量豁免目标,您需要使用connmark而不是标记。 否则,您的相关数据连接将无法正确地从–set-mark 10中豁免.Connmark将正确地获取相关的连接。

我build议以下(未经testing!)规则从我的头顶:

 # flush rules out of postrouting so you're not constantly inserting during testing. iptables -t mangle -F POSTROUTING iptables -t mangle -X HTB_OUT # The use of RETURN here is to fall out of our user chain and hit # -j CONNMARK --save-mark in the POSTROUTING chain. iptables -t mangle -N HTB_OUT iptables -t mangle -A HTB_OUT -j MARK --set-mark 30 iptables -t mangle -A HTB_OUT -p tcp --dport 21 -j MARK --set-mark 30 iptables -t mangle -A HTB_OUT -m mark ! --mark 0 -j RETURN iptables -t mangle -A HTB_OUT -m owner --uid-owner testuser -j MARK --set-mark 10 iptables -t mangle -A HTB_OUT -m mark ! --mark 0 -j RETURN iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark iptables -t mangle -A POSTROUTING -m mark ! --mark 0 -j ACCEPT iptables -t mangle -A POSTROUTING -j HTB_OUT iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark 

那么对于tc,如下所示:

 # set a script variable that will represent our line-rate minus some change CAPRATE=90Mbit CAP_SUB_400=89Mbit # clear our qdisc settings for eth0 so we're starting from a clean slate. tc qdisc del dev eth0 root tc qdisc add dev eth0 root handle 1: htb default 20 tc class add dev eth0 parent 1: classid 1:1 htb rate ${CAPRATE} burst 5k # this is our capped class: tc class add dev eth0 parent 1:1 classid 1:10 htb rate 400kbit ceil ${CAPRATE} # this is our default, catch-all class: tc class add dev eth0 parent 1:1 classid 1:20 htb rate ${CAP_SUB_400} ceil ${CAPRATE} tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10 tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10 tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10 

要记住的事情:任何父母的直系子女的所有rate总和不应超过父母的rate 。 我在这里做了一点点的欺骗,把1:20的速率降低到了89Mbit,而不是89600kbit。 你可以不承诺,但你不应该过度承诺。

iptables规则按顺序进行评估。 如果您的政策允许,最常见的匹配应该首先出现; 在进入HTB_OUT链之前,大部分的这些都被POSTROUTING规则所取消了,但这是一个很好的经验法则。

那么什么是SFQ …就像搅拌锅一样。 SFQ试图给每个连接(端点对,实际上)一个公平的带宽份额,然后每扰动秒再次混合东西,以防太多的连接结束在同一个内部桶(这可能是因为如何哈希是在src / dst / portpair上完成)。 有关更多信息,请检查lartc或tc-sfq联机帮助页。

 iptables -A OUTPUT -m conntrack --connbytes from:to --connbytes-mode packets/bytes/avgpkt -m owner --uid-owner owner -J DROP 

其他可能性-m connlimit -m hashlimit