找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 9382|回复: 62

分享一个不到60行但是非常智能的QoS脚本

[复制链接]
发表于 2020-4-1 12:13 | 显示全部楼层 |阅读模式
本帖最后由 easyteacher 于 2020-4-7 16:51 编辑

需要安装
  • ethtool
  • tc
  • kmod-sched-cake
  • iptables-mod-hashlimit
  • iptables-mod-conntrack-extra
可选安装ipset相关组件,用于匹配视频网站,ipset名称为dscp_video

这几行根据路由器和网络的实际情况进行修改:

  1. QOS_DEVICE=eth0.2 # 修改为WAN设备名
  2. DOWNLOAD_SPEED=30 # 下载速度,单位mbit
  3. UPLOAD_SPEED=30 # 上传速度,单位mbit
  4. PRIORITIZED_PORT="22,53" # 特殊优先端口,如SSH、DNS
复制代码

整个代码去除注释和空行不超过60行,实现了对下载和游戏流量的区分,尽可能减少iptables的规则数,非常的轻巧,适合性能孱弱的路由器。二楼讲下思路。

  1. #!/bin/sh
  2. QOS_DEVICE=wlan0
  3. DOWNLOAD_SPEED=2
  4. UPLOAD_SPEED=1
  5. SPEED_THRESHOLD=1
  6. PRIORITIZED_PORT="22,53"

  7. for DEV in $(ls /sys/class/net) ; do
  8.         ethtool -K $DEV tso off 2>/dev/null
  9.         ethtool -K $DEV ufo off 2>/dev/null
  10.         ethtool -K $DEV gso off 2>/dev/null
  11.         ethtool -K $DEV gro off 2>/dev/null
  12. done

  13. # -----tc----- #
  14. tc qdi del dev br-lan root
  15. tc qdi del dev $QOS_DEVICE root
  16. tc qdi replace dev $QOS_DEVICE root cake diffserv4 nat ack-filter-aggressive bandwidth ${UPLOAD_SPEED}mbit
  17. tc qdi replace dev br-lan root cake diffserv4 nat ingress bandwidth ${DOWNLOAD_SPEED}mbit

  18. # -----iptables----- #
  19. _name="mark_DSCP_ul mark_DSCP_dl mark_BULK_UL mark_BULK_DL mark_FAST mark_QUICK cowbqos"
  20. for NAME in $_name ; do
  21.         iptables -t mangle -N $NAME 2>/dev/null
  22.         iptables -t mangle -F $NAME
  23. done
  24. iptables -t mangle -C POSTROUTING -o br-lan -j mark_DSCP_dl || iptables -t mangle -A POSTROUTING -o br-lan -j mark_DSCP_dl
  25. iptables -t mangle -C PREROUTING -i br-lan -j mark_DSCP_ul || iptables -t mangle -A PREROUTING -i br-lan -j mark_DSCP_ul
  26. iptables -t mangle -C OUTPUT -o $QOS_DEVICE -j mark_DSCP_ul || iptables -t mangle -A OUTPUT -o $QOS_DEVICE -j mark_DSCP_ul

  27. # mark_BULK_UL start
  28. iptables -t mangle -A mark_BULK_UL -m hashlimit --hashlimit-name BULK_TRAFFIC_UL --hashlimit-mode srcip,dstip,dstport --hashlimit-above ${SPEED_THRESHOLD}kb/second --hashlimit-burst 20k --hashlimit-htable-max 1000000 --hashlimit-htable-expire 10000 --hashlimit-htable-gcinterval 10000 -j DSCP --set-dscp-class cs1
  29. iptables -t mangle -A mark_BULK_UL -m hashlimit --hashlimit-name BULK_TRAFFIC_UL_PKT --hashlimit-mode srcip,dstip,dstport --hashlimit-above 300/second --hashlimit-burst 30 --hashlimit-htable-max 1000000 --hashlimit-htable-expire 10000 --hashlimit-htable-gcinterval 10000 -j DSCP --set-dscp-class cs1
  30. # mark_BULK_UL end

  31. # mark_BULK_DL start
  32. iptables -t mangle -A mark_BULK_DL -m hashlimit --hashlimit-name BULK_TRAFFIC_DL --hashlimit-mode srcip,srcport,dstip --hashlimit-above ${SPEED_THRESHOLD}kb/second --hashlimit-burst 200k --hashlimit-htable-max 1000000 --hashlimit-htable-expire 10000 --hashlimit-htable-gcinterval 10000 -j DSCP --set-dscp-class cs1
  33. iptables -t mangle -A mark_BULK_DL -m hashlimit --hashlimit-name BULK_TRAFFIC_DL_PKT --hashlimit-mode srcip,srcport,dstip --hashlimit-above 300/second --hashlimit-burst 30 --hashlimit-htable-max 1000000 --hashlimit-htable-expire 10000 --hashlimit-htable-gcinterval 10000 -j DSCP --set-dscp-class cs1
  34. # mark_BULK_DL end

  35. # mark_FAST start
  36. iptables -t mangle -A mark_FAST -m hashlimit --hashlimit-name FAST_TRAFFIC --hashlimit-mode srcip,srcport,dstip,dstport --hashlimit-upto ${SPEED_THRESHOLD}kb/second --hashlimit-burst 40k --hashlimit-htable-max 1000000 --hashlimit-htable-expire 10000 --hashlimit-htable-gcinterval 10000 -j DSCP --set-dscp-class af31
  37. # mark_FAST end

  38. # mark_QUICK start
  39. iptables -t mangle -A mark_QUICK -m connbytes --connbytes 250: --connbytes-dir both --connbytes-mode avgpkt -j RETURN
  40. iptables -t mangle -A mark_QUICK -m connbytes --connbytes :102400 --connbytes-dir both --connbytes-mode bytes -j RETURN
  41. iptables -t mangle -A mark_QUICK -m hashlimit --hashlimit-name QUICK_TRAFFIC_PKT --hashlimit-mode srcip,dstip,dstport --hashlimit-above 128/second --hashlimit-burst 1 --hashlimit-htable-max 1000000 --hashlimit-htable-expire 10000 --hashlimit-htable-gcinterval 10000 -j RETURN
  42. iptables -t mangle -A mark_QUICK -m hashlimit --hashlimit-name QUICK_TRAFFIC_BYTE --hashlimit-mode srcip,dstip,dstport --hashlimit-above 13kb/second --hashlimit-burst 50k --hashlimit-htable-max 1000000 --hashlimit-htable-expire 10000 --hashlimit-htable-gcinterval 10000 -j RETURN
  43. iptables -t mangle -A mark_QUICK -j DSCP --set-dscp-class cs6
  44. # mark_QUICK end

  45. iptables -t mangle -A mark_DSCP_ul -p tcp -m multiport --ports 80,443 -j mark_FAST -m comment --comment "MARK-FAST-CONNECTION-LAN-WAN"
  46. iptables -t mangle -A mark_DSCP_ul -j mark_BULK_UL -m comment --comment "MARK-BULK-CONNECTION-LAN-WAN"
  47. iptables -t mangle -A mark_DSCP_ul -j mark_QUICK -m comment --comment "MARK-QUICK-CONNECTION-LAN-WAN"
  48. iptables -t mangle -A mark_DSCP_dl -p tcp -m multiport --ports 80,443 -j mark_FAST -m comment --comment "MARK-FAST-CONNECTION-WAN-LAN"
  49. iptables -t mangle -A mark_DSCP_dl -j mark_BULK_DL -m comment --comment "MARK-BULK-CONNECTION-WAN-LAN"
  50. iptables -t mangle -A mark_DSCP_dl -j mark_QUICK -m comment --comment "MARK-QUICK-CONNECTION-WAN-LAN"
  51. iptables -t mangle -A mark_DSCP_ul -p tcp -m multiport --dports $PRIORITIZED_PORT -j DSCP --set-dscp-class cs6
  52. iptables -t mangle -A mark_DSCP_dl -p tcp -m multiport --sports $PRIORITIZED_PORT -j DSCP --set-dscp-class cs6
  53. iptables -t mangle -A mark_DSCP_ul -p udp -m multiport --dports $PRIORITIZED_PORT -j DSCP --set-dscp-class cs6
  54. iptables -t mangle -A mark_DSCP_dl -p udp -m multiport --sports $PRIORITIZED_PORT -j DSCP --set-dscp-class cs6
