艰难的802.1x上网历程
上网对我来说向来不太容易,由于赶在分到新校区,网络设施还没有部署齐全。而且我买的电脑也很早,于是就在寝室里用201卡上网。我的电脑是那种杂牌的笔记本。在RH9中声卡和内置猫都驱不起来,oss和alsld都试过还是不行,没办法后来只好用Windows上网,在vmware中运行linux了。后来大一下学期网络中心招人,而且据说还会有工作室。当时教学楼里的网络设施已经部署好了,每个教室都可以上网。于是我马上跑过去应聘。当时老师已经准备不招新人了,不过我是辅导员推荐过去的,加上老师对我的印象不错,于是我就被录用了。
终于能上网了,而且还是固定IP。不过因为声卡的问题我还是在用Windows。虚拟机上的系统变成了fedora core 1。有了足够的带宽,我可以在网上下载iso了。
暑假的留在了学校做ldap目录。恰逢fedora core 2出炉,我下载来是一是居然认出我的声卡了。于是我毫不犹豫就把整个硬盘格了只装fc2。
大二的上学期寝室里开始通网络了,802.1x认证,锐捷的设备。我到锐捷的网站上翻了个遍也没有找到linux下的客户端下载。后来网络中心的负责网络设施的王老师给我一个包的程序,现在想来应该是网上留传的所有的锐捷客户端的集合了吧?
那些程序我看了就讨厌,都是一个官方不知道什么时间发布的客户端的各种版本。而且那种一步步的提示方式看起来很像我们C++课程设计的时候大家写的小程序。我试了试不成功就给老师说不能用了!后来听说别的校区的同学认证成功了,不过很不稳定总是断线。我也不管了,当时我在网络中心可以用很多机器,开始在一台2003下用CCProxy.后来装了FC3用squid。这样保证我在寝室也可以上网。有时嫌麻烦了干脆在,服务器上装了gaim。用ssh把X定向到我的桌面上来聊天。前不久在网上查资料时候然看到锐捷linux客户端掉线是因为检测代理服务器的功能误报的原因。我当时嗤之以鼻:程序本来的功能还没写完呢,限制做的倒完整!
大二的那个暑假我决定退出网络中心了。从今以后就只能在寝室上网了,而且不能使用网络中心的代理。当时我的系统已经从Fedora换成了FreeBSD半年多了。我不想换回来,又不能使用代理,也就只好自己想办法了。
上网搜搜发现发现网上涌现的很多的小程序。都是各个平台用来实现兼容锐捷认证的。但是功能都不是很完整,而且都不是很稳定。有的不开放源代码,有的只linux平台。我想起以前曾经到过的open1x的网站。那时候已经了解了锐捷的认证和802.1x协议之间的微妙关系。于是我决定自己修改客户端给自己认证。
当时我已经放暑假在家了,发行版本的xsupplicant还不支持FreeBSD平台。我花了很长时间读代码,同时尝试用网上一个帖子中在FreeBSD下认证的代码来为xsupplicant添加FreeBSD的支持。同时参考的还有Ivan Voras的patch,他为一个稍老版本的xsupplicant添加了补丁但是这个补丁只能在FreeBSD 5.1中才能编译。这项工作对我来说过于艰巨,我花了半个月的时间没有成效,于是我向Ivan Voras发email求助,他很快给了答复。回信中说Fernando Schapachnik已经将它的代码修改并添加到官方的CVS中。这样一来我可以不用担心移植的问题了。我从官方的cvs中获取了代码,果然能够顺利编译。但同锐捷的兼容工作只能回到学校再继续进行。而我继续读了几天xsupplicant的代码后就去研究kademlia去了。
开学回到学校,我开始进行客户端的兼容工作,我在同学的机器上截了很多的包来分析,得到了发包的地址。在xsupplicant的配置文件中填入,于是日志中有了很多的纪录。xsupplicant发的包锐捷的包少了部分内容,而且比较有规律。于是我把截获的数据中分析出来的数据加在了xsupplicant的发送md5 hash过的密码的数据包之后。终于认证成功了,但是没办法保持连接,连接30秒钟之后就会断线。
我到网上找到mystar的代码,这也是一个学生写认证程序。分析他的代码后开始把认证后发送echo包以保持连接的功能添加到xsupplicant中。中间出现了一次插曲,我突然发现我的程序突然连认证都不能了,而且连认证请求都回应。日志中是不断的超时,我以为是多次认证尝试不成功交换机把我给屏蔽了。
后来听说网络中心的同学说是升级了交换机,对非锐捷客户端的审查更加严格了。而且这时我看了mystar的代码发现我截包时漏掉了一个关键的包。于是我在xsupplicant中找定义标注组播地址的地方改成了锐捷私有的组播地址,并且把配置文件中的静态mac去掉。同时在其他的每个xsupplicant的回应包还有start-frame中都加上了锐捷的指纹。这样交换机,又有了回应,还是认证成功很快断线。我还到网络中心的同学那里看了认证系统的日志,上面写着“未使用锐捷客户端”的字样。
我把mystar中的代码一点点地添加到xsupplicant中,由于标准根本没有定义类似的回应保持连接的机制,而是认证设备中可以根据需要向客户端发送需要认证的请求。所以需要改动较多的地方。还要获取从交换机回应的认证成功包中提取保持连接用的类似会话id的一组数字。正好xsupplicant按照标准完全实现了状态机,而且还有时钟机制1秒tick一次。所以只需要简单的代码就可以利用状态机触发echo包的函数了。
经过数次的调试,终于在一次认证时候连接再也没有中断。我终于可以上网了!开学以来我一共花了20来天的时间。我是在几天郁闷,几天放弃,几天尝试中度过的。比起mystar的作者花了一个周末来说是长了点。我的代码是基于一个次CVS的checkout编写的。我到官方的网站上看看,花了两天的时间制作了最新版的补丁。看着diff出来的补丁才300多行,9k大小,一天多少行?15行?嗬嗬!~
程序我发到了linuxsir和chinaunix上。也叫老师放到了校园网上。我们学校还有不少linux用户,不知道在他们机器上是否能够顺利运行。
这里要感谢open1x的伟大工作,他们设计的xsupplicant真的超稳定!稳定到了锐捷的Windows客户端都断线时他们也能有时保持正常工作(有时也会断线,而这时windows的机器也在重连获取IP)。感谢Ivan、Fernando所做的移植工作,让我能够在FreeBSD上完成程序的大部分修改工作。感谢netxray@hh的mystar和许多人为了兼容锐捷的设备而做的努力。还有我的同学杨俊鹏的帮忙,总跑过去找你看日志真的很不好意思。
这里是我在linuxsir上的帖子,上面详细写明的补丁的使用和认证的方法。程序没有在校园网外面测试过,可能有很多问题。mystar中的很多代码还没有加入。
http://www.linuxsir.org/bbs/showthread.php?t=219727
欢迎大家测试和报告错误。