Unix Like, 操作系统, 未分类

OpenWRT之中兴认证(东莞理工学院城市学院校园网)

学校校园网使用的是中兴认证,刚开学几天,纠结如何使用路由器共享网络,使用手机探讨一番,找到一个广科高人完善的Linux客户端

测试多天,经完善使用方法,分享至此。

最近一段时间比较热门的路由器是MT7620A方案(如newifi, 极路由),MIPSEL架构,本文就以此架构为例,展开教程。

 

准备:

  1. 可以使用OpenWRT的路由器一个
  2. 一个安装了Linux(我用Ubuntu Desktop 14.04 64Bit)的虚拟机(物理机也行呀)
  3. 待补充

1. 路由器刷入OpenWRT系统
推荐PandoraBox,有商业驱动。

OpenWRT的默认用户名为root,密码为空,密码为空的状态下需要使用Telnet协议连接,PandoraBox的默认用户名为root,密码为admin,可以用OpenSSH连接。

2. 取得交叉编译的工具链(并非在路由器上操作)

各种工具链可以从OpenWRT下载区域取得。

本文使用PandoraBox的工具链: http://downloads.openwrt.org.cn/PandoraBox/PandoraBox-Toolchain-ralink-for-mipsel_24kec%2bdsp-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2

下载工具链并解包至/home目录:

wget http://downloads.openwrt.org.cn/PandoraBox/PandoraBox-Toolchain-ralink-for-mipsel_24kec%2bdsp-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 -O- | tar xjvf - -C /home

Download Toolchain

如果你要自行编译,记得在make menuconfig时选上”Build the OpenWrt SDK”(一般情况下不需要自行编译,所以请无视此处)。

Package the OpenWrt-based Toolchain

编译完毕后会把工具链打包,解包即可使用。

3. 交叉编译libpcap(并非在路由器上操作)

中兴认证客户端使用了libpcap,因此需要编译一个适用于MIPSEL架构的libpcap。

先安装所需的包:

apt-get install git build-essential bison flex

下载libpcap的源码并进入libpcap源码目录:

wget http://www.tcpdump.org/release/libpcap-1.6.2.tar.gz -O- | tar zxvf - -C /usr/src
cd /usr/src/libpcap-1.6.2

进行编译设置,指定使用Toolchian中的gcc与g++,安装到Toolchian的目录:

./configure --host=mipsel CC=/home/OpenWrt-Toolchain-ralink-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc --prefix=/home/OpenWrt-Toolchain-ralink-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/ --with-pcap=linux

开始编译:

make

安装:

make install

3. 交叉编译中兴认证Linux客户端(并非在路由器上操作)

先安装编译中兴认证Linux客户端所需的包:

apt-get install git build-essential libpcap-dev bison flex

进入/usr/src目录,下载中兴认证客户端的源码并进入Linux客户端的源码目录:

cd /usr/src/
git clone https://git.coding.net/yzs/zte-auth-client.git
cd zte-auth-client/zte-client-linux

指定使用Toolchian中的gcc与g++,开始编译:

make CC=/home/OpenWrt-Toolchain-ralink-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-gcc CXX=/home/OpenWrt-Toolchain-ralink-for-mipsel_24kec+dsp-gcc-4.8-linaro_uClibc-0.9.33.2/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-g++

如果一切正常,在当前目录下会出现一个文件名为zte-client的文件:

zte-client

这个就是我们需要的,把它传送到路由器上,一般使用scp(如果你的root密码还是为空,那恐怕用不了scp了,改密码吧):

scp ./zte-client root@路由器的IP:/usr/bin/zte-client

4. 对路由器进行设置(在路由器上进行操作)

登录进路由器,首先确定哪一个是WAN接口:

cat /etc/config/network

 

找到如图的字样,option ifname后面就是WAN接口的名称(不包括引号):

WAN

安装bash, curl:

opkg update
opkg install bash curl

保存以下内容至/usr/bin/enet:

#!/bin/bash
# 设置PATH
export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# 中兴认证的用户名变量
ZTE_AUTH_USERNAME=""
# 中兴认证的密码变量
ZTE_AUTH_PASSWORD=""
# 天翼认证的用户名变量
WEB_AUTH_USERNAME=""
# 天翼认证的密码变量
WEB_AUTH_PASSWORD=""
# 中兴认证Linux客户端的绝对路径变量
ZTE_CLIENT_PATH="/usr/bin/zte-client"
# WAN网络接口名称
NET_INTERFACE="eth0.2"
# DHCP客户端程序名,OpenWRT是udhcpc,也有的Linux发行版本为dhclient
DHCP_CLIENT="udhcpc"
# DHCP客户端的执行参数,udhcpc的参数是-i 网络接口名称,dhclient的参数是网络接口名称
DHCP_CLIENT_ARGVS="-i ${NET_INTERFACE}"
# 进行天翼认证时使用的WLANACIP的值,进行中兴认证后会尝试获取WLANACIP,如果获取失败,且本地没有记录WLANACIP时,才会使用此值
DEFAULT_WLANACIP="113.98.10.136"
# 内网主机所使用的网段
PRIVATE_SUBNET="192.168.1.0/24"
# 检查/var/run/目录是否存在,不存在则尝试创建
test -d /var/run/ || mkdir -p /var/run/
# 注销中兴认证的函数
zte_logoff() {
	# 输出尝试注销的信息
	echo "Try logoff"
	# 进行中兴认证注销
	${ZTE_CLIENT_PATH} -l
	# 延迟三秒
	sleep 3
}
# 进行中兴认证的函数
zte_login() {
	# 输出尝试认证的信息
	echo "Try login"
	# 进行无限循环的中兴认证,好处是可以在中兴认证异常中断后及时恢复,由于认证成功后程序不会退到后台执行,所以无需担心重复执行,此外还记录了进行此循环的bash进程的pid
	echo "echo \$\$ > /var/run/enet-zte-auth.pid; while true; do ${ZTE_CLIENT_PATH} -d ${NET_INTERFACE} -u ${ZTE_AUTH_USERNAME} -p ${ZTE_AUTH_PASSWORD}; sleep 3; done" | bash - &
}
# 使用DHCP客户端获取IP的函数
dhcp_client() {
	# 一个无限循环
	while true;do
		# 检查中兴Linux客户端的进程是否存在,以此来判断是否已进行中兴认证
		if pgrep zte > /dev/null 2>&1;then
			# 输出尝试使用DHCP客户端获取IP的信息
			echo "Try get ip via dhcp"
			# 结束DHCP客户端的进程
			killall -9 ${DHCP_CLIENT} > /dev/null 2>&1
			# 执行DHCP客户端获取IP
			${DHCP_CLIENT} ${DHCP_CLIENT_ARGVS}
			# 检查是否已成功获得IP,若成功,则跳出此无限循环
			ifconfig ${NET_INTERFACE} | grep 'inet addr:' | cut -d ':' -f 2 | awk '{print $1}' | egrep "^[0-9]" && break
		# 若中兴Linux客户端的进程不存在,则三秒后进入下一次循环
		else
			# 延迟三秒
			sleep 3
		fi
	done
}
# 取得天翼认证信息的函数
get_web_auth_info() {
	# 一个无限循环
	while true;do
		# 检查网络是否正常,若正常,则跳出此无限循环,否则一秒后进入下一次循环
		network_check && break
		# 延迟一秒
		sleep 1
	done
	# 输出尝试取得天翼认证信息的提示
	echo "Try get web auth informations"
	# 取得进行天翼认证的信息
	eval $(curl -I http://www.baidu.com | grep 'Location' | sed -r "s/.*(wlanuserip=.*)&.*(wlanacip=.*[0-9]).*/\1\n\2/g")
	# 检查是否成功取得了天翼认证的信息
	if [ "${wlanuserip}" != "" ];then
		# 提示要输出信息
		echo "Print informations"
		# 输出变量wlanuserip的值
		echo "WLAN User IP: ${wlanuserip}"
		# 输出变量wlanacip的值
		echo "WLAN Ac IP: ${wlanacip}"
		# 提示记录变量wlanacip的值到文件/etc/enet.wlanacip
		echo "Write wlanuserip to a file"
		# 记录变量wlanacip的值到文件/etc/enet.wlanacip,以备不时之需
		echo -n "${wlanacip}" > /etc/enet.wlanacip
	else
		# 提示从ifconfig取得wlanuserip的值
		echo "Get wlanuserip from ifconfig"
		# 执行ifconfig取得wlanuserip的值
		wlanuserip=$(ifconfig ${NET_INTERFACE} | grep 'inet addr:' | cut -d ':' -f 2 | awk '{print $1}')
		# 提示从本地文件取得wlanacip的值
		echo "Get wlanacip from file"
		wlanacip=$(cat /etc/enet.wlanacip)
		# 检查wlanacip的值是否为IPv4地址的格式
		if ! echo ${wlanacip} | egrep "^([0-9]{1,3}\.){3,3}[0-9]{1,3}$" > /dev/null 2>&1;then
			# 若否,则使用变量DEFAULT_WLANACIP的值
			wlanacip=${DEFAULT_WLANACIP}
		fi
		# 输出变量wlanuserip的值
		echo "Print informations"
		# 输出变量wlanuserip的值
		echo "WLAN User IP: ${wlanuserip}"
		# 输出变量wlanacip的值
		echo "WLAN Ac IP: ${wlanacip}"
	fi
}
# 进行天翼认证的函数
do_web_auth() {
	# 每隔20秒进行一次天翼认证,并在开始循环前记录进行此循环的bash进程的pid
	echo "echo \$\$ > /var/run/enet-web-auth.pid; while true; do curl --connect-timeout 3 \"http://enet.10000.gd.cn:10001/login.do\" -d \"userName1=${WEB_AUTH_USERNAME}&password1=${WEB_AUTH_PASSWORD}&eduuser=${wlanuserip}&edubas=${wlanacip}\" && sleep 20; done" | bash - &
}
# 注销天翼认证的函数
web_logoff() {
	# 提示注销天翼认证
	echo "Do web logoff"
	# 进行天翼认证注销
	curl --connect-timeout 3 "http://enet.10000.gd.cn:10001/Logout.do" -d "eduuser=${wlanuserip}&edubas=${wlanacip}"
}
# 添加POSTROUTING SNAT规则的函数
start_postrouting_nat() {
	# 提示添加POSTROUTING规则
	echo "POSTROUTING rule adding"
	# 添加POSTROUTING规则
	/sbin/iptables -t nat -I POSTROUTING -s ${PRIVATE_SUBNET} -j MASQUERADE
}
# 检查网络是否可用的函数
network_check() {
	# for循环,循环三次
	for ((i=0;i!=3;i++));do
		# 提示检查网络是否可用
		echo "Determing whether connection is available"
		# 通过访问www.gov.cn检查网络是否可用,若可用,则跳出循环,若不可以,则在一秒后进入下一次循环,直至第三次循环结束
		curl --connect-timeout 3 -I http://www.gov.cn/ && break
		# 延迟一秒
		sleep 1
	done
}
# 添加允许转发的规则的函数
allow_forward() {
	# 提示允许转发
	echo "Allow FORWARD"
	# 添加允许转发来自私有网段的数据包的规则
	/sbin/iptables -I FORWARD -s ${PRIVATE_SUBNET} -j ACCEPT
}
# 检查参数一的值是否为logoff
if [ "${1}" == "logoff" ];then
	# 结束循环进行中兴认证的bash进程
	kill -9 $(cat /var/run/enet-zte-auth.pid 2>/dev/null) > /dev/null 2>&1
	# 结束循环进行天翼认证的bash进程
	kill -9 $(cat /var/run/enet-web-auth.pid 2>/dev/null) > /dev/null 2>&1
	# 注销中兴认证
	zte_logoff
	# 删除记录循环进行中兴认证的bash进程的pid的文件
	rm -f /var/run/enet-zte-auth.pid
	# 删除记录循环进行天翼认证的bash进程的pid的文件
	rm -f /var/run/enet-web-auth.pid
# 否则
else
	# 进行中兴认证
	zte_login
	# 使用DHCP客户端获取IP
	dhcp_client
	# 获取进行天翼认证所需的信息
	get_web_auth_info
	# 进行天翼认证
	do_web_auth
	# 添加POSTROUTING的规则
	start_postrouting_nat
	# 添加允许转发来自私有网段的数据包的规则
	allow_forward
fi

赋予所有用户对/usr/bin/enet文件的执行权限:

chmod +x /usr/bin/enet

编辑/etc/rc.local,加入以下两行命令:

killall -9 enet
nohup /usr/bin/enet > /var/log/enet.log 2>&1 &

 

5. 进行测试

在路由器上执行enet,可以看到一些信息,如果看到如下字样,就代表联网成功了:

<html><head><title>302 Moved Temporarily</title></head>
<body bgcolor="#FFFFFF">
<p>This document you requested has moved temporarily.</p>
<p>It's now at <a href="http://enet.10000.gd.cn:10001/success.jsp">http://enet.10000.gd.cn:10001/success.jsp</a>.</p>
</body></html>

这时可以尝试打开网页。

一切顺利的话,按Ctrl+C退出enet,然后让enet在后台运行:

bash /etc/rc.local
6 Comments

101 Posts

自信、努力、活出精彩;以前未所见的颜色,绘大千世界!
View all posts

6 thoughts on “OpenWRT之中兴认证(东莞理工学院城市学院校园网)”

  1. 博主,我在安装bash, curl这一步卡住了,现在电脑连接着路由器,同时连接着舍友的wifi,可以正常上网,但路由器还未联网要怎样执行opkg update?

    1. 额,这个问题解决了,运行结果跟博主不太一样…但已经能联网了,我再弄一下,博主的教程写得很好,谢谢啦~

      1. 看你的IP,你也在学校里面?
        我发过一个安装过程的帖子,可以参考下:http://tieba.baidu.com/p/4120846787?pid=77958002890&cid=0#77958002890

Leave a reply

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