复制代码





我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2020-4-1 12:13 | 显示全部楼层
本帖最后由 easyteacher 于 2020-4-8 00:13 编辑

改用hashlimit-burst替代connbytes模块,原来的示意图已经不适用。
低带宽环境下可以把THRESHOLD调低,因为有hashlimit-burst的存在,所以正常浏览网页的流量不会被打上CS1标签。
只有加载大的图片、看视频或者下载的流量,burst的令牌用完了,才会被打上CS1标签。

效果对比
1. 开启QoS,上1下2,tcping延迟没有明显波动,网页能看个文字,图片加载非常缓慢(期望的结果,大流量下载的时候能看个文字就满足了)

2. 仅用htb限速,上1下2,tcping延迟飙升

3. 仅用cake qdisc,不施加iptables规则:网页半天打不开,连文字都看不了


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2020-4-1 13:33 | 显示全部楼层
目前使用起来效果不错,欢迎提出更多思路。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-1 14:44 | 显示全部楼层
支持一下喔
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-1 14:59 | 显示全部楼层
网络已经道德败坏,暂时国内DS还没有滥用情况,端口、小包通通都被滥用,已经无法控制了。
控制br-lan的弊端就是,内网一并控制,千兆内网就废了。

点评

如果一个软件想采用大量发送小包的方式伪装成游戏流量,首先它可能无法满足速度≤50kB/s,其次发包的tickrate可能会超过128个包/s。 不用br-lan,则可能要增加tc规则,tc规则对性能孱弱的路由器来说是噩梦,这个目  详情 回复 发表于 2020-4-1 16:17
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2020-4-1 16:17 | 显示全部楼层
wulishui 发表于 2020-4-1 14:59
网络已经道德败坏,暂时国内DS还没有滥用情况,端口、小包通通都被滥用,已经无法控制了。
控制br-lan的弊 ...

