注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Chun Tian (binghe)

超越自我,洞察宇宙

 
 
 

日志

 
 

网易 Cisco 无线网络部署纪要  

2011-03-10 16:52:10|  分类: 系统管理 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
网易 Cisco 无线网络部署纪要 - 冰河 - Chun Tian (binghe)

养兵千日,用兵一时。自从上周一开始正式部署公司的 Cisco 无线解决方案以来,我每天都很忙。一方面要关注硬件层面,协助各地的 IT 工程师安装和配置所有接入点,另一方面还要设计软件层面的无线认证和日常管理接口。不过,能够用上 Cisco 的高端设备总归是一件令人高兴的事情。

Cisco 5508 无线控制器提供了充分的开放接口以支持包括 RADIUSLDAP、HTTP、FTP/TFTP、SyslogNTP 和 SNMP 等协议在内的各种标准服务器,这就让我可以轻松地将无线网络跟公司已有的帐号系统关联在一起。Cisco 提供了一种称为 Access Control Server(ACS)的软件系统用于管理一个大型无线网络里的多台无线控制器,并同时提供认证和无线帐号管理服务,但这个软件价格昂贵不说,而且必须运行在 Windows 系统上,跟企业自己的私有认证系统难以集成,所以尽管无线供应商强烈推荐,但我们坚持没有购买。于是,为了实现我在本公司的价值,我要自己研究替代的解决方案把这笔软件开销省下来。

我早可以做到在 Cisco 无线的 Web 认证接口里使用公司的 corp 邮件系统来做认证了,方法是首先将无线控制器的 Web 认证协议设置在安全性相对较低的 PAP 方式上,然后配置一个基于 PAM 认证的 FreeRADIUS 服务器挂在无线控制器的后面,最后再使用一个 PAM 的 POP3 模块将认证请求导向我们自己的企业内部邮件服务器上。尽管如此,我在试图支持更安全的 WPA 企业级认证方式(802.1X)的时候遇到了麻烦的问题:IEEE 802.1X 以可扩展认证协议(EAP)为基础,而最广泛使用、同时也是 Windows 系统默认唯一支持的 EAP 子协议 PEAP,在无线客户发起认证请求的时候只能发送 MSCHAPv2 方式的单向加密密码,而这样处理过的密码是不能用于后端的邮件帐号验证的。

一开始,我的想法是尽量避免涉及到编程,而是在我所使用的认证服务器 FreeRADIUS 的配置文件里定义一套规则——当用户首次通过了 Web 认证以后,将得到的明文密码转化成 MSCHAPv2 可以支持的 NT-Password 形式保存在后端的 PostgreSQL 数据库里,一旦完成了一次成功的 Web 认证以后,无线客户就可以接下来总是使用 802.1X 认证了。后来发现这个方案不可行,首先没有低成本的方法避免重复的检查一个用户是否是第一次使用 Web 认证(就算能够检查也不行,因为用户可能随时更改自己的密码),其次是为了生成另一种形式的密码并保存在数据库里,我不得不使用 FreeRADIUS 的 rlm_perl 模块在认证服务器进程内运行大量涉及网络操作的 Perl 代码,这将给认证服务器带来巨大的负担和不稳定性。如果我作为一个系统管理员不得不写一点儿代码的话,考虑到所有方面,我决定用我唯一熟悉的 Common Lisp 来写。因此,最后关头想出的解决方案是单独做一个用来 “激活” 802.1X 无线帐号的 Web 服务,它必须以极其简洁有效的方式确认一个人的邮件帐号,然后将 NT-Password 形式(本质上是密码字符串的 UTF-16 Little Endian 编码形式的 MD4 散列)的密码直接保存在认证数据库里。

实践表明,这是一个正确的思路,两天的时间里公司上百人顺利通过了这个激活过程并正确用上了带有 WPA 企业级认证的无线网络。



网易 Cisco 无线网络部署纪要 - 冰河 - Chun Tian (binghe)

我从上个周日的晚上开始编写这个基于 Common Lisp 的 Web 应用,最终的目标是得到一个可执行程序——一旦启动,就会连接到后台数据库并同时监听在 https 端口上,接受一个带有 E-mail 地址和相关密码的表单,进行 POP3 帐号验证,然后对密码进行加密,最后作为一条特殊格式的记录保存到数据库里。

整个系统应该运行在一台稳定的 64 位 Linux 服务器里,于是我 2007 年 $2500 购买、接下来每年维护费 $650 的 LispWorks 企业版再次派上用场了。LispWorks 企业版自带了对 SQL 数据库的支持,配合使用产品级的 CL-HTTP Web 服务器,就可以满足我对 https 和 SQL 的需要了。而 POP3 的支持,我在网上找到了一个小项目 cl-pop,它实现了最基本的 POP3 客户端协议,在网络层面上基于我一直在维护的 usocket 网络包。至于 MD4 散列的部分,我使用了著名的 ironclad 加密包。我使用了 CL-HTTP 的最新版本 70.218,它目前除了传统的 LispWorks 和 Macintosh Common Lisp 以外还支持目前流行的开源 CL 平台 Clozure CLSBCL 等,不过这些移植都不是很稳定。我通过内部渠道从 CL-HTTP 开发者 R. Joswig 那里得到了尚未发布的版本。

