用iptables对内网设备的上行流量进行限速
起源:一个互联网电视盒子,在使用中,上传速度极大,几乎占满宽带的上行速率,这种情况在运营商看来是违反用户协议的类似PCDN的行为,有可能导致被运营商警告。究其原因,应该是电视盒子的软件本身做了p2p的分发,因为一旦退出“xx直播”这样的软件之后,上行流量就停止了。
研究:找了一个普通的水星305R家用路由器,很小巧,本身带有内网设备限速功能,设置了一个上传50KB/s的限制,效果很好,不影响正常的节目观看。但是每次启动后限速都不再有效,需要重新设置一下。仔细观察后发现,是电视盒子(安卓9)每次加电后都改变了自己网卡的mac地址,从而导致路由器之前设置好的基于mac的限速不再有效。修改电视盒子不大容易,考虑换个路由器给电视盒子专用,设置一个策略禁止所有内网ip的上传速度,这样不管电视盒子的mac地址变化成什么,都可以被限速。
操作:随便用了一个mtk7620n处理器的路由器,刷入openwrt,在iptables里设置诸如下两条规则即可:
iptables -I FORWARD -s 192.168.11.0/24 -j DROP
iptables -I FORWARD -s 192.168.11.0/24 -m limit --limit=1000/s -j ACCEPT
命令立即生效。之后可用iptables-save保存 持久化,若在某些路由器上无法保存,可以加在启动项里,开机启动即可。
-s 表示对源地址为 192.168.x.y 的包处理,这个表示限制的是上传(外出)流量,
-m limit 匹配设置 表示对数据包做limit匹配, 其速度是大约 1000次/s,后继处理根据 -j 的方向而定,
在本例中,得到匹配的外出数据包被接受(ACCEPT)后 做后继处理,
其他超额的、没有得到匹配令牌的数据包则被下一条规则处理,而下一条紧随的规则是 -j DROP,丢弃,从而限制了整体的流速。
这两条规则对tcp和udp都适用。如果仅需针对某类型的数据包处理,可加-p参数:-p tcp 或者 -p udp
在7620处理器的路由器上,视频类小包,每秒1000次允许大约能通过 150-200Kbps的流量,足够发送一些控制命令了。
===================
(2023-3-2)又及:
【1】关于安装了 nft-qos的openwrt
在openwrt的 19.07、21.02、22.03等等较新版本里,已经有现成的nft-qos,可以对ip或者mac地址限速,也可按策略限速。
那么随便一个7620n处理器的路由器(8MB闪存、最大仅64MB内存)也可以方便地使用限速了。
例如刷个最普通的8+64的路由器即可:
https://downloads......./releases/21.02.1/targets/ramips/mt7620/openwrt-21.02.1-ramips-mt7620-zbtlink_zbt-wa05-squashfs-sysupgrade.bin
安装QoS程序界面(会自动安装依赖的程序):
https://downloads......./releases/21.02.1/packages/mipsel_24kc/luci/luci-app-nft-qos_git-20.245.57770-2099bde_all.ipk
及其中文语言包:
https://downloads......./releases/21.02.1/packages/mipsel_24kc/luci/luci-i18n-nft-qos-zh-cn_git-22.362.26829-d548d85_all.ipk
【2】关于带有硬件加速的Padavan系统
只有在WAN设置里关闭HWNAT后,上述基于iptables FORWARD链的限速才会生效,否则数据会通过硬件直接加速了。