移动晚高峰的白名单 QoS 限速

106 天前
 TonyBoney
最近我家的移动宽带从晚上 7 点准时开始网络卡顿,晚上 11 点准时结束,疑似遭到白名单 QoS 限速,具体观察如下:

1. IPv4/IPv6 均存在限制。
2. mtr 的 ICMP 、TCP 、UDP 模式均正常无丢包。
3. 测速网站无论怎么测都正常。
4. 与线路无关,哪怕是 mtr 测试 0 丢包低延迟的 CMIN2 线路也极为卡顿。
5. 经客户端抓包发现,运营商限制到同一目的 IP+端口的 TCP 连接数,多的 SYN 丢掉。
6. 经服务端抓包发现,高峰期开启无差别限速模式,触发限速后,运营商会丢掉服务端发出的含有 PSH 或 FIN 的 TCP 控制报文,于是双方只能等超时后 RST ,导致大量连接处于等待状态很久后才 RST ,大量的不正常连接导致整体网络卡顿。

解决方法:使用该内核模块在 TCP 连接刚建立时发送伪装白名单测速网站的 HTTP GET 请求,效果立竿见影,上述限制消失,高峰期不再卡顿。

/t/1120910
6428 次点击
所在节点    宽带症候群
36 条回复
renyi1986
105 天前
@allin1 据我观察,我用的火棒看芒果,然而火棒没有关机功能,在后台一直上传。我发现,只要长时间上传或者上传达量就可以叫 pcdn ,原则上只要有 p2p 流量就算是 pcdn ,但是运营商也不敢这么叫 pcdn ,他们只敢叫“疑是 pcdn”
allin1
105 天前
@renyi1986 我能找回之前你回我的帖子
8kk321
105 天前
移动同市跨网的上传只有 1M……
TonyBoney
105 天前
Fork 了一份 https://github.com/kmb21y66/nf_deaf
修改如下:
1. 删除 TCP Option 里的魔数 0x1312 ,避免检测,改为复制原数据包的 TCP Option ,同时避免了 TimeStamp 缺失问题。
2. 补全 TCP 头缺失的接收窗口。
3. 把 mark 左移三位,原来只能设置 0-31 的 TTL ,现在能设为正常的 0-255 。
4. 填好了测速的 payload ,不用自己改文件了。
这样一来只修改 TTL 的包至少 wireshark 看顺眼了,不会标黑了
MiKing233
105 天前
@8kk321 你还能有 1M, 我这边同城跨网联通到电信, 延迟 100ms+ 30%丢包, 速度几乎没有, 个位数到十几二十 KB/s, 完全是不可用的程度
q0000x
105 天前
@TonyBoney 是只要编译完加载了就可以还是要像示例上那样添加 nft ?
TonyBoney
105 天前
@q0000x 看项目主页我写的教程,肯定也是要添加 nftables
microka
102 天前
@TonyBoney #27 大佬,请问示例 IP: 1.1.1.1 、示例 IPV6:2606:4700:4700::1111 ,这两个我能直接拿来用吗?还是说需要修改成什么 ip ?
TonyBoney
102 天前
@microka 那里的 IP 填的是你使用的目的服务器地址
microka
102 天前
@TonyBoney #29 但是我想整体绕过限速,比如 pt 时的限速,这种场景下应如何填写呢?
TonyBoney
102 天前
之前写的 iptables/nftables 示例会给每个符合条件的包都发送一次伪装包,会影响通信效率,以我 fork 版本的 mark 写个新例子,mark 视运营商情况自行随意组合,例如设置 TTL 为 3 ,错误的 TCP 校验和,只在握手成功后发一次伪装包,为防止原始包抢先发出设置 jiffies 为 1 ,mark 是 0xDEA10103

1. iptables 太长发不出来,去项目主页看 https://github.com/kmb21y66/nf_deaf/

2. nftables 配置文件示例:

#!/usr/sbin/nft -f

#清空 nftables 规则,小心这一条
flush ruleset

table inet filter {
chain postrouting {
type filter hook postrouting priority 0 ; policy accept;
#被标记的连接不再打标记
ct mark 0xDEA10103 return
#IPv4 ,目的地址 1.1.1.1 ,TCP 端口 0-65535 ,长度大于 120 的包,设置连接标记和包标记后发出
ip daddr {1.1.1.1} tcp dport { 0-65535 } meta length gt 120 ct mark set 0xDEA10103 meta mark set 0xDEA10103 return
#IPv6 ,目的地址 2606:4700:4700::1111 ,TCP 端口 0-65535 ,长度大于 100 的包,设置连接标记和包标记后发出
ip6 daddr {2606:4700:4700::1111} tcp dport { 0-65535 } meta length gt 100 ct mark set 0xDEA10103 meta mark set 0xDEA10103 return
}
}
TonyBoney
102 天前
@microka 可以作用在跳过私有地址后作用到所有地址,但是这个风险比较高,我自己没测试过,可能把你锁在路由器外面,另外就是这个方法只能在你主动发起连接时起作用,别人连接你时无解,这个我也加到项目的 readme 里面了:
#!/usr/sbin/nft -f

#清空 nftables 规则,小心这一条
flush ruleset

table inet filter {
chain postrouting {
type filter hook postrouting priority 0 ; policy accept;
#跳过 IPv4 私有地址
ip daddr {100.64.0.0/10, 0.0.0.0/8, 10.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.88.99.0/24, 192.168.0.0/16, 198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 240.0.0.0/4} return
#跳过 IPv6 私有地址
ip6 daddr {::, ::1, ::ffff:0:0:0/96, 64:ff9b::/96, 100::/64, 2001::/32, 2001:20::/28, 2001:db8::/32, 2002::/16, fc00::/7, fe80::/10, ff00::/8} return
#被标记的连接不再打标记
ct mark 0xDEA10103 return
#IPv4 ,其余所有地址,端口 0-65535 ,长度大于 120 的包,设置连接标记和包标记
ip protocol tcp tcp dport { 0-65535 } meta length gt 120 ct mark set 0xDEA10103 meta mark set 0xDEA10103 return
#IPv6 ,其余所有地址,端口 0-65535 ,长度大于 100 的包,设置连接标记和包标记
ip6 nexthdr tcp tcp dport { 0-65535 } meta length gt 100 ct mark set 0xDEA10103 meta mark set 0xDEA10103 return

}

}
microka
102 天前
@TonyBoney 请问 #31 #32 的 nftables 配置文件在 openwrt 上应如何编辑?在 /etc/firewall.user 里添加?
TonyBoney
101 天前
@microka 问问别人吧,好多年没用过 openwrt 了
molezznet
100 天前
现在夜间上行直接砍半
官网测速,白天显示上行 100mbps
夜间 7-10 点左右,显示签约上行 40
stonesirsir
100 天前
@Yien 原版的被检测的,这个作者这个目前没问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1135261

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX