lsgxeva

Openwrt配置QOS流量带宽限制

 

QoS的底层是tc,其目的就是决定先发送哪些包。openwrt默认的规则是hfsc,设计了四个优先级:最高、高、普通、低 。

说到openwrt,就不能不提一下QoS。尤其是如果你需要用P2P软件(目前对迅雷的支持还不大好),基本就不能不开QoS。QoS的全称是Quality of Service,意即服务质量。是专门用于解决拥堵网络上的信号质量一视同仁的问题。例如,我们有一根宽带,两人共用。一个人视频聊天,一个人bt下载(我还不提迅雷个傻X呢)。玩bt的那个一开软件,视频聊天那个立刻没法用了。bt和视频聊天稍微好一点的是,视频聊天消耗的带宽是恒定的。你可以逐步限速,只要给视频聊天留了足够的带宽,两个就都能一起用了。但是,如果另一个人不是视频聊天,而是网络浏览怎么办?网络浏览,视频聊天,p2p下载一起来怎么办?实际上这是很多朋友家中常常碰到的情况。更不说有合租公寓里面你很难监控对方一定限速,软件无法限速甚至恶意抢占带宽(迅雷)。另一个更加技术的问题是,由于上传带宽不足,ACK包回应过慢,导致你的下载速度也不能达到峰值。玩p2p的常常会给上传限速到真实带宽差一点的位置,下载带宽立刻上去,就是这个道理。
怎么办?用QoS,解决你多年老便秘。QoS的底层是tc,其目的就是决定先发送哪些包。openwrt默认的规则是hfsc,设计了四个优先级。Priority最优先,处理22,53,icmp,以及小于128字节的syn,ack包中,不属于bulk类别的。我们可以看到,DNS,syn/ack的优先响应,保证了你的上传不会影响下载。其次是Express,处理5190和小于500字节的UDP包。这个我也不明白是为什么,好像是视频什么的。然后是Normal,包括20,21,25,80,110,443,993,995这些常见端口。涵盖http/https,ftp,邮件系统。最后是Bulk,包括其他包,尤其是ed和bt。

当你启用QoS后,你的p2p软件速度应当不会上升,反而会下降。下载速度不好说,有可能是上升,也有可能下降。因为原来p2p软件抢占了所有带宽,目前他们只能使用普通应用用剩下的带宽,速度当然慢了。然而,当你使用浏览器,收发邮件的时候,速度应当和不使用p2p的时候一样流畅。这才是使用QoS最大的意义。
方法很简单,安装QoS包,然后修改/etc/config/qos,注意修改你的带宽。不修改的话,流量会被无意义的限制死。

另外,打开QoS后,千万记得把你的p2p软件改为不限速。否则不能达到最高性能。

 

 

 

root@ACU:~# cat /etc/config/qos 
# QoS configuration for OpenWrt

# INTERFACES:
config interface wan
	option classgroup  "Default"
	option enabled      0
	option upload       128
	option download     1024

# RULES:
config classify
	option target       "Priority"
	option ports        "22,53"
	option comment      "ssh, dns"
config classify
	option target       "Normal"
	option proto        "tcp"
	option ports        "20,21,25,80,110,443,993,995"
	option comment      "ftp, smtp, http(s), imap"
config classify
	option target       "Express"
	option ports        "5190"
	option comment      "AOL, iChat, ICQ"
config default
	option target       "Express"
	option proto        "udp"
	option pktsize      "-500"
config reclassify
	option target       "Priority"
	option proto        "icmp"
config default
	option target       "Bulk"
	option portrange    "1024-65535"


# Don\'t change the stuff below unless you
# really know what it means :)

config classgroup "Default"
	option classes      "Priority Express Normal Bulk"
	option default      "Normal"


config class "Priority"
	option packetsize  400
	option avgrate     10
	option priority    20
config class "Priority_down"
	option packetsize  1000
	option avgrate     10


config class "Express"
	option packetsize  1000
	option avgrate     50
	option priority    10

config class "Normal"
	option packetsize  1500
	option packetdelay 100
	option avgrate     10
	option priority    5
config class "Normal_down"
	option avgrate     20

config class "Bulk"
	option avgrate     1
	option packetdelay 200
root@ACU:~# 

 

--------------

来源 https://www.right.com.cn/forum/thread-53500-1-1.html

要完成自定义QOS,需要先把tc,iptable, htb算法, opendpi , xt_recent 这些都搞清楚,起码基本的命令都会用。否则就看看热闹好了。
命令很多人都懂,我就主要讲下思路。tc的流量控制很准确,前提是要对tc,htb有足够的了解。htb的分类主要以openwrt原版qos为基础,上传增加一个第五类。iptables的设置,也是以openwrt的原版为基础,将l7-filter换成opendpi作七层识别,并作了一些小改动来符合我的需求。

                           上传
                            1:  root htb
                             |
                            1:1
            /          /            \
        1:10      1:20        1:3
                                /              \            \
                            1:30            1:40      1:50

