NetKeeper完全解决方案

. 4 min read

学校联通去年更改了联网验证方式,设备联网必须经过Netkeeper(闪讯)客户端,不再使用单纯的PPP拨号,有效(无耻)地实现了一人一号,手机号码捆绑强制入网。

虽然我是联通用户,但NetKeeper只提供Windows/Android/iOS客户端:黑苹果、Linux、Windows Phone、Kindle均无法使用联通网络。出于个人需求顺便打破联通垄断毒瘤,我需要“把NetKeeper装入路由器”。

如果仅仅使用Windows PC进行无线共享,官方的Netkeeper对免费WiFi软件有干扰,可以使用如Simple Keeper第三方客户端,算法都是一样的。

硬件

Netgear R6300v2 洋垃圾一台,刷梅林固件最新版;
两根网线,一根接校园网端口,一根接联通端口,接至路由器WAN和LAN1。

施工

miao007大神已经写好了OpenWRT平台的NetKeeper插件,原理是在Linux 的pppd拨号时加载NetKeeper插件算出真实的账号,具体算法在他的Github有说明。

R6300v2使用了ARM处理器,此前并没有编译好的插件。

编译中的细节和问题可以参考这个教程,关键步骤为:

  1. 在Ubuntu环境下,下载梅林固件提供的交叉编译器,按照编译固件的方法配置环境,梅林官方教程缺少这一步:export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/brcm-arm/lib:/usr/local/lib:/usr/lib。配置好环境后写个“Hello World!”丢到路由器跑一下,没问题继续。

  2. 下载编译Openwrt-NetKeeper。
    需要修改makefile的内容。填写解压的Toolchain中bin与include所在的目录,:
    LOCATION=/path/to/include CC=arm-uclibc-linux-2.6.36-gcc
    可能需要修改pppd的版本,取决于路由器的/usr/lib/pppd/,我的是2.4.7
    PPPD_VER=2.4.7
    由于我手工把编译好的*.so丢到路由器,所以makefile的upload部分不动它。
    然后就可以编译了:
    cd Openwrt-NetKeeper/src/ && make all

  3. 将编译好的XXX_sxplugin.so传至路由器的/jffs下的任意位置,然后在WAN口设置PPPoE拨号界面填入联通提供的用户名密码,并在高级pppd选项填入plugin /jffs/.../hebei_sxplugin.so,我的配置如图。

    如果线路没错,并且路由器时间与网络时间同步,这时候保存该页后就能成功连接。如果这步无法连接,返回查看系统日志并排查错误。

  4. 本来到第三步已经算完工,然而我的路由器掉电系统时间恢复出厂,导致NetKeeper无法算出正确的账号。为了解决这个问题,给路由器加了一根校园网线路,思路如下:开启双线路,开机先连接校园网,连接到网络后同步时间,再进行NetKeeper拨号。
    上篇已经写过用Python模拟登陆校园网,为了让路由器能运行Python脚本,需要编译一个Python 2.7解释器,依然用之前的编译器,Python的编译更加繁琐,省略不写了。

  5. 最后把Python解释器及库文件、校园网登录脚本放到/jffs目录,在/jffs/init_start中写个自动连接脚本.
    大功告成!

#!/bin/sh
export PYTHONHOME=/jffs/python
export LD_LIBRARY_PATH=/jffs/python/lib:$LD_LIBRARY_PATH

echo "===================Start===================="

while [ 1 ]
do
    /jffs/python/bin/python /jffs/DrCom/DC.py >> /tmp/syslog.log
    echo "Connecting to Dr.COM... ..."
    netstate=$(ping -c 1 baidu.com|grep transmitted |awk '{print $4}')
    echo $netstate
    if [ $netstate -gt 0 ]
    then
        break
    fi
done

time=$(date|awk '{print $6}')
while [ $time -eq 2015 ]
do
    echo "Set date... ..."
    ntpclient -h s1a.time.edu.cn -i 3 -l -s
    sleep 3
    time=$(date|awk '{print $6}')
done

killall pppd
/usr/sbin/pppd file /tmp/ppp/options.wan0

echo "====================done===================="