以下部分节选自我前几天的动态:
“
如果稍微关注宽带圈子,应该知道各省运营商在抓上传过高的用户。其实主要是用pcdn赚钱的用户。管理稍好的地区,会查你是不是在用pcdn,让你签协议,保证不用,否则断网。国内这块的政策是商用补贴家用,我们用的家庭宽带比国外便宜的多,用上行带宽赚钱,我是完全反对的。管理不行的地区,查到高上行的用户直接就警告,让签协议,甚至直接断网让你申诉,磨磨唧唧的才给你恢复。
国内几乎所有视频直播网站,都在使用pcdn技术节约他们的带宽。也就是你看视频和直播时,你的设备会向大量其它用户传输数据。这也会导致高上传。
所以看视频直播看得多,月上行总量就会很高,有些地方的运营商就会处理你。这怎么办呢?
浏览器chrome/edge有个webrtc control的扩展,可以禁止网站获取你的ip,这样就不会有上传了。问题是手机。而且设备过多的话,每一台都操作有点麻烦。
”
我纠结这个问题的原因是,我宽带是很早以前办的,有公网ipv4,光猫桥接,我很珍惜这个配置。如果因为上传量过高给我断网了,恢复之后失去公网ip,或者直接取消公网ip,那就非常难受了。我这里不使用PCDN设备,不玩PT,甚至BT都很少使用。如果是因为我贪那点钱,给我封了我也认的,关键是我没做错什么,突然因为上传量过高被封的话,我肯定不能接受。错的是谁?我不好说。但目前的情况就是这些视频直播网站在使用用户的上传节约他们的服务器带宽。我这里不只是我在用网,家里人也在用。所以解决起来比较困难。设备比较多,软件比较多,直接按设备限速不符合我的要求。
我目前使用的路由器是华硕AX86U,梅林原版固件,安装了flexqos。我咨询了很多,查了很多资料,可行的方法无非这3种:
1 功能自我阉割:关闭fullcone nat,关闭upnp,关闭ipv6...
2 换软路由,安装ikuai或panabit等固件。
3 防火墙针对特定协议(例如stun)进行封锁,容易误伤。
我自己琢磨了另一种方法,依然是使用flexqos。这个解决方法适用面非常窄。
1 一台支持梅林原版固件的华硕路由器,性能不能太差,至少是bcm4908或更高。
2 你得有能力把flexqos装上。这个插件需要在路由器ssh里从raw GitHub上拉取两个文件。首先你的运营商DNS就不一定解析这个网站,就算解析成功了,连接性和速度也非常拉跨。第一个文件拉取可能会失败,失败可以重来。怕的是第一个文件成功,第二个文件失败。第二个文件是.asp文件,就是梅林固件后台的一个设置界面。没有它,你不能设置qos参数,那和没装也没什么区别。解决办法是我自己研究的。先在电脑端手动下载到.sh文件,把里面用来拉取第二个文件的raw GitHub地址换成连接性比较好的镜像网站,用winscp手动上传到它应该存在的位置,给它可执行权限。然后ssh里手动使用这个脚本进行安装,安装过程会拉取第二个文件,可以直接成功。我只是简单讲讲思路,这不是教程。如果有需要那个镜像网址可以私信我。如果电脑端也下不到GitHub的文件,我只能说算了吧...
3 最重要的一点,AX86U关闭硬件加速,再开启adaptive qos和flexqos,下行只能跑一两百M。如果你的宽带是200M或更高,一旦开始QOS,下行带宽会距离你的签约带宽非常遥远。如果你不能接受,也不用折腾了。当然,硬件加速和QOS都是可开可关的。你可以想用的时候开也没问题。
下面简单讲讲flexqos配置方法:
1 在DHCP服务器设置中,将严重使用视频和直播软件的设备IP和MAC绑定。
2 关闭AX86U的硬件加速,runner和flow cache。我可以给出ssh命令。
fc disable
fc flush
runner disable
nvram set runner_disable="1"
nvram set runner_disable_force="1"
nvram set fc_disable="1"
nvram set fc_disable_force="1"
nvram commit
ssh里应该是这样的:
Morpheus@AX86Umor:/tmp/home/root# fc disable
Broadcom Packet Flow Cache learning via BLOG disabled.
Morpheus@AX86Umor:/tmp/home/root# fc flush
Broadcom Packet Flow Cache flushing the flows
Morpheus@AX86Umor:/tmp/home/root# runner disable
Broadcom Packet Flow Cache HW acceleration <DISABLED>
CPU Speed (*) ==> Disable
Changing power settings. Forcing cpu to max frequency.
Set cpuspeed to on(pwr config --cpuspeed on) to make it adaptive again
Morpheus@AX86Umor:/tmp/home/root# nvram set runner_disable="1"
Morpheus@AX86Umor:/tmp/home/root# nvram set runner_disable_force="1"
Morpheus@AX86Umor:/tmp/home/root# nvram set fc_disable="1"
Morpheus@AX86Umor:/tmp/home/root# nvram set fc_disable_force="1"
Morpheus@AX86Umor:/tmp/home/root# nvram commit
Morpheus@AX86Umor:/tmp/home/root#
如果需要打开硬件加速:
nvram set runner_disable="0"
nvram unset runner_disable_force
nvram set fc_disable="0"
nvram unset fc_disable_force
nvram commit
runner enable
fc enable
如果需要检查nvram状态:
nvram get runner_disable
nvram get runner_disable_force
nvram get fc_disable
nvram get fc_disable_force
梅林固件的tools也能看到当前的runner flow cache状态。
这些命令重启后是保留的。如果只是想试一下,不修改nvram即可。
如果只关闭硬件加速,不使用QOS,AX86U能跑大概400M左右的带宽。
为什么要关闭硬件加速?开启adaptive qos,flexqos不修改iptables规则,是不用关闭硬件加速的,这样AX86U应该可以带动500M宽带(依然带不动1000M的)。但只要修改自定义iptables规则,如果不关闭硬件加速,几乎所有流量都会绕过QOS。这个问题SNB早已有人讨论过。
3 在flexqos设置页面,把严重使用视频直播软件的设备IP的全部流量划分到“视频流”。
QOS mode建议使用fq codel,对游戏的处理效果比默认的好。
iptables规则前四条是默认的,只有这四条,你是不用关闭硬件加速的。后两条是我手动添加的。
appdb规则我没有修改。下面带宽是重点。左边分类对应QOS开启页面的自定义顺序。learn from home必须放在最底下,这个分类有bug,它包括了其它几个分类,按flexqos作者的教程,放最底下,它就完全不会起作用了。net control是网络控制包,例如DNS,这个不能自定义顺序。streaming是视频流,我给它设置的最大上行只有2.5M。也就是严重使用视频直播软件的设备,还有其它设备的视频流类应用,加一起最多使用2.5M上传。我试过网页端b站上传视频,用的是TLS,不会被分类在这里。
我这里宽带是342M下行,35M上行(爆发式上行,稳定值大概在35M)。为什么我只设置104M下行?
QOS的带宽设置是有说法的。必须满足以下两个要求:
1 无QOS,网络空载时测速。QOS值必须明显低于该值。建议设置为最高速度的85%-95%。越低效果越好,越高越容易导致QOS失效。因为测速是按大包测速的,实际使用是大包小包混合。小包多了,数据包里不用于传输数据的部分占比就明显了。运营商限制你的速度限制的是全局速度。不传输数据的占比多了,你实际传输数据的带宽应该是低于大包测速的。解决这个问题的正确办法是设置wan packet overhead,但国内完全不知道这个是多少。这里默认0的话,效果就是主要是大包传输时,QOS肯定有效,小包多了,就要看你填的QOS上下行数值了,填的越低,更可能让QOS持续有效。我说的不太明白....反正我的建议是填的稍微低点。
2 开启QOS后,测速必须接近你填写的值。如果测速值远高于你填的值,说明QOS无效,这是固件bug。如果远低于你填的值,说明CPU性能不足。另外你需要验证一点,同时跑满上行和下行时,CPU单核占用不要超过90%。是任何一瞬间都不要超过90%。这很好理解,如果CPU处理QOS吃满了,QOS肯定是无效的,因为实时性已经无法满足了。建议留的余量多一些,因为小包多了,跑到相同带宽,吃的U更多。
AX86U关闭硬件加速,开启a qos f qos,最高下行大概是270M,此时单核完全吃满。
这是一些测试结果。
设置下行最高168M,CPU单核还是会偶尔达到90%以上占用。索性直接设置到104M,当百兆宽带使用了。这时候CPU单核占用不超过70%,是非常稳妥的状态。
这就是我目前的QOS配置,上行25,下行104。AX86U,当百兆路由器使用。
实际效果,这个电视的所有流量都会被认为是视频流,享受视频流25M x 10% = 2.5M上行的待遇。
最令我震惊的是关闭硬件加速之后的adaptive qos + flexqos的效果,真的非常好。我测试了一下,跑满下行带宽,打开ow,玩的过程中丢包率严格为0,一次丢包都没有,延迟非常稳定,和不开QOS不下载时完全一致。我玩的时候甚至以为没开下载,切出去看了一下。效果完美的不可思议。缺点也非常明显,ARM架构处理器性能过于低下,加上华硕单核优化,最高带宽非常的低,2.5G wifi6路由器只能当百兆路由器使用。
我不明白为什么nat转发,qos,上行,下行,全部跑在一个核心。如果你说nat包转发和qos有先后顺序问题,只能跑单核,那上行和下行各吃一个核心难道不是随便做吗?菜。
想恢复也很容易,qos关掉,在我这就可以跑满上下行带宽了,300M小水管是这样的。如果需要完全恢复,那么需要去ssh里面把硬件加速打开。这些操作都不要重启路由器,也不会断开WAN的连接。所以你可以按需启动,按需关闭。虽然不完美,但可控可选,也是一种完美。
现在只剩一个问题,如果有那种Windows下运行的脚本文件,双击,就执行连接路由器ssh,开启硬件加速,双击另一个文件,关闭硬件加速,这样就不用一条一条命令输入了。我完全不会这个操作....不会编程是这样的,僵住了属于是。
至此问题解决了。如果你问为什么不直接用限速QOS给那些设备限速,我想说,限速QOS也会导致硬件加速关闭,而且我需要adaptive qos的深度包检测,按流量类别安排优先级,以及flexqos的fq codel队列模式。
本文可能确实没什么用,只是记录一下本次折腾的过程和结果。