V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
raysonx
V2EX  ›  分享创造

打算做一套专门对付网络劫持/污染的开源工具,目前 DNS 部分已基本完成

  •  
  •   raysonx ·
    vfreex · 2016-05-15 23:19:29 +08:00 · 9348 次点击
    这是一个创建于 2909 天前的主题,其中的信息可能已经有所发展或是发生改变。
    众所周知天朝的网络环境非常烂,各种运营商劫持防不胜防。于是打算利用业余时间做一套开源工具集,过滤各种天朝特色的花式运营商劫持。
    GitHub 传送门: https://github.com/hijackfilter/hijackfilter

    主要打算做一些 netfilter/iptables 拓展,这样这些过滤模块就可以高效地在 OpenWrt 、 dd-wrt 等基于 Linux 的路由器上跑。感兴趣的朋友们可以来一起贡献代码。

    目前匹配 DNS A 记录的 iptables 模块已基本完成,可以将运营商伪造的 DNS 回应匹配出来,进行丢弃或更改。
    下一步还会做匹配 HTTP 302 劫持的模块。
    第 1 条附言  ·  2016-05-16 00:08:37 +08:00
    目前 DNS 过滤模块已经可以使用了,按照说明配置 A 记录黑名单即可。
    第 2 条附言  ·  2016-05-16 09:54:14 +08:00
    哇,还是有不少朋友感兴趣的。
    我来补充一下,现在完成的 dnsfilter 和下一步要做的 httpfilter 都是一些底层的模块,用来过滤旁路设备的伪造报文。
    我最初的设想是,等这些底层的模块基本成形后,再做一个上层的管理工具,可以协助导入各种规则集。
    60 条回复    2016-07-12 20:48:41 +08:00
    devqin
        1
    devqin  
       2016-05-15 23:32:41 +08:00
    运营商的劫持什么的最恶心。
    McContax
        2
    McContax  
       2016-05-15 23:34:05 +08:00 via Android
    不错,有干货,我插一脚,混个脸熟
    aruisi
        3
    aruisi  
       2016-05-15 23:37:14 +08:00 via iPhone
    滋磁
    希望能早日见到作品。
    turan12
        4
    turan12  
       2016-05-15 23:48:07 +08:00
    这个厉害。前排观望楼主!
    addidda
        5
    addidda  
       2016-05-15 23:50:05 +08:00 via Android
    仰望高端玩家
    Sumire
        6
    Sumire  
       2016-05-15 23:55:39 +08:00 via Android
    病魔还没战胜校长!
    adrianzhang
        7
    adrianzhang  
       2016-05-15 23:58:51 +08:00
    功能看上去是对付大局域网内各种恶心,还无法对付局域网边缘的恶心。不过还是一个很有趣的项目,报名参与开发。
    yxc
        8
    yxc  
       2016-05-16 00:01:33 +08:00   ❤️ 1
    firefox 装个 https everwhere 就搞掂了
    ilikekindle
        9
    ilikekindle  
       2016-05-16 00:01:42 +08:00 via Android
    支持
    liyvhg
        10
    liyvhg  
       2016-05-16 00:11:15 +08:00 via Android
    强烈支持,混个脸熟
    ZRS
        11
    ZRS  
       2016-05-16 00:18:30 +08:00
    支持 已 Star
    raysonx
        12
    raysonx  
    OP
       2016-05-16 00:26:38 +08:00 via iPad
    @adrianzhang 局域网边缘比较复杂,不是过滤就能完全解决的。
    之前被联通的 HTTP 劫持恶心坏了,向工信部投诉了无数次都不给解决。
    后来不得不用 iptables 的 string 模块过滤联通伪造的 http302 重定向。考虑到 string 模块过滤会有误杀,效率也比较低,下一步尝试手写一个匹配 http 302 的模块。不过 http 有连接信息,还得研究一下 netfilter 的 conntrack 机制。
    目前已经完成 dns 过滤模块理论上过滤局域网边缘伪造的 dns 的也是可行的,不过效果仅相当于改 hosts 表,不是这个项目的主要目的。

    @yxc 主要是想放在路由器上跑哈哈,强迫症发作!
    ivyswen
        13
    ivyswen  
       2016-05-16 00:39:48 +08:00 via Smartisan T1
    已 star ,明天编译一个试试。
    sky170
        14
    sky170  
       2016-05-16 01:21:43 +08:00
    已 star
    adrianzhang
        15
    adrianzhang  
       2016-05-16 01:27:29 +08:00
    @raysonx 明天晚些时候 GH 上联系你。
    Biwood
        16
    Biwood  
       2016-05-16 01:30:23 +08:00 via Android
    真能做到么,我愿意捐钱, DNS 劫持太烦人了
    jasontse
        17
    jasontse  
       2016-05-16 06:29:31 +08:00 via Android
    不用这么麻烦, dnsmasq 有个参数叫 ignore-address 。
    Khlieb
        18
    Khlieb  
       2016-05-16 07:13:20 +08:00 via Android
    @Sumire 该来的早晚都会来的
    adrianzhang
        19
    adrianzhang  
       2016-05-16 07:37:21 +08:00
    @jasontse 开销不一样
    jasontse
        20
    jasontse  
       2016-05-16 08:39:35 +08:00 via iPad
    @adrianzhang 这样的开销更大,每次过防火墙都要滤一遍, dnsmasq 从 upstream 取得结果之后可以 cached 。
    shuiyingwuhen
        21
    shuiyingwuhen  
       2016-05-16 08:51:29 +08:00
    混一个脸熟,现在我参与测试
    lixingcong
        22
    lixingcong  
       2016-05-16 08:56:34 +08:00 via Android
    dnsmasq 从 2.73 开始具备 dns 答复 ip 过滤功能
    qq5745965425
        23
    qq5745965425  
       2016-05-16 09:08:47 +08:00
    支持 支持
    rubyvector
        24
    rubyvector  
       2016-05-16 09:17:57 +08:00
    支持,有技术,有想法,还实现了.赞一个
    JackBlack2006
        25
    JackBlack2006  
       2016-05-16 09:37:12 +08:00
    @lixingcong 愿闻其详?
    raysonx
        26
    raysonx  
    OP
       2016-05-16 09:50:34 +08:00
    @jasontse
    @lixingcong
    目前实现的 DNSfilter 只是这个项目的底层模块之一,主要用来过滤到上游链路之间的旁路设备的抢答报文。
    dxwwym
        27
    dxwwym  
       2016-05-16 09:52:10 +08:00 via iPhone
    今天青岛联通 Safari 访问贴吧时终于一睹小球真颜,
    clino
        28
    clino  
       2016-05-16 09:52:40 +08:00
    原理是什么? 怎么识别运营商劫持的部分呢?
    adrianzhang
        29
    adrianzhang  
       2016-05-16 09:56:06 +08:00
    @jasontse 如果有的设备不需要 dnsmasq ,防火墙过滤是最好的选择,开销低且各种设备都有。采用应用级的过滤好处是灵活容易,坏处就是开销大(不仅是网络开销,还有系统开销)以及要部署相关应用,适应性低。
    raysonx
        30
    raysonx  
    OP
       2016-05-16 09:56:29 +08:00
    @clino 目前的想法是按规则过滤。之后会做一个管理工具,至于生成和导入规则。
    raysonx
        31
    raysonx  
    OP
       2016-05-16 09:58:39 +08:00
    @adrianzhang DNSmasq 实现的是把黑名单中的响应替换为 NXDOMAIN , OpenWrt 上默认跑的就是。这个防火墙模块和 DNSmasq 在功能上并不是重叠的。
    clino
        32
    clino  
       2016-05-16 10:00:18 +08:00
    @raysonx 我是问怎么识别? 识别出来才能过滤吧 不太明白是如何识别的
    commonhub
        33
    commonhub  
       2016-05-16 10:03:29 +08:00
    dnsmasq 里把 114so 这种污染的 ip 设为 bogus-nxdomain 就可以。
    github 上面有个轮子了 https://github.com/felixonmars/dnsmasq-china-list/
    现在的解决方案是 dnsmasq 里部分墙网址指定 nameserver=/t66y.com/127.1#53535 ss-tunnel 给 8888
    默认 dns 是 isp 给的,返回结果如果和 bogus-nxdomain 一样就直接扔了
    raysonx
        34
    raysonx  
    OP
       2016-05-16 10:05:05 +08:00
    @clino 具体规则是要人工干预的,不可能通过机器自动生成,因为各种劫持、污染的情况非常复杂,还要同时考虑性能和误杀率。
    因为使用这种工具的人不可能是小白用户,所以不必做的过于傻瓜化。
    目前的想法是提供一个客户端的工具协助用户调试新的规则。对于大规模存在的相似劫持,直接放在 GitHub 上维护。
    onemoo
        35
    onemoo  
       2016-05-16 10:05:19 +08:00
    DNS 劫持还好说。最恶心的是 http 插入 iframe 广告,对付这个有什么好办法吗?
    raysonx
        36
    raysonx  
    OP
       2016-05-16 10:08:13 +08:00
    @onemoo 这种一般是用旁路设备伪造 HTTP 报文。下一步做的 httpfilter 的主要就是应对这种情况。
    至于怎么做最好、最方便、最灵活,还要靠大家一起讨论想办法。
    aivier
        37
    aivier  
       2016-05-16 10:09:06 +08:00
    昨天遇到联通劫持 JS ,然后重定向到自己的服务器上,反代,插广告,而且还是黄网....
    JackBlack2006
        38
    JackBlack2006  
       2016-05-16 10:12:22 +08:00
    @aivier 直接向扫黄打非办公室举报:doge:
    dreammes
        39
    dreammes  
       2016-05-16 10:25:24 +08:00 via iPhone
    强烈👍🏻支持
    21grams
        40
    21grams  
       2016-05-16 10:25:53 +08:00
    你们说的运营商劫持究竟指的是啥? 我一直用 114 的 dns 没发现有什么问题。
    imn1
        41
    imn1  
       2016-05-16 10:37:10 +08:00
    我现在桌面已经基本消除劫持了,但手机还是没有解决办法(对 android 不熟)
    zrj766
        42
    zrj766  
       2016-05-16 10:42:45 +08:00 via Android
    先 star 再说
    missdeer
        43
    missdeer  
       2016-05-16 10:45:26 +08:00
    说话,你们用过 pcap-dnsproxy 吗, winpcap/libpcap 直接抓包,然后丢掉抢答包
    vh2h
        44
    vh2h  
       2016-05-16 10:53:46 +08:00
    支持楼主,利国利民
    raysonx
        45
    raysonx  
    OP
       2016-05-16 11:31:41 +08:00
    @jasontse @lixingcong 翻了下 dnsmasq 的文档,确实 2.73 版之后开始提供类似的功能了。
    langjiyuan
        46
    langjiyuan  
       2016-05-16 13:32:46 +08:00
    火线支持,前两天的 http 劫持可是恶心坏了,现在访问个 b 站 还得挂代理。。
    mwylaoma
        47
    mwylaoma  
       2016-05-16 14:09:27 +08:00
    请问 Mac 能否使用?@raysonx
    avrillavigne
        48
    avrillavigne  
       2016-05-16 14:38:49 +08:00
    @21grams 常见 iframe 插广告,插不好网页都不能看了,高端的下载劫持到运营商内的服务器。
    KCheshireCat
        49
    KCheshireCat  
       2016-05-16 14:41:09 +08:00
    我建议可以去看下 iptables 的 u32 模块

    移动这边的 DNS 抢答,http 抢答,302 劫持跳转,单向 RST,BT-DHT, 都是有一定包构造特征的

    比如移动在抢答 DNS 的时候一定会带 dns.flags.authoritative 标志位,
    但是又和正常的包不一样一定不带 dns.flags.authenticated 标志。

    302 劫持也是,tcp 包会标记 ACK ,FIN , PSH.而通常 http 并不使用 PSH 且 FIN 也不和 PSH 同时使用

    还有 http 抢答,抢答的报文是有分包的,但是每个包大小都不到 MTU,且 tcp 窗口实际值恒为 0xFFFF

    再者 BT-DHT 干扰,抢答包里面协议版本是个没人使用的版本号了,所有抢答包还都是一样长,非常好过滤

    我目前都是用 u32 模块进行匹配来 DROP 的,这种抓异常包构造的方法一向很有效
    KCheshireCat
        50
    KCheshireCat  
       2016-05-16 14:44:53 +08:00
    很多情况用现有模块就能做到,不用造个新轮子实现重复功能

    我现在就在实验用 IP 头的 TTL 值来过滤抢答包,用的都是现有的模块,

    不过为了应付服务器自身 ttl 差异,这个过滤效果还是有待提高
    wpaygp
        51
    wpaygp  
       2016-05-16 15:52:22 +08:00
    Star
    raysonx
        52
    raysonx  
    OP
       2016-05-16 17:14:22 +08:00
    @KCheshireCat 这些问题在做之前都考虑过,能用现有模块解决的当然不会上复杂的东西。 netfilter/iptables 本身在设计上就不擅长处理 5 层的数据,做模块是为了接下来实现一些比较难搞的复杂过滤。
    Cpatrick
        53
    Cpatrick  
       2016-05-16 18:17:02 +08:00
    期待早日见到作品~
    Balthild
        54
    Balthild  
       2016-05-16 18:21:54 +08:00 via iPhone
    已 Star
    fengyunSmlie
        55
    fengyunSmlie  
       2016-05-16 18:57:11 +08:00
    不得不来支持一下!
    Vicer
        56
    Vicer  
       2016-05-17 00:25:31 +08:00
    @jasontse 2.75 版本添加 ignore-address=1.2.3.4 启动失败
    muziling
        57
    muziling  
       2016-05-17 14:03:11 +08:00
    @KCheshireCat u32 怎么弄,以前 tomato 用的时候,正常的 DNS 解析都要好几秒。
    addidda
        58
    addidda  
       2016-05-19 00:48:32 +08:00 via Android
    @imn1 dnscrypt/pdnsd/dnsmasq
    配合 iptables 一起食用效果更佳(x)。。
    Oucreate
        59
    Oucreate  
       2016-06-05 17:09:36 +08:00
    请问楼主大大有没有学习这些东西的“收藏夹”可以分享一下?
    我也想自己制作 Windows 和 Android 平台的“多重抗污”工具。
    [email protected] 万分感谢!
    only25133
        60
    only25133  
       2016-07-12 20:48:41 +08:00
    时不时来赞一下~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2324 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 09:08 · PVG 17:08 · LAX 02:08 · JFK 05:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.