再战运营商缓存之 使用 iptables 对付死🐎缓存劫持

2019-10-07 05:23:48 +08:00
 SilencerL

不要脸的宣传

原文发布于 我的博客,刚刚经历了一次数据丢失和迁移,正在慢慢找回以前的文章。希望和大佬们换个友链~

起因

与移动的缓存问题进行斗争要追溯到两年前,那时候因为移动竟然连 cnpm 的数据都进行缓存。并且令人喷饭的是:移动的缓存服务器不但经常速度慢到堪比万年王八跑马拉松,甚至还经常宕机,导致我只想安安静静的写个代码却不得不面对一片鲜红的报错:

就此事我也不止一次的投诉到移动的客服部门并且要求至少将我这个宽带的账号加到所谓“白名单”中。当时还写过有理有据的投诉邮件:

但是不知道是福建移动的客服和技术部门是临时工还是其他什么原因,在承诺会解决问题后也一直没有改善。不得已,只能暂时用比较蠢的办法去解决这个问题:使用路由器上的 iptables 判断数据包的内容,如果数据包内包含已知的移动缓存服务器地址(范围)就丢弃这个包:

iptables -I FORWARD -m string --string "Location: http://211.143.146." --algo bm -j DROP

这个方法有效,但是移动的缓存服务器是无穷无尽的,每次都去添加规则真的让人头大。而且这样进行文本的对比太占用资源可能会造成网速下降。后来不得已换了其他运营商的宽带,也就慢慢忘了这茬。

但是最近因为搬家后重新用上了移动的宽带(无奈之举,小区只有移动的口),又要开始面对移动无穷无尽的缓存黑洞:下载些东西总会被移动友好的劫持,并且慷慨的用小水管般的下载速度回馈广大新老用户。

无奈之下只能重新想办法对付令人作藕的移动缓存。

分析劫持过程

重新打开许久没用的 Wireshark,选定一个确定会被劫持到缓存服务器的地址,抓包分析一下劫持的经过:

可以看到我们对源站发起 GET 请求之后,源站返回了一个 302 跳转的包。显然这个 302 跳转包是移动伪造的劫持包。那应该就这个劫持包来分析一下特征并将其丢弃应该就可以对移动的缓存说 886 了。

分析了几个移动返回的 302 劫持包后,发现一个特征:这些包的 TTL 都比较小,范围是 20-30 之间。正常的服务器给的包应该没这么低(吧)。

解决

继续使用路由器的 iptables,根据这个特征,写一个 iptables 规则来丢弃这些劫持包:

iptables -I FORWARD -p tcp -m tcp -m ttl --ttl-gt 20 -m ttl --ttl-lt 30 -j DROP

这样是不是就完美了呢!不,考虑到可能还真的有其他幺蛾子服务器发来的真实数据包的 TTL 也在 20-30 的区间范围内,应该再加一层判断。对比了移动的 302 劫持包和正常的 302 跳转包的报文后,发现移动的劫持包的状态位包含 FIN, PSH, ACK 而正常的 302 跳转包一般不会这三个都有:

移动的劫持包 ↓

正常的 302 包 ↓

(同时可以看到正常 302 包的 TTL 都没这么低)

那么就在 iptables 规则里加上状态位是否包含 FIN, PSH, ACK 的判断:

iptables -I FORWARD -p tcp -m tcp -m ttl --ttl-gt 20 -m ttl --ttl-lt 30 --tcp-flags ALL FIN,PSH,ACK -j DROP

这样应该就能在丢弃移动劫持包的同时尽可能减少误伤正常数据包的可能。

测试一下

访问一下刚才确定会被劫持的地址:

Bravo! 看起来移动的劫持包已经被路由器的 iptables 丢弃了,所以可以下载源站的内容了。

总结

这个方法不一定对所有地区的运营商劫持都有效果,主要还是靠分析一下运营商劫持包的特征加以判断再写成 iptables 规则进行丢弃,有需要的同学可以自己试一下。

10846 次点击
所在节点    宽带症候群
49 条回复
ScotGu
2019-10-07 06:17:11 +08:00
大佬就是大佬,自己动手,丰衣足食。
话说这些缓存服务器还可以收集起来搞事情。
qiufeng812
2019-10-07 06:37:12 +08:00
用 adguard home,一次搞定
SilencerL
2019-10-07 06:39:58 +08:00
@qiufeng812
AdGuard Home 可以干掉移动的 302 劫持吗,我稍微看了下好像只能解决 DNS 劫持……
SilencerL
2019-10-07 06:41:21 +08:00
@ScotGu
可以搞啥事情 速度慢的一批 好像没啥实际利用价值(😂
hymzhek
2019-10-07 07:46:38 +08:00
@SilencerL #4 联通的可以 拿来用某些东西的做加速 移动的不行
wgq2633
2019-10-07 08:05:48 +08:00
膜拜大佬
pypy
2019-10-07 08:33:16 +08:00
你这种方法有一定的门槛,且不通用。通用场景下可以依次做下面的配置:
1. 更换 DNS 为非运营商默认;建议配置加密 DNS。关键字:dnscrypt,DoH,DoT ;
2. 浏览器开启 HSTS 功能。如果浏览器不支持,可以通过插件实现。关键字:HSTS preload ;
以上两步可以解决大多数问题,如果想完全规避,采用第 3 步:
3. 全局或指定 URL 走 proxy。proxy 工具选择“科学类”的。
wwqgtxx
2019-10-07 08:51:40 +08:00
@pypy
首先,很多移动网络直接无脑劫持 HTTP,根本就不在 DNS 上动手脚。
其次,很多下载链接并不支持 HTTPS 所以 HSTS 无解
第三,移动对国内的很多文件也进行垃圾缓存,所以选择代理只会使速度变得更慢
SilencerL
2019-10-07 08:56:32 +08:00
@pypy
第一个情况:更换 DNS 没法解决这种运营商针对热点资源下载的旁路设备抢答劫持(根据 URL 和文件名之类的劫持)
第二个情况:旁路设备抢答劫持通常针对 http 连接,开 HSTS 也救不了没配置 https 的网站……
第三种情况:曾经用过,使用国内的服务器挂个 $$ 去规避劫持,但是自己服务器的带宽又基本都是 10M 以下的,浪费了宽带 200M 的速度,国外服务器同理,跑不满带宽。

所以出于无奈才只能用 iptables 去做反劫持的事。
pypy
2019-10-07 09:14:55 +08:00
@wwqgtxx @SilencerL 如此看来 iptables 的确是性价比最高技术手段了。
也许可以换个思路,降维打击: https://dxss.miit.gov.cn/
SilencerL
2019-10-07 09:18:09 +08:00
@pypy
哈哈哈哈哈哈,工信部的确是个法子~
我跟你说 我见过某省点心劫持工信部投诉网页的我的妈呀笑死我了真是
wwbfred
2019-10-07 09:19:00 +08:00
为了省事把 FIN 一起扔过来结果反而被用来过滤,移动还真是搞笑.
另外建议使用真宽带,联通电信最近这种事情基本上不多了...
wwbfred
2019-10-07 09:21:42 +08:00
最好再在 OUTPUT 链里也加上,这样路由器上的服务也不会被劫持了.
wwbfred
2019-10-07 09:25:06 +08:00
说错了应该扔到 PREROUTING 里...
0ZXYDDu796nVCFxq
2019-10-07 09:44:27 +08:00
给这些缓存投毒试试
自己建个 http 服务器,放个非法内容,下载,如果被缓存,去网监投诉
leafleave
2019-10-07 10:10:56 +08:00
@SilencerL 听说移动的连接 cloudflare 效果很好,你可以试试用国外的服务器使用 v2 套上 cf 加速
shanlan
2019-10-07 11:04:49 +08:00
其实楼主,真的是热门资源的话百度云等网盘的离线下载绝对比你源地址下载要快(被百度云限速除外)
SilencerL
2019-10-07 11:14:07 +08:00
@shanlan
😂 所以应该如何正确使用百度云的离线下载功能进行 cnpm i 的操作以规避 npm 淘宝源数据被劫持的问题,百度云只能用来解决下载一些 [狭义上] 的热点资源(比如软件安装包、电影等),而有一些需要鉴权下载或类似 npm 这样是属于软件内集成下载功能的操作就无能为力了。
所以本文所述的方法是针对劫持的根源进行解决~
huaxie1988
2019-10-07 12:10:14 +08:00
你的规则可能存在误伤,观察下你们那边 IPID 是不是固定的,我们这边 IPID 固定的,所以我用了 IPID 和内容 2 方面判断,使用的 u32 模块,规则是
iptables -A forwarding_rule -p tcp -m u32 --u32 "2&0xFFFF=0XF2 && 0>>22&0x3C@ 12>>26&0x3C@ 9=0X33303220" -j DROP
xiaoke
2019-10-07 12:46:06 +08:00
膜拜技术流!

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

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

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

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

© 2021 V2EX