这是一个相当小的项目,我采取了自底向上的正统 Lisp 开发流程。首先我按照通行的做法,用 LispWorks 的 save-image 函数将 CL-HTTP 和所有需要用到的第三方软件包全部加载到 Lisp 映像中,然后 dump 成一个单独的 LispWorks 环境可执行文件,作为我日后其他工作的基础;然后编写 CL-HTTP 的启动脚本并定义整个无线应用的 Lisp 包,确保可以一个命令让这个 LispWorks 环境顺利地成为 Web 服务器。在没有涉及到数据库部分以前,所有这些开发工作是在我笔记本上的 Mac OS X 环境下进行的,因为我还有 Mac 下的 LispWorks 专业版。到星期一下午的时候,我已经可以产生几个动态生成的带有 HTML 表单并接受 POST 请求的简单 Web 页,并且可以顺利地通过 POP3 接口来验证用户和密码了。而跟 IT 部承诺的解决方案交付时间是星期二。

接下来全部开发工作转移到最终的 Linux 服务器上进行,我通过 GNU screen 程序在这台服务器上启动了一个 LispWorks 进程,然后以在 Emacs 里编写并调试其余的代码。从星期一的晚上顺利地写完了数据库部分,其实无非是要么 INSERT 要么 UPDATE,完全没有什么困难的地方。星期二的上午开始将 Web 服务的接口 从 http 切换到了 https,从那时起,我的 LispWorks 进程就再也没有停下来了,直到现在。我的整个程序如果去掉相当于 Makefile 的部分,最后只有不到 200 行 Common Lisp 代码。

星期二的下午在公司的 POPO 群上公布了这个服务,然后开始接受同事的测试。我的 Web 开发经验几乎为 0,很快就遇到了 3 个 bug。首先是有人没有往文本框里写东西就直接点了登录按钮,这导致那些原本接受字符串数据的函数得到了 NIL 空值;然后是有人在输入 E-mail 地址的时候使用了大写字母,而我完全没有做大小写转换,结果导致同一个人在数据库里留下了带有不同大小写的同样记录;最后,我没有正确地清理服务器端用来保存用户 session 的哈希表,这导致该表的尺寸只会永远增加。

幸运的是,无论遭遇何种问题,LispWorks 平台及其 CL-HTTP Web 服务本身总是坚如磐石的,我所损失的只是几个派生出来的线程罢了。很快我就修复了所有这些问题,但却没有必要关闭并重启 Web 服务。相反,我直接把我修改后的代码通过命令行的 Lisp 交互环境(Listener)编译加载,从而就地更新了我的程序。最后,我还请教了同事里的一个做 Web 前端的 MM,她帮我解决了 HTML 表单里的文本框对齐问题——我之前甚至不会使用表格。在我最近翻译完的《Practical Common Lisp》一书里,有句话我很认同,它说专业的 Lisp 程序员往往会启动一个 Lisp 进程,然后努力去维护它,并增量地开发他们的程序。现在看来,我应该已经算是专业的 Lisp 程序员了,至少已经领会了专业精神。

事情就这样告一段落了。接下来的工作是设计针对无线访客的一次性密码(OTP)系统。我考虑再写一个更大的 Web 应用,让各地的行政人员日后通过我的这个系统随时为外来人员提供无线网络的临时访客权限。最后,我早先在 SNMP 领域的工作可以成为一个通过 SNMP 接口监控整个无线网络的监控系统。不管怎么说,通过这个小程序的实践,我认识到了自己在 Web 前端开发上的不足,因此接下来正式开始学习《Ajax in Action》一书。不过,我要用 Common Lisp 而非 PHP 来实现这本书里的所有示例,并在这个过程中改进 CL-HTTP,让它变得更强大。



再补充一些内容。

在我们的同行里,百度和阿里巴巴也都在使用 Cisco 的无线网络。从我去年 10 月份在连城的陪同下亲临百度时看到的情况来看,他们的无线网络也是跟企业内部认证系统挂钩的,但似乎由于无法解决前面提到的 802.1X 认证问题,最后只采用了能够传递 PAP 明文密码给后台的 Web 认证。另一方面,根据我们 Cisco 供应商透露的信息,我们对门的阿里巴巴购买了 Cisco 的 ACS 软件,在一台 Windows 服务器上使用 SQL Server 管理所有无线帐号,从而没有试图跟他们的企业内部认证系统集成。相比之下,应该还是我们目前的设计更专业一些,而采购成本也几乎做到了最小化,能不买的东西都不买了。
  评论这张
 
阅读(9882)| 评论(11)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017