学校联通去年更改了联网验证方式,设备联网必须经过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处理器,此前并没有编译好的插件。
编译中的细节和问题可以参考这个教程,关键步骤为:
-
在Ubuntu环境下,下载梅林固件提供的交叉编译器,按照编译固件的方法配置环境,梅林官方教程缺少这一步:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/brcm-arm/lib:/usr/local/lib:/usr/lib
。配置好环境后写个“Hello World!”丢到路由器跑一下,没问题继续。 -
下载编译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
。 -
将编译好的XXX_sxplugin.so传至路由器的/jffs下的任意位置,然后在WAN口设置PPPoE拨号界面填入联通提供的用户名密码,并在高级pppd选项填入
plugin /jffs/.../hebei_sxplugin.so
,我的配置如图。
如果线路没错,并且路由器时间与网络时间同步,这时候保存该页后就能成功连接。如果这步无法连接,返回查看系统日志并排查错误。 -
本来到第三步已经算完工,然而我的路由器掉电系统时间恢复出厂,导致NetKeeper无法算出正确的账号。为了解决这个问题,给路由器加了一根校园网线路,思路如下:开启双线路,开机先连接校园网,连接到网络后同步时间,再进行NetKeeper拨号。
上篇已经写过用Python模拟登陆校园网,为了让路由器能运行Python脚本,需要编译一个Python 2.7解释器,依然用之前的编译器,Python的编译更加繁琐,省略不写了。 -
最后把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===================="