学校校园网使用的是中兴认证,刚开学几天,纠结如何使用路由器共享网络,使用手机探讨一番,找到一个广科高人完善的Linux客户端。
测试多天,经完善使用方法,分享至此。
最近一段时间比较热门的路由器是MT7620A方案(如newifi, 极路由),MIPSEL架构,本文就以此架构为例,展开教程。
准备:
- 可以使用OpenWRT的路由器一个
- 一个安装了Linux(我用Ubuntu Desktop 14.04 64Bit)的虚拟机(物理机也行呀)
- 待补充
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目录:
1 |
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 |
如果你要自行编译,记得在make menuconfig时选上”Build the OpenWrt SDK”(一般情况下不需要自行编译,所以请无视此处)。
编译完毕后会把工具链打包,解包即可使用。
3. 交叉编译libpcap(并非在路由器上操作)
中兴认证客户端使用了libpcap,因此需要编译一个适用于MIPSEL架构的libpcap。
先安装所需的包:
1 |
apt-get install git build-essential bison flex |
下载libpcap的源码并进入libpcap源码目录:
1 2 |
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的目录:
1 |
./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 |
开始编译:
1 |
make |
安装:
1 |
make install |
3. 交叉编译中兴认证Linux客户端(并非在路由器上操作)
先安装编译中兴认证Linux客户端所需的包:
1 |
apt-get install git build-essential libpcap-dev bison flex |
进入/usr/src目录,下载中兴认证客户端的源码并进入Linux客户端的源码目录:
1 2 3 |
cd /usr/src/ git clone https://git.coding.net/yzs/zte-auth-client.git cd zte-auth-client/zte-client-linux |
指定使用Toolchian中的gcc与g++,开始编译:
1 |
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的文件:
这个就是我们需要的,把它传送到路由器上,一般使用scp(如果你的root密码还是为空,那恐怕用不了scp了,改密码吧):
1 |
scp ./zte-client root@路由器的IP:/usr/bin/zte-client |
4. 对路由器进行设置(在路由器上进行操作)
登录进路由器,首先确定哪一个是WAN接口:
1 |
cat /etc/config/network |
找到如图的字样,option ifname后面就是WAN接口的名称(不包括引号):
安装bash, curl:
1 2 |
opkg update opkg install bash curl |
保存以下内容至/usr/bin/enet:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 |
#!/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文件的执行权限:
1 |
chmod +x /usr/bin/enet |
编辑/etc/rc.local,加入以下两行命令:
1 2 |
killall -9 enet nohup /usr/bin/enet > /var/log/enet.log 2>&1 & |
5. 进行测试
在路由器上执行enet,可以看到一些信息,如果看到如下字样,就代表联网成功了:
1 2 3 4 5 |
<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在后台运行:
1 |
bash /etc/rc.local |
Comments are closed.