tc qdisc add dev eth1 root handle 1: htb default 40
tc class add dev eth1 parent 1: classid 1:1 htb rate 58kbps ceil 58kbps  burst 5k cburst 5k
tc class add dev eth1 parent 1:1 classid 1:10 htb rate 10kbps ceil 58kbps  prio 1
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 15kbps ceil 58kbps  prio 2
tc class add dev eth1 parent 1:1 classid 1:3 htb rate 15kbps ceil 45kbps
tc class add dev eth1 parent 1:3 classid 1:30 htb rate 10kbps ceil 45kbps  prio 3 burst 2k cburst 2k
tc class add dev eth1 parent 1:3 classid 1:40 htb rate 5kbps ceil 45kbps  prio 4
tc class add dev eth1 parent 1:3 classid 1:50 htb rate 5kbps ceil 45kbps  prio 5


这是上传500kbit带宽的分类情况, 1:10是游戏, 1:20是dns, tcp  syn,tcp ack ,ssh,QQ语音之类的,  1:30是网页、virtual**、代理、rdp,1:40是BT,迅雷,PPS和其他未分类,包大小小于300的流量,1:50是BT,迅雷,PPS和未分类,包大小大于300的流量。

下载也作了tc和iptable的配置,不过相对来说没那么重要,就不帖了。主要思路跟上传差不多,没用imq而是用了ifb模块,也就是上传和下载都在同一个interface(即出口)上整形。好像ifb是在iptable之前,具体有空测试一下,所以iptable对下行来说也不重要了,但对于七层识别还是有点用,所以也加上了,openwrt的原版QOS在iptable中是不对下行作mark的。

按这个速率设定来用的话,开下载的同时,游戏的延迟是可以保证的。当然最重要的是在iptable 上把流量用mark分好类,我的分类是按端口和七层识别同时用,比如22,80,53都可以按端口来设,虽然有些应用也会用这些端口,但一般没多大影响。除非有特意改端口的,有影响了,那可以都用七层识别来做。opendpi在七层识别方面还是不错的,openwrt的开发者在几个月前已经开始计划用opendpi换掉l7-filter,不知道最近进展如何。不过我们可以自己编译到openwrt里。

另外,很多QOS的设定都会推荐限制连接数,我没有做方面的限制,至少在我这里没有什么问题。测试3M下行,500k上行的时候迅雷开了3个种子,基本满速,上行还有富余,游戏延迟没问题,QQ语音同时连3个人流畅。 测试20M下行,1M上行的时候,迅雷开20个种子,下行不满速,上行已经满了,迅雷上传显示0,游戏延迟没问题,QQ语音同时连3个人流畅。

因为我玩DOTA经常上浩方,所以自己分析了浩方的数据包特征,CS,WAR3都能匹配,最近去11平台玩DOTA,也分析了下,可以匹配了。opendpi对PPS支持很好,QQ需要修改匹配方法。迅雷和风行这种,只是部分能有些特征包,已经足够了,可以配合recent来mark,要改recent模块。

本来想贴几个图,想想没什么意义。如果有人感兴趣,可以联系我,帮忙写个脚本。

最后贴下iptable的统计信息。其中war3的匹配都在下行里,这里看不到,帖子长度的问题,就不贴了。

上行:

Chain Default (2 references)
    pkts      bytes target     prot opt in     out     source               destination         
41447462 17211275535 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK restore
11384650 1499982652 Default_ct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0
      34    23446 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 length 400:65535 MARK and 0x0
   24641 20134127 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x2 length 800:65535 MARK and 0x0
   37746  5394916 MARK       icmp --  *      *       0.0.0.0/0            0.0.0.0/0           MARK set 0x1
2077725 101041304 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           length 0:128 mark match !0x4 tcp flags:0x3F/0x02 MARK set 0x2
1418481 59188992 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           length 0:128 mark match !0x4 tcp flags:0x3F/0x10 MARK set 0x2
6699462 697530975 MARK       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 length 0:65535 MARK set 0x4
  896620 621880446 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 length 0:65535 MARK set 0x4
2822843 3713061114 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x4 length 300:65535 MARK set 0x5

