很久很久以前为了应付深澜校园网做了个srun3000的php版,可以放在路由器里。后来学校的srun3000换认证方式了,改成了pppoe,原理是把用户名加密,然后原始用户名当心跳包,可惜加密手法比电信low多了,一眼就能看出来。于是捣鼓了一天,学了门新语言lua,然后继续愉快地用在了路由器里。
该方法相比于php更加简洁省资源,可以直接应用在openwrt的luci中,加上依赖总共不到100k大小。文后提供石大版,部分学校可能加密手法和心跳不一样,自己修改,至于如何获得加密的用户名和抓心跳包,不在本文讨论范围内。
首先是加密用户名部分,石大是把用户名的每个字符的ASCII加5,加上前缀{SRUN},如果你的前缀不一样,修改第5行,如果不是加5,请修改第7行的+5:
1 2 3 4 5 6 7 8 9 |
require("uci") x=uci.cursor() user=x:get("srun3kset","account","user") ulen=string.len(user) real="{SRUN}" for a=1,ulen,1 do real=real..string.char(string.byte(string.sub(user,a,a+1))+5) end print(real) |
接下来将处理后的用户名写到openwrt的网络接口配置中:
1 2 3 4 5 6 7 |
userpass=$(uci get srun3kset.account.pass) realuser=$(lua "/etc/srun3k/real") uci set network.wan.proto=pppoe uci set network.wan.username={realuser} uci set network.wan.password=${userpass} uci commit /etc/init.d/cron restart |
然后处理心跳,以下是石大版本,第五行为心跳服务器地址:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
socket = require "socket" require("uci") x=uci.cursor() user=x:get("srun3kset","account","user") address = "10.255.0.33" port = 3338 udp = socket.udp() ulen=string.len(user) srunstr=user for a=1,56-ulen,1 do srunstr=srunstr.."\0" end udp:sendto(srunstr, address, port) |
发现新版或者其他院校的心跳包会包含mac地址给两路服务器,但好像用上面的老版本心跳包也没有问题,如果确实需要mac地址,可使用以下心跳包(注意第十行是获取wan口mac地址方法,不确定是否在所有机型所有openwrt版本中有效,请自行验证,注意更改x.x.x.x为你的两路心跳服务器):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
socket = require "socket" require("uci") x=uci.cursor() user=x:get("srun3kset","account","user") address1 = "x.x.x.x" address2 = "x.x.x.x" port = 3338 udp = socket.udp() ulen=string.len(user) file1=io.input("/sys/class/net/eth0/address") mac=string.sub(io.read("*a"),1,17) srunstr=user for a=1,32-ulen,1 do srunstr=srunstr.."\0" end srunstr=srunstr..mac for a=1,24-17,1 do srunstr=srunstr.."\0" end udp:sendto(srunstr, address1, port) udp:sendto(srunstr, address2, port) |
接下来利用crontab进行心跳,实际石大的是50s一次心跳,但由于懒没写判断拨号成功后才心跳,导致心跳对不齐,所以我的方法是40s一次,刚开始拨号可能会心跳对不上断线一两次,但后面就正常了。读者自己可以调整crontab和/etc/srun3k/cron文件。另外luci的代码就不贴了,很简单。下面链接是源码,石大可直接用,其他学校请自行确定、修改。
点击下载源码:srun_openwrt
使用方法:直接把对应文件传到路由器中,在luci的网络选项卡中会有srun3000选项,填入原始用户名密码,保存应用即可,等待两到五分钟。如果发现还是没拨上,可以看系统日志中的ppp输出,那里有详细的信息。注意还需要安装luasocket依赖!
好了,托了四年的东西终于放出来了!话说真的好久没写博客了。。。
大佬在么?方便的话加一下我qq1379451544呗,想问你一些问题
目前学校用srun 4000 ,咋解决呢?
First time here, haha