如果一个软件想采用大量发送小包的方式伪装成游戏流量,首先它可能无法满足速度≤50kB/s,其次发包的tickrate可能会超过128个包/s。
不用br-lan,则可能要增加tc规则,tc规则对性能孱弱的路由器来说是噩梦,这个目前还没见到太好的解决方法,有个savedscp但是不知道怎么用。

点评

那个是用来给上级设备识别的吧  详情 回复 发表于 2020-4-1 17:23
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-1 17:23 | 显示全部楼层
easyteacher 发表于 2020-4-1 16:17
如果一个软件想采用大量发送小包的方式伪装成游戏流量,首先它可能无法满足速度≤50kB/s,其次发包的tick ...

那个是用来给上级设备识别的吧
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-1 19:56 | 显示全部楼层
判断iptables规则是否存在再添加可以这样用,很方便
iptables -t mangle -C PREROUTING -i $QOS_DEVICE -j mark_DSCP_dl || iptables -t mangle -A PREROUTING -i $QOS_DEVICE -j mark_DSCP_dl
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-1 21:08 | 显示全部楼层
兼容 flow sfe加速,和低调上网 去广告之类的吗?

点评

sfe不行,去广告应该可以,刚刚更新修复了从路由器发出的流量没能正确匹配的问题。  详情 回复 发表于 2020-4-1 23:06
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2020-4-1 23:06 | 显示全部楼层
mjyhj 发表于 2020-4-1 21:08
兼容 flow sfe加速,和低调上网 去广告之类的吗?

sfe不行,去广告应该可以,刚刚更新修复了从路由器发出的流量没能正确匹配的问题。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-1 23:49 | 显示全部楼层
我直接学了qos,在wan接口上egress控制,也只是搬了些qos的规则。只是效果也不好。事实上直接用qos、sqm效果都不好,因为端口、小包都已经滥用,已经不是几年前的网络环境了。各种视频app、网盘、测速。。。全部都挤在80、小包,无法区分。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-2 09:26 | 显示全部楼层
我以更加清晰易懂的方式给楼主的脚本整理,并且加上可以stop的脚本,第二次运行时只需要把# exit的注释去掉就清理干净了,适合不断修改、折腾。不能直接用,要把 wan接口的eth1替换成你实际的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-4 09:26 | 显示全部楼层
本帖最后由 wulishui 于 2020-4-5 09:52 编辑

不是我说,我认真研究了下,还是觉得楼主搞得太复杂,而且诡异。
在我这效果不好(用到的模块我通通都有,因为我也在搞,模块都选了),因为我的中继流量非常小,只有200k(这网络环境差得实测连爱快都搞不定)。但是用我自己的qos(只是简单的连接数、端口范围分类,其实是来源于官方qos的规则,连什么小包优先都不需要)反而非常好,一边开着机顶盒看视频、一边qbittorrent下载(看了下速度是150k左右),我浏览网页还是可以快速打开。视频居然也不卡,我都觉得奇怪(不用怀疑总带宽,因为我总带宽设置死了1.5Mbps)。

-p tcp -m connlimit --connlimit-above 100 -j MARK --set-xmark 14/0xff
-p tcp -m multiport --ports 21,22,53 -j MARK --set-xmark 10/0xff
-p udp -m multiport --ports 21,22,53 -j MARK --set-xmark 10/0xff
-p tcp -m multiport --ports 80,443 -m length --length :64 -j MARK --set-xmark 11/0xff
-p udp -m multiport --ports 80,443 -m length --length :64 -j MARK --set-xmark 12/0xff
-p tcp -m multiport --ports 20,25,110,143,465,587,993,995 -j MARK --set-xmark 11/0xff
-p tcp --sport 1024:65535 --dport 1024:65535 -j MARK --set-xmark 14/0xff
-p udp --sport 1024:65535 --dport 1024:65535 -j MARK --set-xmark 14/0xff


我把楼主你这两条规则改了下拿来实验(放在最前面,hashlimit 模块有),发现完全不会有流量产生:
-m hashlimit --hashlimit-name cowbqos --hashlimit-mode srcip,dstip,dstport --hashlimit-above 50kb/second --hashlimit-burst 51200 --hashlimit-htable-max 1000000 --hashlimit-htable-expire 10000 --hashlimit-htable-gcinterval 10000  -j MARK --set-xmark 14/0xff
-m connbytes --connbytes 1048576: --connbytes-dir both --connbytes-mode bytes -j MARK --set-xmark 14/0xff

点评

增加了mark_FAST判断,对刚起步的连接20K内的数据打上AF31。 体验了一下上传1mbit下载2mbit然后同时下载BT和浏览网页的感觉,有明显优化。  详情 回复 发表于 2020-4-5 22:28
我这里hashlimit可以正常匹配,已经设置成上传512kbit,下载1600kbit了。 [attachimg]370588[/attachimg] [attachimg]370589[/attachimg] 但是存在问题,我本来以为把hashlimit-mode设置成srcip,dstip,dstport  详情 回复 发表于 2020-4-5 18:37
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-4 09:48 | 显示全部楼层
本帖最后由 wulishui 于 2020-4-5 09:52 编辑

我们要先把对全局影响最大的放在最前面,而不是把优先级最高的放在前面,先把害虫干掉,其它小问题慢慢处理。

起先我十几二十条规则,发现就是扯淡,完全无法控制,网上说的小包、什么SYN,ACK什么优先,加进去了必死无疑(连官方qos都没这种用法)。最后精简到这8条,效果却满意了,-nv去看,每一条规则都合理分流了。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2020-4-5 00:24 | 显示全部楼层
嘿,巧了,正在研究

点评

有成果了没?  详情 回复 发表于 2020-4-5 09:53
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-3-28 19:36

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表