Chain Default_ct (1 references)
    pkts      bytes target     prot opt in     out     source               destination         
     379    18200 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 tcp multiport ports 22,53 MARK set 0x2
   27432  1704319 MARK       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 udp multiport ports 22,53 MARK set 0x2
  144061  7137731 MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 tcp multiport ports 20,21,25,80,110,443,993,995,5190,3389,3390,5900,1080,1194 MARK set 0x3
     364    23960 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol HF MARK set 0x1
       1       45 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol COUNTERSTRIKE MARK set 0x1
       0        0 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol WARCRAFT3 MARK set 0x1
     966    51955 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol PT11 MARK set 0x1
     174    31318 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol QQ MARK set 0x2
     727   256830 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol HTTP MARK set 0x3
     753   102156 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol PPStream MARK set 0x4
       0        0 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol PPLive MARK set 0x4
  683701 50272737 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol Bittorrent MARK set 0x4
    4534   268934 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 protocol Thunder/Webthunder MARK set 0x8
  103919  7200135 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x0 recent: UPDATE seconds: 60 name: DEFAULT side:source port MARK set 0x4
    4534   268934 MARK       all  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x8 recent: SET name: DEFAULT side:source port MARK set 0x4
11384650 1499982652 CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK save

 

------------------------

来源 https://www.haiyun.me/archives/openwrt-tc-qos.html

Openwrt配置QOS流量带宽限制
#加载模块:

insmod xt_IPID
insmod cls_u32                                                                                         
insmod cls_fw  
insmod sch_htb
insmod sch_sfq
insmod sch_prio

#启用IMQ虚拟网卡
ip link set imq0 up
ip link set imq1 up

#删除旧队列
tc qdisc del dev imq0 root
tc qdisc del dev imq1 root

#上传设置
#增加根队列,未标记数据默认走26
tc qdisc add dev imq0 root handle 1: htb default 26

#增加总流量规则
tc class add dev imq0 parent 1: classid 1:1 htb rate 350kbit

#增加子类
tc class add dev imq0 parent 1:1 classid 1:20 htb rate 80kbit ceil 250kbit prio 0
tc class add dev imq0 parent 1:1 classid 1:21 htb rate 80kbit ceil 250kbit prio 1
tc class add dev imq0 parent 1:1 classid 1:22 htb rate 80kbit ceil 250kbit prio 2
tc class add dev imq0 parent 1:1 classid 1:23 htb rate 80kbit ceil 250kbit prio 3
tc class add dev imq0 parent 1:1 classid 1:24 htb rate 80kbit ceil 250kbit prio 4
tc class add dev imq0 parent 1:1 classid 1:25 htb rate 50kbit ceil 250kbit prio 5
tc class add dev imq0 parent 1:1 classid 1:26 htb rate 50kbit ceil 150kbit prio 6
tc class add dev imq0 parent 1:1 classid 1:27 htb rate 50kbit ceil 100kbit prio 7

#为子类添加SFQ公平队列,每10秒重置
tc qdisc add dev imq0 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev imq0 parent 1:21 handle 21: sfq perturb 10
tc qdisc add dev imq0 parent 1:22 handle 22: sfq perturb 10
tc qdisc add dev imq0 parent 1:23 handle 23: sfq perturb 10
tc qdisc add dev imq0 parent 1:24 handle 24: sfq perturb 10
tc qdisc add dev imq0 parent 1:25 handle 25: sfq perturb 10
tc qdisc add dev imq0 parent 1:26 handle 26: sfq perturb 10
tc qdisc add dev imq0 parent 1:27 handle 27: sfq perturb 10

#添加过滤规则配合Iptables Mark标记
#tc filter add dev imq0 parent 1:0 protocol ip u32 match ip sport 22 0xffff flowid 1:10

#使用U32标记数据,下面使用Iptables mark,容易。
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 22 fw flowid 1:22
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 23 fw flowid 1:23
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 24 fw flowid 1:24
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 25 fw flowid 1:25
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 26 fw flowid 1:26
tc filter add dev imq0 parent 1:0 prio 0 protocol ip handle 27 fw flowid 1:27

#上传数据转入特定链
iptables -t mangle -N MYSHAPER-OUT
iptables -t mangle -A POSTROUTING -o pppoe-wan -j MYSHAPER-OUT
iptables -t mangle -A MYSHAPER-OUT -j IMQ --todev 0

#为特定数据打上标记配合之前过滤规则
#iptables -t mangle -I MYSHAPER-OUT -s 192.168.1.16 -j MARK --set-mark 27 

#限制特定IP上传速度
#iptables -t mangle -I MYSHAPER-OUT -s 192.168.1.16 -j RETURN
iptables -t mangle -A MYSHAPER-OUT -p tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 20 

#提高HTTP连接速度
iptables -t mangle -A MYSHAPER-OUT -p tcp --tcp-flags SYN,RST,ACK SYN -j RETURN
iptables -t mangle -A MYSHAPER-OUT -p udp --dport 53 -j MARK --set-mark 20 

#DNS查询
iptables -t mangle -A MYSHAPER-OUT -p udp --dport 53 -j RETURN
iptables -t mangle -A MYSHAPER-OUT -p icmp -j MARK --set-mark 21 

