V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
pythonee
V2EX  ›  Linux

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

  •  
  •   pythonee · 2016-01-22 16:41:10 +08:00 · 4993 次点击
    这是一个创建于 3230 天前的主题,其中的信息可能已经有所发展或是发生改变。


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

    限制数据包通常可以用 iptables limit 匹配每秒数据包通过的数量,一个大概是 mtu 大,大概 1.5kb 。问题是这个 limit 是个令牌桶概念,数据包在不同时间段数量是有差别的也就会造成流量的不确定,哪天要注意到流量快到慢,慢到快那就是被人实施发包限制了。
    datocp
        7
    datocp  
       2016-01-25 08:59:01 +08:00 via Android
    不去验证这个实例了,平时很少用到 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
        8
    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
        9
    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
        10
    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
        11
    captainsparrow  
       2020-02-19 22:30:36 +08:00
    @datocp 好的,非常感谢~~
    captainsparrow
        12
    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
        13
    captainsparrow  
       2020-02-19 23:03:32 +08:00
    请忽略楼上-d -s
    另外这个 tc 规则重启就失效了,我是不是要写个 shell 开机自动执行呢。
    @datocp
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1552 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:02 · PVG 01:02 · LAX 09:02 · JFK 12:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.