在北信科宿舍优雅的使用路由器(把DrCOM客户端扔进OpenWRT路由器)

2016-03-30

引:原本是在3月28号也就是周一晚的ISTA硬件部的活动上所进行的主题,但是[目测]由于固件文件发生了破损导致路由器现场变砖导致了活动中断,顺便说一下路由器已经抢救回来并且配置好了。所以在这里写一篇完整的文章。

本篇文章包含的内容:

1.路由、交换的概念

2.网关与验证协议

3.宿舍用路由器的选择

4.在Linux(ssh,scp)或Windows(PuTTY,WinSCP)下配置带Python环境的OpenWRT固件

5.在Linux(ssh,scp)或Windows(PuTTY,WinSCP)下将Dr.COM-802.1x开源实现认证客户端放入路由器并实现开机启动

6.熄灯断电后依旧正常工作的路由器

为了顺利完成文章内的步骤,建议拥有一定的英语基础,对IPv4网络有基本认识,接触过命令行(CLi)以及给路由器刷写固件或折腾过其他难度类似的硬件的经验。

1.路由、交换的概念

路由的高端的解释可以从https://zh.wikipedia.org/zh-cn/路由 取得,说人话的不严谨版本就是从一个地址将数据跨网域(大多数情况)传输到另一个地址的过程,也就是通过路由器内建的192.168.1.0/24路由表将相对外网的数据路由到边缘子网内设备的过程。家用路由器的WAN口到LAN/WLAN口的关系就是一个路由。

交换的高端的解释可以从https://zh.wikipedia.org/zh-cn/网络交换机 来获取,说人话的不严谨版本就是一个将多个网络设备连接起来的网桥(Windows上选中多个网络设备以后进行的桥接就是这种效果),桥接器通过设备的MAC地址进行消息的广播。家用路由器的LAN口与WLAN口的关系就是一个网桥。

这个东西对于数学完全懵逼的我来讲基本上是处于只可意会不可言传的范围,所以也解释不清,就不打太多字了……

 

2.网关与验证协议

我们平常所使用的路由器一般都称为边缘路由器(从相对公网地址获得相对互联网的连接并广播给子网内设备的路由器),而国内多用的上网验证协议是虚拟拨号协议(PPPoE,这货跟PPTP还是亲戚),也就是在很久以前我们还没有路由器的时候每次打开电脑上网之前需要在电脑上点的“拨号连接”。这个验证协议是什么东西?以太网规范告诉我们,只要插上网线,两端设备通上电,支持以太网协议的设备就可以传输数据了(可以在学校里尝试一下插上网线或者连上BISTU开放无线网络热点后在不登陆的情况下访问bistu.edu.cn或者其他几个校内的网站)然而运营商或公司网关为了收费或安全原因,需要限制网络的使用权限,于是就需要添加一个验证协议,只有经过验证的设备才可以拥有外网或者特定网域的访问权限,而验证协议要想产生效果则需要网关了。

网关是什么?网关可以是路由器本身,也可以是这个网域内的一台设备,总之这个网络内所有设备的流量在通过路由器走出之前都会经过网关的过滤(流量转发),验证协议的协议服务器就在网关上(比如PPPoE-server),所以只要你想也可以在自己的路由器上放置一个PPPoE-Server然后路由器内的所有设备要想上外网都还要再进行一次拨号连接,当然这个用户名密码自己可以随便扔哈哈哈(想想就好蛋疼)。放到学校的话则是有一个Dr.COM网关,所有出外网的流量都会经过这台设备,客户端中启用Dr.COM程序输入用户名密码通过验证后这台设备的流量才允许出外网,而客户端不能关是因为验证是有时效性的,要想不失去访问外网的权限还需要每间隔一段时间发送[keep-alive]数据包来维持验证的有效性,PPPoE也大致是这个道理,至于学校里的网页验证,那个是Captive Portal验证,有兴趣的可以搜一下。顺便说个冷知识,Dr.COM的认证协议其实是一个魔改(近现代化魔法修改)的802.1x验证协议,有兴趣的也可以搜一下。之前有人说过:不魔改怎么收钱。真是2333333。

 

3.宿舍用路由器的选择

如果你要是聪慧过人,那么之前的时候就应该已经反应过来了,路由器其实也是一台电脑。确切来说应该是嵌入式设备,之所以现在没有人用电脑来放在家里做路由器主要还是太贵了……毕竟还是大材小用,那点数据包MIPS构架的NAT协处理器都跑不满,x86_64来做的话我也只能评价一句“真壕”了!现在的家用路由器大多采用的是MIPS构架的处理器,有小部分的高端产品使用的是ARM,不过说真的除非是拿路由器扔个aria2天天下载BT种子或者MySQL跑数据库的话,否则负载不会超过0.1%……又跑题了。总之,家用无线路由器大体上就是由处理器 无线芯片 交换器 闪存 内存 (少部分质量不错的有无线信号放大器芯片)以太网口 无线网络天线 (大部分机器还有外壳,少部分里面还内置很多散热板)组成。系统大多数为Linux,至于为什么一上192.168.1.1就会有个网页完全是固件里httpd的功劳… PPPoE做为一个正规且常用的协议,自然是路由器固件里必须集成的验证协议了(PPPoE-Client),而Dr.COM认证协议作为一个大多数情况只存在于中国校园和企业里的认证协议…抱歉,才没有人鸟你。

解决的办法也就呼之欲出了:既然路由器里没集成Dr.COM协议,我们往里扔一个不就好了。非常幸运的是,中国高校里优秀学子还是很多的,比如就有菊苣在GitHub(全球最大的同性交友社区)里放出了Dr.COM认证协议的开源实现:https://github.com/drcoms/drcom-generic ,啥,你跟我说这个网页打不开?哦对了,忘了说了,墙也是个网关,超大号的那种……。然后只要把这个用Python语言编写的执行文件扔到有Python语言环境支持的路由器里就行了,听着很简单对不对…

然而限制还是不少的,比如首先需要路由器里有足够大的空间。根据OpenWRT的Wiki所写,完整的Python环境需要7MiB左右的空间,Python-mini/light行不行我没有试,反正路由器128MiB的我担心这个干嘛(可能在不远的将来会收到闪存为512MiB的路由器用户的嘲讽)。而大部分路由器的内部存储只有4MiB,比如TP-Link和D-Link全系产品,基本上把基础组件写完以后就没有剩余空间了D-Link;至于Mercury、LB-Link等一众国产新品牌,则已经“努力”的把内部存储缩水到了2MiB甚至1MiB,更有甚的直接整合进了SoC只在主板留下个4MiB的内存(RAM),这种硬件缩水软件精简的技术创新简直令人感动……再一个需要一个可以有修改/etc/usr权限的固件系统,/usr倒是可有可无,无非就是如果不把drcom.py扔进去启动就只能用绝对路径了,不过/etc就不行了,毕竟rc.local(大部分linux发行版用来控制开机启动的脚本文件)在/etc中,如果每次路由器重起不能把drcom程序开机启动还要自己动手的话以后的生活就有乐子了。

所以,路由器不一定需要是OpenWRT系统,只要是可以修改这几个目录的就行了,像ASUS-MerlinWRT那种把/etc /usr /var都开机释放到/tmp(内存在系统里的挂载目录,和电脑一样,关机数据消失的那种)再bind的固件,丝毫没有任何可玩性…(我这么说只是因为我太渣了,其实可以往JFFS2里扔脚本),DDWRT可不可以?当然可以,方式与OpenWRT上略有出入,不过很久不玩了就不介绍了。

至于自己目前手头的设备是否支持OpenWRT,可以去https://wiki.openwrt.org/toh/start 查找,至于路由器的参数,可以去wikidevi查询。如果手头的路由器使用的是博通(BROADCOM,brcm)的芯片组,那么就可以放弃了,博通闭源了无线驱动,在OpenWRT下没有无线驱动的支持只能当有线路由器用了。

所以,经过筛选,选出了下面两款路由器,可以暂时供大家参考:

Netgear WNDR3800,已停产,95新淘宝价190元左右,9成新淘宝价150元左右,详细参数地址:https://wikidevi.com/wiki/Netgear_WNDR3800

WNDR3800

2011年的一款路由器,拿到手以后的第一感觉就是太大了,如果非要说什么参照物的话差不多是比两个newifi mini还要大一些。硬件配置方面默认680MHz的ar71xx MIPS 处理器,16MiB存储也够挥霍了,128MiB的内存,千兆以太网,放在宿舍是绰绰有余了,天线内置,嵌在外壳上,所以没敢拆,wikidevi里没有标出用没用什么WAMP,不过无线信号日常使用感受真的不错,目前宿舍正在用。

需要注意如果买回的路由器背面所写型号为WNDR3800-1CHNAS则需要刷写WNDR3800CH所对应的固件,WNDR3800的固件与其不通用,但两者配置相同。

购买的时候要求店家代刷入不死uboot (breed bootloader,恩山某大神的手笔),这个第三方uboot很好用。

 

Linksys EA4500,已停产,95新淘宝价340元左右,9成新淘宝价270元左右,详细参数地址:https://wikidevi.com/wiki/Linksys_EA4500

ea4500

相当好看,2012年产,用料也很暴力,手头还有一个2011年产的被捧得很高的ASUS RT-N66U,然而对比之下后者很惨(至少从我的角度来讲因为博通的闭原导致OpenWRT下没有无线驱动以及隔了一堵墙以后几乎变没有的5G信号,就算很惨了)。硬件方面使用的1.2GHz的Marvell Kirkwood ARM 处理器,128MiB与128MiB的存储与内存,然后每次刷机之后只会显示出16MiB的存储空间,貌似是个黑科技,据说如果固件刷新失败的话,重启三次无法正常开机,便会直接滚回上一次刷写的固件,并且连同配置等原封不动地返回。当然这也只是道听途说并没有真正遇到过。因为有一个蜜汁Bug所以后期销量很惨退货量激增(Linksys原厂的Smart WiFi固件在特定的上层Modem环境下会导致内置的iptables或httpd异常导致无法正常加载出192.168.1.1的配置网页,返回HTTP502错误,所以说刷OpenWRT要趁早),总之刷了OpenWRT以后完全不是问题,所以说是相当超值的一款路由器(可以考虑多囤几个,十年之内不愁用2333)。同样的千兆以太网、天线内置,但是很厚道的用了skywork的无线信号放大器导致信号异常的好,目前家里正在用。

购买的时候注意不要买到EA4500 Ver.3.0版本,虽然看起来好像是比EA4500要新要厉害,但是配置是完完全全的缩水。

 

4.在Linux(ssh,scp)或Windows(PuTTY,WinSCP)下配置带Python环境的OpenWRT固件

路由器到手之后,首先需要的就是刷写OpenWRT固件,大多数情况是,直接Google [路由器名称]+OpenWRT 就可以进入OpenWRT的wiki然后查询自己路由器的刷机方法(大部分都是英文百科),需要注意的是,factory后缀的是从原厂固件或其他第三方固件刷写到openwrt时使用的,sysupgrade则是在从openwrt固件升级时使用的。

刷机的步骤我就不说了,每款路由器都有些许差别,如果使用的是我上面所说的两种路由器中的一种,可以在 自己编译的OpenWRT_Trunk固件分享 中下载我自己编译的固件然后刷入,里面已经集成了Python环境,刷写完固件之后可以直接移步到步骤5 。

一些厂商的uboot内已经内置了带mini-web的恢复模式,可以在这个模式中更方便的刷机,uboot网页控制台的进入方法:按住reset键接通电源,等待指示灯进入闪烁,将电脑手动设置IP、网关与掩码(恢复模式下没有DHCP服务)后插入网线,浏览器访问路由器的地址,一般情况下为192.168.1.1。

刷写完成之后等待一段时间(OpenWRT系统的开机时间大约为10秒,比路由器自带的固件开机要慢一些),把IP和DNS更改为自动获取,浏览器访问192.168.1.1,进入LuCI界面,标准的OpenWRT发行版没有初始密码,用户名/密码输入root后进入,然后从System – Administration处更改密码,不要心存侥幸不更改密码,OpenWRT与一般的厂商固件不同,即使是从外网访问也依然对路由器有很大的控制能力,所以root用户的密码需要谨慎保管。Dropbear的设置一般情况不用管,处于未指定的情况就可以,然后选择界面最下方的Save&Apply 保存并应用设置。

完成这一点之后可以去System – System修改时区、主机名(这个可不是WiFi名称,WiFi的设置在 网络 – 无线中),如果使用的是我编译的固件也可以去Language菜单将语言更改为Chinese,同样的保存退出。

Windows下操作:

下载WinSCP与PuTTY(https://winscp.net/  http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html),其中WinSCP为安装程序,PuTTY为单文件执行文件,建议将PuTTY放入 C:\Program Files (x86)\PUTTY 中,以便WinSCP可以直接调用。WinSCP的作用是图形化的SCP(基于SSH的文件传输协议),PuTTY的作用则是基于SSH的远程Shell。完成后打开WinSCP,新建一个链接,选择到192.168.1.1,用户名root,密码为自己修改的,保存后点击管理中的“用PuTTY打开”。

我们已经知道OpenWRT是一个Linux发行版,作为发行版,自然有自己的包管理器,OpenWRT的则是opkg,在使用之前,先查看一下内置的软件源

cd /etc/opkg

然后使用cat分别查看一下customfeeds.confdistfeeds.conf的情况,

cat customfeeds.conf
cat distfeeds.conf

正常情况下已经有了内置的软件源,如图

2016-04-03

如果没有的话则需要使用vi自己添加。

vi是Linux内置的一个富文本命令行(在Cli中运行的文本编辑器),关于vi的使用方法请谷歌或者百度

然后使用 opkg update 命令更新软件源(目前有网络的情况),更新完成后使用opkg install python 命令即可安装完成python。

而在学校没有网络的情况下怎么办?如果你的电脑上有两块有线网卡的话可以尝试Windows系统里自带的网络共享功能,将连接到校园网的网络设备共享给连接路由器的网络设备,这个功能我没有用过,也不知道有没有内置DHCP和DNS功能。

或者从https://downloads.openwrt.org/ 选择对应版本的对应硬件平台的对应安装包,下载回来后通过WinSCP上传到路由器目录进行安装。比如下载wndr3800 14.07版固件需要的python程序:

https://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/packages/oldpackages/python_2.7.3-2_ar71xx.ipk ,将其下载完成后把python_2.7.3-2_ar71xx.ipk 通过WinSCP放入路由器的/tmp目录,然后在PuTTY中输入

opkg install /tmp/python_2.7.3-2_ar71xx.ipk

进行安装。假如有报错的话一般都是缺少依赖,再继续从之前的页面中下载依赖程序进行安装即可。

Linux下操作:

与Windows下类似,只不过一切操作需要从中端内完成,连接到路由器的命令为

ssh [email protected]

其余操作方法与PuTTY内相同,上传文件则使用SCP命令

scp [本地目录/文件名]   [email protected]:/tmp

其余地方与Windows下操作相同。

 

5.在Linux(ssh,scp)或Windows(PuTTY,WinSCP)下将Dr.COM-802.1x开源实现认证客户端放入路由器并实现开机启动

下面就是最激动人心的地方了,不过在此之前需要抓个包,下载WireShark (https://www.wireshark.org/#download 看起来好像没有Linux版,自己用源代码编译吧),安装之后打开(我这里没装就不截图了),在宿舍插上网线,选择以太网,开始抓包,然后打开Dr.COM城市热点客户端,做一次登陆操作,然后停止抓包,将保存的.pcapng文件保存好,然后进入在线配置生成器http://drcoms.github.io/drcom-generic/ 上传好刚才抓的包,输入校园网密码后点Edit,然后选择Generate,保存生成的conf。

进入 https://github.com/drcoms/drcom-generic ,下载其中的latest-wired.py ,使用notepad++(Windows)或gedit(Linux)打开,同时打开刚才生成的conf,把其中的内容覆盖掉lastest-wired.py中的#CONFIG#段落的内容。同时记录下配置中的IP地址。

如果此时在学校的话,在电脑上安装Python2.7环境,Windows下直接双击latest-wired.py执行,Linux下使用python latest-wired.py执行,查看电脑是否可以获得网络连接了,在CMD中输入 ipconfig /all 记录下电脑上的IP、网关、掩码与MAC地址然后继续进行下面的步骤。

继续查看latest-wired.py中的源码,找到IS-TEST段的内容,默认情况下应该是这样的

IS_TEST = True
# specified fields based on version
CONF = "/etc/drcom.conf"
UNLIMITED_RETRY = True
EXCEPTION = False
DEBUG = False #log saves to file
LOG_PATH = '/var/log/drcom_client.log'
if IS_TEST:
DEBUG = True
LOG_PATH = 'drcom_client.log'

 

如果不是,将IS-TEST的属性更改为True,同时将 if IS_TEST后面的DEBUGTrue更改为False,然后用SCP放进路由器的/usr/bin文件夹。

接着通过SSH在路由器上使用命令

vi /etc/rc.local

编辑路由器的开机启动文件,按I进入插入模式,在exit 0之前输入如下信息:

sleep 10 && python /usr/bin/drcom.py&

按ESC退出编辑模式,按:进入命令模式,输入wq!强制保存并退出。这时重启路由器
reboot
一切正常的话路由器就可以连接上校园网了,其他的WiFi设置一类的东西大家就自行解决吧。

(rc.local中结尾的那个&的用途是使进程启动后便置于后台bg,如果没这个洁癖的话可以不用2333)

其实除了IPv4这一块北信科还有一个神奇的ISATAP隧道,不过貌似目前还有一些BUG,所以在这里就不提了。

有时这个拨号程序可能会崩溃,这时可以使用crontab进行维护 OpenWRT下Crontab的使用方法

6.熄灯断电后依旧正常工作的路由器

淘宝关键词:宿舍 路由器 电池 12v

叫我雷锋就行。

发表评论

%d 博主赞过: