再战运营商缓存之 使用 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 规则进行丢弃,有需要的同学可以自己试一下。

10783 次点击
所在节点    宽带症候群
49 条回复
SilencerL
2020-01-28 02:08:47 +08:00
@a154415433
用的是梅林, 理论上所有支援 iptables 的路由器都可以用这个方法
a154415433
2020-01-29 20:28:24 +08:00
@SilencerL 我也用的梅林,这个输入上去无法找到 ttl
imyoona
2020-02-01 17:14:34 +08:00
0594 测试了一下。现在这个地址劫持返回了个北京移动的 cache。这个靠 ttl 的规则可以过滤福建移动,对北京移动就没办法了,而且我这里的 302 包没有 FIN, PSH, ACK
SilencerL
2020-02-01 18:19:13 +08:00
@imyoona
举一反三一下观察劫持包的特征吧…… 实在不行就只能靠屏蔽 IP 段来解决了。
a154415433
2020-02-02 10:52:59 +08:00
admin@RT-AC66U-F768:/tmp/home/root# iptables -I FORWARD -p tcp -m tcp -m ttl --t
tl-gt 20 -m ttl --ttl-lt 30 --tcp-flags ALL FIN,PSH,ACK -j DROP
iptables v1.3.8: Couldn't load match `ttl':File not found
a154415433
2020-02-03 18:11:59 +08:00
@SilencerL 用这个命令成功感谢,
iptables -I FORWARD -m string --string "Location: http://117.143.109." --algo bm -j DROP
a154415433
2020-02-03 20:07:54 +08:00
iptables-save 保存不了,小白折腾不动了,
OllyDebug
2020-03-22 08:33:46 +08:00
为啥不用 https
SilencerL
2020-03-22 16:51:57 +08:00
@OllyDebug
因为对方网站未提供 https,甚至国内还有很大一部分网站未提供 https

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

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

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

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

© 2021 V2EX