tc 限制下载流量总会超出最大值

2016-01-22 16:41:10 +08:00
 pythonee
https://gist.github.com/akrasic/7242498

用这个脚本进行出方向(上传)和入方向(下载)限速,测试了下,上传的是脚本里设置的值,可是用 wget 测试下载速度,总是超出限制的最大值
4978 次点击
所在节点    Linux
13 条回复
itsme
2016-01-22 16:53:55 +08:00
楼上这个是限制速度还是限制流量?
流量限制用 iptables 感觉挺方便,也准确。
速度限制我就不知道了, tc 没用过。
ryd994
2016-01-22 20:40:54 +08:00
因为真正意义上,入站流量整形本来就不容易
数据已经到了,你难道还能打回去么?
如果丢弃,源服务器会重发,结果还更多
延迟的话流量大点就很难做到了
leakeung
2016-01-22 21:05:13 +08:00
ip=4.1.2.3 填写的可是真实服务器 IP?
ioiioi
2016-01-23 00:04:46 +08:00
@itsme iptables 怎么限制流量?
extreme
2016-01-23 09:32:27 +08:00
@ioiioi 扯淡吧,别把限制数据包当成限制带宽。
datocp
2016-01-25 08:45:33 +08:00
。。。第一次看到这么简单的实现,真这么简单为什么以前网上没见过这种实例。 tc 只能控制 out 方向, in 方向要用到 ingress 接口,后来出现了一个更高级的 ifb ,以前如果内部有高达 13 个 vlan 只能针对每个 vlan 做流控, ifb 出现以后可以将 13 个 vlan 映射到一个统一的 ifb 接口上。

限制数据包通常可以用 iptables limit 匹配每秒数据包通过的数量,一个大概是 mtu 大,大概 1.5kb 。问题是这个 limit 是个令牌桶概念,数据包在不同时间段数量是有差别的也就会造成流量的不确定,哪天要注意到流量快到慢,慢到快那就是被人实施发包限制了。
datocp
2016-01-25 08:59:01 +08:00
不去验证这个实例了,平时很少用到 tc u32 ,无法验证这种方向,在 nat 环境 iptables 都是在 mangle 表过滤的,所谓的路由前,路由后。如果简单的实现 out 可以看下面那帖验证过了。

$FILTER match ip dst 0.0.0.0/0 flowid 1:10
$FILTER match ip src 0.0.0.0/0 flowid 1:20

https://www.v2ex.com/t/248723
captainsparrow
2020-02-18 16:20:31 +08:00
@datocp 你好,请教一下,我使用下面的脚本来对 eth0 限速,本想对 eth0 的每个 ip 单独限速的,可是下面的代码对 eth0 的所有 ip 共同限速了 300k,有什么办法可以改一下么,比如 eth0 里有 10.0.0.1 跟 10.0.0.2、10.0.0.3 三个 ip 如何对这 3 个 ip 分别限速 300k,下面是我自己改的代码实现不了,望赐教

#down
/sbin/tc qdisc del dev eth0 root
/sbin/tc qdisc add dev eth0 root handle 2:0 htb
/sbin/tc class add dev eth0 parent 2:1 classid 2:10 htb rate 300kbps
/sbin/tc class add dev eth0 parent 2:2 classid 2:11 htb rate 1024kbps
/sbin/tc qdisc add dev eth0 parent 2:10 handle 1: sfq perturb 1
/sbin/tc filter add dev eth0 protocol ip parent 2:0 u32 match ip dst 10.0.0.0/8 flowid 2:10

#upload
/sbin/tc qdisc add dev eth0 handle ffff: ingress
/sbin/tc filter add dev eth0 parent ffff: protocol ip u32 match ip dst 10.0.0.0/8 police rate 300kbps burst 100k drop flowid 2:11
datocp
2020-02-19 20:38:26 +08:00
好久不看这些了看起来头大。参看了我的 vps,QOS 只能控制上行接口的这个 eth0 是控制上行,eth0 ffff:ingress 才是控制下行。但这个 ffff:ingress 平时我很少用。我给个作用作用在 lan 端的 br0 接口,也是你想要的控制 lan ip 速度的。自己参考修改一下吧。

#!/bin/sh

iptables -t mangle -F POSTROUTING
tc qdisc del dev br0 root 2> /dev/null > /dev/null

tc qdisc add dev br0 root handle 1: htb default 119
tc class add dev br0 parent 1: classid 1:1 htb rate $((3072))kbps

tc class add dev br0 parent 1:1 classid 1:2 htb rate $((3072*6/10))kbps ceil $((3072*6/10))kbps

IP=101;while [ $IP -le 125 ];do
tc class add dev br0 parent 1:2 classid 1:$IP htb rate $((3072*1/10))kbps ceil $((3072*1/4))kbps prio 4
tc qdisc add dev br0 parent 1:$IP handle $IP: sfq perturb 10
tc filter add dev br0 parent 1: prio 20 protocol ip handle $IP fw flowid 1:$IP
iptables -t mangle -A POSTROUTING -d 192.168.8.$IP -j MARK --set-mark $IP
iptables -t mangle -A POSTROUTING -d 192.168.8.$IP -j RETURN;let "IP+=1";done

tc class add dev br0 parent 1:1 classid 1:3 htb rate $((3072*5/10))kbps ceil $((3072*10/10))kbps prio 0
tc qdisc add dev br0 parent 1:3 handle 3: sfq perturb 10
tc filter add dev br0 parent 1: prio 10 protocol ip handle 3 fw flowid 1:3

iptables -t mangle -I POSTROUTING -m iprange --dst-range 192.168.8.200-192.168.8.205 -j RETURN
iptables -t mangle -I POSTROUTING -m iprange --dst-range 192.168.8.200-192.168.8.205 -j MARK --set-mark 3
datocp
2020-02-19 20:44:32 +08:00
设定一个 1:2 只有 6/10 流量的限制分组,ip 范围为 101-125,里面再根据每个 ip 限制流量到最多 1/4 的总流量。
设定一个 1:3 10/10 流量的高优先级分组,prio 0,ip 范围 200-205 共享该 100%的流量
captainsparrow
2020-02-19 22:30:36 +08:00
@datocp 好的,非常感谢~~
captainsparrow
2020-02-19 23:00:42 +08:00
@datocp
iptables -t mangle -A POSTROUTING -d 10.24.26.2 -j MARK --set-mark 101
iptables -I FORWARD -s 10.24.26.2 -j MARK --set-mark 6

这 2 个 set-mark 对于这个限速,FORWARD 跟 POSTROUTING 应该使用哪个好呢,我试了下,两个都可以实现。
captainsparrow
2020-02-19 23:03:32 +08:00
请忽略楼上-d -s
另外这个 tc 规则重启就失效了,我是不是要写个 shell 开机自动执行呢。
@datocp

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/252655

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX