前言

学校一年前开通了校园网,然鹅信号未覆盖我们住的公寓,又多忍受了一年的小破宽带(10M带宽,100块300个小时)

上个星期,架设了一年的校园网终于通了,然后我们发现——校园网69元一个月,一个用户只能同时登陆两个终端,带宽是无线4M,有线20M(套餐不同带宽不同)。

好的,我不生气。

GTMD

GTMD

GTMD

校园网!!!

嗯,那么接下来,让我们来背刺校园网吧~

(本文最早写于刚架设校园网时,然而由于本人较懒和本着闷声发大财的原则,在大四即将毕业之际放出,造福四方)

本文并非小白手把手教学文章,适合有一定linux基础或有一定钻研能力的童鞋,我相信在金钱与网络面前,人的潜力是无限的(你们觉得上门装配,路由器刷系统¥150,网络配置¥50 有没有可行性?)

郑重声明:本人写此教程为技术分享,它人使用本文提及的技术造成的一切问题,本人不负任何责任

背刺校园网有风险,使用不当可能造成封号等问题,请慎重使用

简介

我们想要实现的目标有如下两个:

1、可以使用路由器连接校园网,达到一人办网全寝可用的目的

2、实现校园网多拨,可在一台路由器上使用多账号登录,带宽叠加

大致的实施流程如下:

1、使用一个工具,模拟锐捷网络协议,实现校园网登录认证

2、对设备进行配置,实现校园网转发(此时能够实现目标1)

3、配置多个虚拟网卡,实现多拨(达成目标2)

前期准备

1、一个能刷openwrt(或其他基于openwrt系统)的路由器(如果手上没有这样的路由器,可以上网上搜一下相关推荐,在这里就不多介绍了)

2、把路由器刷上openwrt(烦请自行搜索,此处省略一万字)

3、浏览器输入192.168.1.1进入控制台,用户名是root,默认密码是admin(自己设置了其他密码就用你设置的那个)

4、查看系统信息,记录一下内核版本(本人路由器使用系统是潘多拉,一个基于openwrt的发行版)

5、自行设置路由器,保证在非校园网环境下可以正常使用(随便在哪拽根能上网的网线,插路由器上设置一下看看有没有wifi能不能上网)。

确认可用之后我们就可以关闭控制台了

认证工具

要背刺校园网,我们首先需要一款认证工具,本校使用的是锐捷认证(802.1X),在github上可以找到两款替代工具,一个是mentohust,还有一个是minieap

从软件工程角度来说,两款工具比较起来明显是minieap设计更加优雅

然而,我懒

所以本文中使用mentohust认证,对minieap感兴趣的同学可以自行学习使用

本节后面的内容需要一定linux基础,如果你实在不会搞,百度mentohust说不定能找到别人编好的二进制文件,注意他们的系统内核版本和你的是否一致(未知来源的二进制文件可能有安全风险,请谨慎使用)

发现有的openwrt版本控制台自带mentohust软件,这样的用户可以跳过本节甚至本教程(想要多拨的童鞋不要使用控制台配置mentohust,参照后面的方法远程连接后配置。只想单账号使用的话可以尝试使用控制台配置,不好使再参考本教程)

我们可以从github上获得mentohust源码。

https://github.com/hyrathb/mentohust

需要注意的是,我们上文给出的mentohust是hyrathb 修改后的版本(添加了新版锐捷v4支持),想要阅读源码了解mentohust工作流程的童鞋可以参考该项目的早期版本

获得源码以后,我们需要将其编译为二进制文件,放到路由器上。

过程大体如下:

1、在本地搭建交叉编译环境

2、根据你实际的系统内核,编译mentohust,得到二进制文件(这里附上一个mentohust交叉编译教程,请根据实际情况参考使用)。

3、使用scp工具(windows下可以用winscp)将二进制文件上传到路由器的/bin/文件夹下(或其他文件夹)

4、运行二进制文件,此处先不必做配置,仅查看程序能否运行,然后关闭程序,进行路由器相关配置

编译成功后交叉编译环境不要删除,后面可能还需要用到

设置网卡

(此处系统版本不同可能有较大差异,如果看不懂,可自行上网寻找配置方法)

锐捷认证使用DHCP,需要设置网卡(入户线接哪个网口就设置哪个)

打开192.168.1.1,找到接口选项(这个地方不同系统版本界面可能不同),选择你要使用的网卡,点“修改”

