在路由器里用Lighttpd解决ISP劫持

不知道是不是要搂钱过年的关系,最近电信的 DNS 劫持超猛的,首当其冲是京东,最多一回10分钟里5,6次被劫,然后还有一号店、百度等。就算更换 DNS 服务器也没用,这种劫持技术已经炉火纯青了。貌似唯一有用的是 DNSCrypt Proxy, 不过被干扰的常常超时。

基本就是输入 jd.com 然后回车,会被先劫持到广告联盟的网站,然后跳转到京东,相关人等可以按点击次数收钱。而且,更恶心的是会留下 cookie 哦,有了这块小饼干,你在京东上买东西他们也许可以获得返利。就算钱是小事,万一个人信息泄漏了,那就……

搜集结果:

目前抓到有4种 jd.com 和1种 yhd.com 的劫持方法。也许还有更多,只是暂时没遇到。

  1. 劫持到 linktech,然后跳到 jd.com
    http://click.linktech.cn/?m=360buy&a=A100210094&l=99999&l_cd1=0&l_cd2=1&tu=http%3A%2F%2Fwww.jd.com
  2. 劫持到 chanet 然后跳回 jd.com
    http://count.chanet.com.cn/click.cgi?a=524640&d=22338&u=&e=&url=http%3A%2F%2Fwww.jd.com
  3. Cloaking到 xfect 然后跳转。因为嵌套在IFRAME内,所以地址栏不会变。关于最没品且低技术含量的Cloaking劫持参见 http://en.wikipedia.org/wiki/URL_redirection#Frame_redirects
    http://hao.xfect.cn/js/jd2.html
  4. 5tm 的劫持,包括了京东和一号店的 (这域名还真够贱的,5tm。。。我他X)
    http://5tm.com/joey/jd.html
    http://5tm.com/joey/yhd.html
    

如何解决:

要是仅仅在 host 层面屏蔽这几个域名,那么访问被劫持网站的时候,可能会出现“该页无法显示”这类错误。需要再输入一次域名,很影响体验。然后我想到,之前为了屏蔽一些广告域名,在路由器里装了 Lighttpd,然后通过 dnsmasq 将需要屏蔽的域名全部指向路由器。干脆还是用 Lighttpd 来解决这个问题吧。

在研究了 http://redmine.lighttpd.net/projects/1/wiki/docs_modredirect 以后,开始捣鼓 lighttpd.conf

劫持的 URL 分为两类,一种带参数传递,透过参数确定该跳转的目标网址是什么。另一种看似是静态 html 其实里面带有 javascript 代码,将用户重定向。比如 xfect 的内部有:

<script type="text/javascript">
    var dstSrc="http://click.linktech.cn/?m=360buy&a=A100210094&l=99999&l_cd1=0&l_cd2=1&tu=http%3A%2F%2Fwww.jd.com";
    window.top.location=dstSrc;
        </script>

总而言之言而总之,先修改 DNS 把这几个域名,重定向到路由器,然后在 Lighttpd 里进行判断,对不同来源 URL 进行相应的重定向策略。

Dnsmasq

用类下面的语句,将这几个域名解析到路由器(假设路由器地址为192.168.1.1)。

address=/click.linktech.cn/count.chanet.com.cn/hao.xfect.cn/5tm.com/192.168.1.1

Lighttpd

使 Lighttpd 监听在 80 端口上。在使用重定向之前,记得在 Lighttpd 配置文件中开启 mod_redirecthttp://click.linktech.cn/?m=360buy&a=A100210094&l=99999&l_cd1=0&l_cd2=1&tu=http%3A%2F%2Fwww.jd.com 是通过参数传递目标 url,那么配置文件里可以这么写,先判定 host 然后根据 url 里的关键字重定向:

$HTTP["host"] =~ "^(click)\.(linktech)\.(cn)$" {
    url.redirect = ( "^/(.*)www.jd.com" => "http://www.jd.com" )
}

还有不通过传递参数的页面 http://5tm.com/joey/jd.html,可以这么来。下面的规则里同时包含了 jd 和 yhd 的判断规则:

$HTTP["host"] =~ "^(5tm)\.(com)$" {
    url.redirect = ( "^/joey/jd.html" => "http://www.jd.com",
                     "^/joey/yhd.html" => "http://www.yhd.com" )
}

好了,修改完成后,保存配置文件,然后重启 lighttpd 后,就可以避免被ISP再度劫持了。

One thought on “在路由器里用Lighttpd解决ISP劫持”

Leave a Reply

Your email address will not be published. Required fields are marked *