从原理上根绝运营商劫持,基于 TTL 的反劫持 iptables 规则

2017-01-22 20:04:41 +08:00
 KCheshireCat

不管你是遇到加小尾巴跳转,iframe 嵌套广告,302 跳转,还是 JavaScript 脚本劫持.
只要是基于旁路设备监听抢答数据包这个原理的劫持行为. 这套 iptables 规则就能应对.

注意:目前仍在实验阶段,浙江移动测试有效,无法保证不会对正常的连接产生破坏.

主要原理:基于 IP 头 TTL 值的判断丢包.并使用 ACK 空应答包,和装满数据的 TCP 包来更新 TTL,防止正常 TTL 变动导致连接断开.

项目地址

需要模块

注意

工作原理

10302 次点击
所在节点    宽带症候群
29 条回复
KCheshireCat
2017-02-06 15:13:00 +08:00
@Siril #20
目前来说确实有误伤的,这主要和服务器的防火墙策略有一定关系。我在 issue 上做了解释,并提用了使用更宽松规则的临时解决方案。
但对于问题本身,我还没有更好的想法来解决。
Siril
2017-02-06 15:42:17 +08:00
@KCheshireCat 但愿能找到改进措施。
----------
下面是脑洞:
仔细考虑后,即使利用 libnetfilter_queue 做出一个,抛开稳定性、吞吐量不谈,
我感觉按延迟也不靠谱, ack 的时间受目标服务器负载的影响,不能说明问题;
主动学习数据包长度、 ttl 值 也难免误伤,
恐怕还要解析数据包内容
一般也就是内容有固定特征的 302 redirect 、 meta-refresh 、 javascript 啥的。

字符串黑名单过滤之。

思路有了,项目起名叫 WFG 不错。 XD
KCheshireCat
2017-02-06 16:13:53 +08:00
@Siril #22
最早最早的时候我也是用 string 模块过滤字段的,但这么作通用性太差,自己用还不错,写作项目的话以后维护起来会变成又臭又长的规则表,而且对单个用户来说有用的可能就其中的几个。某条规则什么的时候已经失效也没法验证。

最重要的是运营商改劫持模板方便,我们验证规则,抓包困难。这样十分吃力。
Siril
2017-02-06 16:30:23 +08:00
@KCheshireCat
前述脑洞是尝试由程序主动学习过滤列表,
比如说请求许多不同的网站返回相似的结果,
而非人工维护又臭又长的过滤列表。
Siril
2017-02-06 16:38:31 +08:00
啊不能改自己的回复, 突然想到如果 libnetfilter 可行, 何必玩高级花样。
既然真正的 response 在假的之后到达,那么假数据包太容易辨认了。
甚至可否将服务端返回的数据包缓存个多少毫秒超时,如果后续没有就发送这个,后续有“重复”的则 DROP 掉前一个。

---------
可能 proxy server 更适合实现这样的功能。
akw2312
2017-02-19 03:06:25 +08:00
手邊的四川移動機器 測試有效
不過... 如果劫持是那種整個 TCP 都劫持走的目測也沒辦法了吧..
tcp traceroute 一看都被劫持走的那種 (icmp 正常, tcp 非 80 443 8080 也正常)
Tovcn
2017-07-16 22:51:40 +08:00
@Siril 可以写个脚本,让 iptables 把疑似重的包 mark 然后对比包内容,基本一致的就 DROP...
那有对比包的模块否?
Tovcn
2017-07-16 22:52:58 +08:00
@Siril 可不是写脚本啊。。 。。错了
siyanmao
2017-08-09 20:49:52 +08:00
@Siril 我倒是觉得基于延迟判断非常靠谱。延迟最低极限的,而旁路劫持的 RTT 一般很低,通过不断采样 RTT,发现 RTT 急剧减小基本就可以判定是出现劫持了。不过这样要写程序追踪每一个 tcp 流了……

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

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

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

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

© 2021 V2EX