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

10533 次点击
所在节点    宽带症候群
49 条回复
dusu
2019-10-07 13:01:26 +08:00
提供解决方案参考
对于重要的下载地址直接 rewrite
aaa.rar
可以重写为
aaa20191007.rar

根据更新频率自己安排时间颗粒度
保证用户下载的内容是最新的就行
qiufeng812
2019-10-07 13:46:32 +08:00
@SilencerL 我这里三家大厂的 dns。都被移动封了 53 端口。所以,无论设置什么 ip。都会被移动的 dns 机组抢答,而且我直接没有正确的 dns 给我应答。你不如先查查,你用的 dns 有没有被移动封了 53 端口。
你如果第一关的 dns 会应答正确的 ip。就继续 iptables。
我现在看视频的效果比原来移动的抢答状态下爽。说明,我应该没被移动 http 劫持。
httpt 劫持要比 dns 劫持来得花钱,能 dns 搞定的,自然不需要更花钱的 http 劫持。
celeron533
2019-10-07 13:56:17 +08:00
尝试在 URL 后面加废参数能不能强刷缓存呢?比如 http://foo.bar/download.zip?dummy=123
SilencerL
2019-10-07 16:34:57 +08:00
@qiufeng812
从抓包的情况和劫持的实际表现来看应该是 http 劫持没跑了。
所以并不是 DNS 劫持…
eason1874
2019-10-07 16:47:39 +08:00
确实,两三年前我也投诉过这个问题,缓存就算了,缓存服务器还经常宕机,导致的问题不是慢,而是根本访问不了。

不过这两年 HTTPS 基本普及了,就很少遇到这个问题了。

HTTPS 是不会进行 HTTP 302 调度的,你以后用 HTTPS 的就行了。如果 HTTPS 也被 302 了,那不关运营商的事,那是网站本身 CDN 启用了这个调度服务,像又拍云就有提供 HTTP 302 调度。
SilencerL
2019-10-07 16:50:10 +08:00
@celeron533
😂不行,我曾经也很天真的试过……
SilencerL
2019-10-07 16:53:49 +08:00
@eason1874
是的,https 完全可以解决这个问题。

但是引用 https://www.v2ex.com/t/313702 中的一句话:
“其实这就像很多 Linux 发行版的仓库一样,包本身有单独的 GPG 签名来防篡改,因此文件本身可以通过 HTTP 传输,也可以被代理和缓存。”

还有很多地方没上 https,这就很让人头大……不过 https 是大势所趋,运营商 http 劫持的问题终归会被解决掉(吧)。
linchao1900
2019-10-07 17:02:08 +08:00
iptables 反运营商劫持,已用 2 年。

#ISP 防劫持 #误伤极大
#iptables-mod-ipopt iptables-mod-conntrack-extra iptables-mod-filter
iptables -I FORWARD -p tcp --sport 80 -m ttl --ttl 65 -j REJECT
iptables -I FORWARD -p tcp --sport 80 -m ttl --ttl 65 -j LOG --log-prefix "ISP:"

CDN 劫持 也很多。比如导航站,基本劫持。
#Hao123 防劫持
iptables -I FORWARD -p tcp --sport 80 -m string --string "var u='http://',u='https://www.hao123.com/?tn=" --algo bm -j DROP
huson
2019-10-07 19:52:10 +08:00
windows 有没有办法
SilencerL
2019-10-07 20:08:13 +08:00
@huson
我查阅了一下 Windows 下的 netsh 命令参数,好像没有可以实现类似功能(根据 TTL 和 Flags 来写策略)的方法……
所以如果可能的话换一个支持 iptables 的路由器吧还是。
Unclev21x
2019-10-07 21:30:17 +08:00
给大佬鞠躬!🐂!
CloudnuY
2019-10-07 23:29:03 +08:00
投诉过几年联通没起作用
也用了几年在路由器用 iptables 拦截特征包防劫持了😂
ungrown
2019-10-08 11:54:46 +08:00
楼主,我挺好奇你平时都是上什么网站下什么资源的,因为我自己是真的很久没下到过 HTTP 的资源了(除极少数古老小众站点)。
不管是软件、文献、多媒体、老少咸宜的亦或是 XX 禁的,不管是境内境外站点上的,我真的很久没碰上 http 的了。
SilencerL
2019-10-08 12:04:33 +08:00
@ungrown
国内还有很多网站没上 https,所以有的时候无奈只能走 http 下载东西。
dawnh
2019-10-08 16:22:56 +08:00
这么多年了,原来移动还没解决这个缓存服务器经常挂的问题啊。
另外,不要以为有了 HTTPS 就万无一失了,移动的缓存可是有连 SSL 都给你 proxy 的行为的,而且它的缓存服务器也经常炸,表现在 HTTPS 上就是证书拿不到。
wwbfred
2019-10-08 17:37:01 +08:00
@linchao1900 你这个误伤大倒是次要的,每个 http 包都要遍历查找一遍...
fhbyljj
2019-10-13 10:57:05 +08:00
大佬,收小弟吗
barnettluo1994
2019-10-15 20:45:24 +08:00
找个电信或者联通的朋友给你做隧道吧,你隧道过去就行····别直接用移动的就行
barnettluo1994
2019-10-15 20:48:05 +08:00
你可以走我这里的一个交换中心变成电信或者联通的 ip 用。还行
a154415433
2020-01-26 10:27:42 +08:00
被移动强*了 2 年了,谢谢分享,等等试试,请问,路由用的是 merlin,还是 openwrt

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

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

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

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

© 2021 V2EX