找到协议选项,选择DHCP,确认保存

锐捷认证

网卡设置完成后,接下来就可以设置mentohust客户端了

随意使用一个ssh工具(没有的话就下个putty,体积小、不用配置),连接ip:192.168.1.1,port:23(不确定是不是所有发行版都是23端口……不是的话就自己查怎么连吧)

用户名密码为192.168.1.1里使用的用户名密码(不同发行版登录信息不同,登陆后和我截图不一样是正常的)

登陆之后,命令行输入mentohust -h获取帮助

按照帮助填写你自己的信息,不同学校需要的参数不同。大多选项有默认值,请按照实际情况修改(可参考WIKI

HRBUST同学可参考我的方案:

仅配置用户名,密码,网卡名,组播方式和DHCP方式,即-u -p -n -a -d(-a和-d两个选项hrbust均设置为1)

配置完成后,前台运行mentohust,查看是否认证成功,连接路由器WIFI,查看是否可以连接外网(如果认证有问题或wifi连不上请自行更改设置调试)

如果前台运行成功,实际使用时在启动命令中加上-b1选项,让其后台运行,不保留输出

开机运行

如果你成功进行过了上面的全部步骤,那么恭喜你已经实现了目标1,可以使用路由器登录校园网。

最简单的开机运行方式:在/etc/rc.local中添加运行脚本

只需要将你的运行命令写入/etc/rc.local,便可实现开机运行(啥?你不会用VIM???)

注意:

1、/etc/rc.local中使用绝对路径。

2、最好在该命令前加个延迟,防止因路由设备初始化导致认证失败

sleep     #延迟180秒(180秒长了点,没事插拔路由器试个合适延时就完事了)
/bin/mentohust -uxxxxx -pxxxxx -nxxxxx -a1 -d1 -b1 #启动命令(路径视实际情况而定)

多拨

请详细阅读完此章节(最好是本文章全文)后再进行操作

如果你有一个正在后台运行的mentohust,再次启动一个mentohust进程,它会提示你MentoHUST已经运行,并给出PID

正常情况下,进程锁可以保证进程的唯一性,防止资源冲突。但是当我们想要使用多拨时,这道保护措施就会成为我们的阻碍。

所以,实现多拨的第一步便是:搞掉进程锁

我们简单看一下它的运行机制:

在源码中找到src/myconfig.c,打开

可以看到在第88行定义了一个checkRunning函数:

查看其实现:

可以发现,这里进程锁的原理是:

在程序运行时,生成一个PID文件,将其加锁。再次有进程开启时,读取锁状态,如果有锁,读取加锁进程PID,打印到控制台并返回

知道了进程锁原理,想要搞掉它便有了两种方案:

1、从源码下手,注释相关代码并重新编译

2、不修改源码,每次运行后手动删除生成的PID文件(小白/懒人福音)

方案一:

想要使用第一种方案,需要注释掉checkRunning内和锁文件相关的代码,然后使用上面的交叉编译环境,重新编译二进制文件,放入路由器

checkRunning里面功能主要有三部分:

一、文件锁相关

二、-k参数相关(关闭重启等操作)

三、开启守护进程相关

在这里我们主要是想去除文件锁的部分,但是软件关闭重启等操作是基于文件锁的,简单去除文件锁会导致-k参数的功能不可用,这里并不想浪费时间修改代码来维护这一功能,所以最后我们直接删除前两部分的代码,只保留下守护进程相关操作

将checkRunning多余代码删除,留下以下代码:

static void checkRunning(int exitFlag, int daemonMode)
{
if (daemonMode) {
printf(_(">> 进入后台运行模式,使用参数-k可退出认证。\n"));
if (daemon(, (daemonMode+)%))
perror(_("!! 后台运行失败"));
else if (daemonMode == ) {
freopen(LOG_FILE, "w", stdout);
setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
freopen(LOG_FILE, "a", stderr);
}
}
return;
}

方案二:

想要使用第二种方案,需要在每次运行mentohust之后,执行以下命令,删掉PID文件(rm -f牛逼!!!)

rm /var/run/mentohust.pid -f

使用两种方法都可以绕过进程锁,开启多个mentohust进程

注意:去除进程锁后,可能会引起一些问题:

1、程序进入后台运行后,你不再可以直接使用-k参数来关闭程序,而是需要手动ps出全部进程并手动kill掉mentohust

2、多个mentohust进程可能造成资源冲突(为了避免此现象,每个mentohust进程使用的网卡不可重复,用户名不可重复,后台运行时不要保留输出)。

可以多开进程以后,实现多拨只需开启多个进程,分别使用不同的账号并绑定不同的网卡即可(哦,对了,你没有多个网卡)

开启多个虚拟网卡

一般来说,入户插到路由器上只有一条线,所以也就只会使用一个网卡。那么,如何才能实现一根线使用多个网卡呢?

这里我们使用了openwrt的macvlan和mwan3两个软件(这两个一般是自带的并且可以直接在控制台配置)

macvlan可以创建多个虚拟网卡链接到eth0,也是就WAN口,然后可以在这些虚拟网卡上创建多个虚拟WAN口,每个虚拟WAN口拨一个账号,这样便可以实现一个单线多拨功能。

mwan3的作用,就是把你路由器的流量,做路由表级别的负载均衡,按照设置的优先级和权重分配到不同的WAN口上,从而起到网速叠加作用。

如果你的openwrt没有这两个软件,可以使用下面的命令安装(安装的都是自带控制台界面的版本)

opkg update
opkg install kmod-macvlan mwan3 luci-app-mwan3

(我叒懒了)配置方法可自行百度 openwrt多拨 或者参考此教程(也是我百度的)

开启多个网卡,配置好负载均衡,并且将需要使用的网卡配置为DHCP后,就可以多拨啦:

1、先测试你能不能用一个账号认证联网(前台操作)

2、ctrl+c停掉上一个进程,记录下来账号和网卡的对应关系。换一个账号和网卡,继续尝试(记录对应关系是因为每个虚拟网卡有自己的MAC地址,如果你换了虚拟网卡,对锐捷来说相当于你使用了一台新机器登录)

3、循环12步骤,直到你测试成功所有你想要使用的账号,注意每个账号绑定的网卡要不同

4、打开多个进程,都使用后台运行

5、进入192.168.1.1控制台,找到“负载均衡”,查看是否所有你使用了的网卡均为绿色(下面的图是盗的,它使用了两个网卡)

6、下载一些东西,让网络运行一段时间,并有一定的流量产生

7、打开控制台的“接口”页面,看使用的接口流量是否相近,如果相近则表示成功(盗的图)

8、如果不成功,有某个使用了的接口几乎没流量,或者负载均衡里面直接红了,查看你的设置,检查启动方式、网卡配置、负载均衡配置、以及所有我提到过的你设置过得东西。。。(慢慢查吧,帮不了你了)

9、如果成功了,恭喜你,将你的启动命令记录下来,设置成开机启动即可

多拨开机运行

开机运行的方法是一样的,写入/etc/rc.local

两种去进程锁方式的启动脚本略有差别(以开3个进程为例)

使用注释重新编译的童鞋如下:

sleep     #延时180S
/bin/mentohust -uaaaaa -paaaaa -naaaaa -a1 -d1 -b1 #启动进程1
sleep #延时60S
/bin/mentohust -ubbbbb -pbbbbb -nbbbbb -a1 -d1 -b1 #启动进程2
sleep #延时60S
/bin/mentohust -uccccc -pccccc -nccccc -a1 -d1 -b1 #启动进程3

没有改源码的童鞋如下:

sleep     #延时180S
/bin/mentohust -uaaaaa -paaaaa -naaaaa -a1 -d1 -b1 #启动进程1
sleep #延时60S
rm /var/run/mentohust.pid -f #删了pid文件 /bin/mentohust -ubbbbb -pbbbbb -nbbbbb -a1 -d1 -b1 #启动进程2
sleep #延时60S
rm /var/run/mentohust.pid -f #删了pid文件 /bin/mentohust -uccccc -pccccc -nccccc -a1 -d1 -b1 #启动进程3(最后一个进程删不删无所谓)

启动进程和删除pid文件中间的延时时间可以按实际情况更改,但不建议不加延时。

注意不要使用重复网卡!!!

小记——GTMD校园网的更多相关文章

  1. 第二周leetcode

    4/4 这周莫名得忙,一天是做编译,一天是做模式识别作业,(一天刷魔兽皮肤),周末玩了两天,总的来说还是松懈了,大概只做了两天的leetcode,刷了10道题,羞愧羞愧. 决定每次把代码附上在这个总结 ...

  2. [原]Paste.deploy 与 WSGI, keystone 小记

    Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...

  3. 锐捷linux客户端常用命令(主要用来连接校园网或公司局域网)

     锐捷访问校园网,.sh脚本文件rjsu*.sh-u 用户名-P 密码-S 参数1保存密码参数0不保存密码   其实:  直接使用md5认证方式输入用户名密码并且配置好ip之后,重新打开网卡即可有一定 ...

  4. MySql 小记

    MySql  简单 小记 以备查看 1.sql概述 1.什么是sql? 2.sql发展过程? 3.sql标准与方言的关系? 4.常用数据库? 5.MySql数据库安装? 2.关键概念 表结构----- ...

  5. 配置VMware虚拟机用绕过校园网达到无线上网配置方法

    因为平时要用到Vmware这样的工具上虚拟机上网, 但是本人是学生狗,学生狗在学校就要面对大学毒瘤软件--锐捷,而锐捷是不允许有虚拟网卡的存在的,所以上网只能用wifi上.之前试了很久,反正是怎么开都 ...

  6. Git小记

    Git简~介 Git是一个分布式版本控制系统,其他的版本控制系统我只用过SVN,但用的时间不长.大家都知道,分布式的好处多多,而且分布式已经包含了集中式的几乎所有功能.Linus创造Git的传奇经历就 ...

  7. [机器学习] Ubuntu 软件源更新(校园网)以及问题总结

    最近在折腾Linux,在校园网下怎么能够很好的获取软件很是让我头疼啊~~~ 总结一下吧!!! 首先是校园网的源地址: 清华大学:https://mirrors.tuna.tsinghua.edu.cn ...

  8. 广州PostgreSQL用户会技术交流会小记 2015-9-19

    广州PostgreSQL用户会技术交流会小记 2015-9-19 今天去了广州PostgreSQL用户会组织的技术交流会 分别有两个session 第一个讲师介绍了他公司使用PostgreSQL-X2 ...

  9. 东哥读书小记 之 《MacTalk人生元编程》

         一直以来的自我感觉:自己是个记性偏弱的人.反正从小读书就喜欢做笔记(可自己的字写得巨丑无比,尼玛不科学呀),抄书这事儿真的就常发生俺的身上. 因为那时经常要背诵课文之类,反正为了怕自己忘记, ...

随机推荐

  1. 57.部门职位管理 ExtJs 展示

    1.jobInfo.jsp <%@ page language="java" pageEncoding="UTF-8"%> <script t ...

  2. E20171011-hm

    Rendering engine  渲染引擎; 引擎; 绘图引擎; interactive   adj. 互动的; 互相作用的,相互影响的; [计] 交互式的; defer   vt. 使推迟; 使延 ...

  3. 2243: [SDOI2011]染色(树链剖分+线段树)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 8400  Solved: 3150[Submit][Status ...

  4. poj3264Balanced Lineup(倍增ST表)

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 52328   Accepted: 24551 ...

  5. thinkphp自带的验证码出现的问题

    thinkphp3.1.2版本中今天做验证码时出现了一个小问题. 在后台我引入过了一次验证也就是 import('ORG.Util.Image'); Image::buildImageVerify() ...

  6. UNIX环境高级编程--9. 进程控制

    进程关系    当子进程终止时,父进程得到通知并能取得子进程的退出状态. 终端登录:    早起UNIX系统通过哑终端登录,本地的终端 or 远程的终端 .主机上链接的终端设备是固定的,所以同时登录数 ...

  7. 涨知识 --- VI

    1.空类所占空间大小 空类所占空间为1,单一继承的空类空间也为1,多继承的空类空间还是1.但是虚继承涉及虚表(虚指针),所以sizeof(C)的大小为4. 2.内联函数与宏定义 Ans:内联函数和普通 ...

  8. Elasticsearch之CURL命令的DSL查询

    它是Domain Specific Language领域特定语言. https://www.elastic.co/guide/en/elasticsearch/reference/current/in ...

  9. scala函数用法

    直接上代码. package com.test.scala.test object Function { def main(args: Array[String]): Unit = { println ...

  10. Emoji过滤

    private static boolean isNotEmojiCharacter(char codePoint) { return (codePoint == 0x0) || (codePoint ...