#ICMP数据
iptables -t mangle -A MYSHAPER-OUT -p icmp -j RETURN
iptables -t mangle -A MYSHAPER-OUT -p tcp -m length --length :64 -j MARK --set-mark 21 

#小数据包
iptables -t mangle -A MYSHAPER-OUT -p tcp -m length --length :64 -j RETURN
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 22 -j MARK --set-mark 22 

#SSH连接
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 22 -j RETURN
iptables -t mangle -A MYSHAPER-OUT -p udp --dport 1194 -j MARK --set-mark 22

#VPN连接
iptables -t mangle -A MYSHAPER-OUT -p udp --dport 1194 -j RETURN
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 80 -j MARK --set-mark 23 

#HTTP连接
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 80 -j RETURN
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 443 -j MARK --set-mark 24 

#HTTPS连接
iptables -t mangle -A MYSHAPER-OUT -p tcp --dport 443 -j RETURN
#上传设置完成

#下载设置
#增加根队列,未标记数据默认走24
tc qdisc add dev imq1 handle 1: root htb default 24
tc class add dev imq1 parent 1: classid 1:1 htb rate 3500kbit

#添加子类
tc class add dev imq1 parent 1:1 classid 1:20 htb rate 1000kbit ceil 1500kbit prio 0
tc class add dev imq1 parent 1:1 classid 1:21 htb rate 1500kbit ceil 2500kbit prio 1
tc class add dev imq1 parent 1:1 classid 1:22 htb rate 2000kbit ceil 3500kbit prio 2
tc class add dev imq1 parent 1:1 classid 1:23 htb rate 1000kbit ceil 1500kbit prio 3
tc class add dev imq1 parent 1:1 classid 1:24 htb rate 1000kbit ceil 1500kbit prio 4

#为子类添加SFQ公平队列
tc qdisc add dev imq1 parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev imq1 parent 1:21 handle 21: sfq perturb 10
tc qdisc add dev imq1 parent 1:22 handle 22: sfq perturb 10
tc qdisc add dev imq1 parent 1:23 handle 23: sfq perturb 10
tc qdisc add dev imq1 parent 1:24 handle 24: sfq perturb 10

#过滤规则
tc filter add dev imq1 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev imq1 parent 1:0 prio 0 protocol ip handle 21 fw flowid 1:21
tc filter add dev imq1 parent 1:0 prio 0 protocol ip handle 22 fw flowid 1:22
tc filter add dev imq1 parent 1:0 prio 0 protocol ip handle 23 fw flowid 1:23
tc filter add dev imq1 parent 1:0 prio 0 protocol ip handle 24 fw flowid 1:24

#下载数据转入特定链
iptables -t mangle -N MYSHAPER-IN
iptables -t mangle -A PREROUTING -i pppoe-wan -j MYSHAPER-IN
iptables -t mangle -A MYSHAPER-IN -j IMQ --todev 1

#分类标记数据
#iptables -t mangle -A MYSHAPER-IN -d 192.168.1.16 -j MARK --set-mark 23 

#限制特定IP下载速度
#iptables -t mangle -A MYSHAPER-IN -d 192.168.1.16 -j RETURN
iptables -t mangle -A MYSHAPER-IN -p tcp -m length --length :64 -j MARK --set-mark 20 

#小数据优先
iptables -t mangle -A MYSHAPER-IN -p tcp -m length --length :64 -j RETURN
iptables -t mangle -A MYSHAPER-IN -p icmp -j MARK --set-mark 20 

#ICMP数据
iptables -t mangle -A MYSHAPER-IN -p icmp -j RETURN
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 22 -j MARK --set-mark 21

#SSH连接
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 22 -j RETURN
iptables -t mangle -A MYSHAPER-IN -p udp --sport 1194 -j MARK --set-mark 21 

#VPN连接
iptables -t mangle -A MYSHAPER-IN -p udp --sport 1194 -j RETURN
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 443 -j MARK --set-mark 22 

#HTTPS连接
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 443 -j RETURN
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 80 -j MARK --set-mark 22 

#HTTP连接
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 80 -j RETURN
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 0:1024 -j MARK --set-mark 23 

#系统服务端口连接
iptables -t mangle -A MYSHAPER-IN -p tcp --sport 0:1024 -j RETURN

 

=============== End

 

分类:

技术点:

相关文章:

  • 2021-04-06
  • 2021-10-04
  • 2021-05-08
  • 2022-01-07
  • 2021-06-27
  • 2021-09-19
  • 2021-11-20
  • 2021-05-29
猜你喜欢
  • 2022-01-11
  • 2022-12-23
  • 2021-12-11
  • 2022-12-23
  • 2021-07-20
  • 2021-09-19
  • 2021-11-16
相关资源
相似解决方案