学校一直用H3C客户端上网,因此无法直接使用无线路由器。后来去一些论坛时常看见DD-WRT和OpenWrt这两个词,也初步了解到wpa_supplicant、njit-client、mentohust、OH3C等等,知道它们经过配置能够通过Wan口实现H3C、锐捷、港湾等802.1x认证,然后Wlan发射WiFi信号,于是就能实现多机无线上网,但因种种原因一直没有尝试。
这两天终于有机会好好折腾,经过一晚上奋战,解决了家里无线上网的问题。而且学校表面上需要H3C客户端,好像用的是华为和3com搞出来的非标准802.1x认证,实际上在学校的教工区却能兼容标准的802.1x认证,因为在Ubuntu 12.04的网络管理器里勾上”802.1x安全性“,填上用户名密码,加密方式选"EAP-MD5",无需客户端直接就能连上。下面写写过程。
802.1x认证到底是个什么东西?我也说不清,本人《计算机网络》刚刚看到网络层,什么IP数据包,什么RIP路由选择协议,刚有点模糊的概念,懵懵懂懂。但是以下的阅读材料推荐你去看看,相信会有更多的认识(有一点就足够了,我们的目标只是让无线路由连上校园网):无证程序员PT桑的技术博客,吵吵博客,Ubuntu技术支持。
既然Ubuntu可以直接连上,那么DD-WRT和OpenWrt这些定制版的Linux经过配置,相信也是能连上的。
具体怎么做呢?
我一开始看到的是这篇文章,作者用的设备是TL-WR703N,刷的是DD-WRT系统,因为它写的比较清楚,操作难度低,如果能一步一步照着做,相对比较轻松。一开始还比较顺利,但是到“将DD-WRT的网页再解包”那一步时,firmware-mod-kit出现了"Bad file size/offset"错误,估计是由于软件不支持Buffalo的固件(Buffalo的固件是经过特殊加密的,DD-WRT的wiki有写)。如果忽略删除多余语言这一步,强行打包,要么固件太大无法生成,要么加了“-min”参数后生成的固件刷入路由器使路由变砖,最后只能作罢。(我用的路由器是Buffalo WHR-G300N-CH,根据销售地区不同,这款路由器又叫WHR-G300N V2、WHR-G301,其实硬件都是一样的。选择这款路由器的原因在于,它是公认的”刷不死“,任何情况下都是一根网线直接救活,要不然保守估计昨天晚上我这个路由器就得返厂维修10次8次的。缺点是内置天线,信号一般。 内置天线并不代表信号一般,调高发射功率之后信号非常好。功率大不一定信号好,关键还是信噪比。)
后来我在一个帖子里发现了点线索(4楼):大多数Linux都有wpa_supplicant,看起来很眼熟,另一篇博文则告诉我更多:刷OpenWrt是可以实现目标的,而且方法也更明确了:“主要是把wpad-mini卸载换成wpad,mini版本的不支持802.1x认证。其实wpad就是wpa_supplicant和hostapd的集合。”
于是转向OpenWrt。OpenWrt实际上就是一个开源的Linux系统,针对无线路由器开发,它最大的特点是:刷入路由器后,文件系统是可写的,所以后期能随心所欲进行配置。那么道路就明确了:1、刷OpenWrt;2、装wpad。
你可以自己定制OpenWrt固件:配置好交叉编译环境后,从源代码编译自己所需的系统,也可以直接使用官方或第三方做好的固件。
交叉编译什么的太麻烦,没有特殊需要就直接拿现成的用吧。
Buffalo WHR-G300N-CH 的CPU是Atheros7240,对应的OpenWrt固件就是”ar71xx“系列,可以在这里找到。
OpenWrt的固件有两个分类,jffs2和squashfs,这两个分类的区别我没有细究,似乎squashfs有failsafe机制,也不管了,直接选squashfs。然后固件又有factory / sysupdate / tftp之分,直接选择tftp。(factory版本可以通过原厂固件的web升级界面刷机,sysupdate版本可以通过原有的OpenWrt升级界面刷机,tftp版本用来通过网线刷机)
刷固件的话,用Linux系统很方便,因为各种工具都可以用命令行直接输命令运行,临时要下载新工具也很简单,命令都是一样的,另外由于Ubuntu相对比较普及,能找到的帮助信息比较多,因此推荐使用Ubuntu。
一根网线连上路由器Lan口,就可以开始了。
首先你可以把固件的名字在图形界面里改短一点,而且固件文件的扩展名也是可以删掉的,不然命令行敲着累。
以下引用别人的文章。对Buffalo WHR-G300N-CH这个路由器来说,不论之前刷的是什么固件,只要按照下面的方法操作,就能刷入新固件,不用先刷回官方固件,再刷别的固件。(嫌sudo敲得累可以先sudo -s,这样当前终端窗口就一直是root权限)
在终端输入: sudo service networking stop Ubuntu 9.10用户用这个命令、 sudo service network-manager stop Ubuntu 10.4或以上系统用这个命令、 sudo ifconfig eth0 192.168.11.2 必须是这个IP段、(即使你现在刷入的是DD-WRT)即使你已经改了路由的IP、这里你还是必须要配置本地网卡为192.168.11.?、eth0是本地网卡、上文有提到要注意、 sudo ifconfig eth0 netmask 255.255.255.0 (此步可以省略) sudo arp -s 192.168.11.1 AABBCCDDEE5F ‘AABBCCDDEEFF’改为你的路由器mac地址(在路由器背面有标签,就是SSID)、可加冒号也可不加、 拔掉路由电源、 在终端输入 tftp tftp> verbose 提示Verbose mode on. tftp> binary 提示 mode set to octet. tftp> trace 提示 Packet tracing on. tftp> rexmt 1 tftp> timeout 60 tftp> connect 192.168.11.1 tftp> put 1.bin //1.bin就是你想刷入的固件文件名,自己改,别无脑照着这个输
这时立即插上路由器电源、待ubuntu显示正在推送固件(速度很快,几秒就结束了,然后路由器的DIAG灯会亮,等它熄灭,ROUTER灯亮,路由器就启动完毕了)
然后推送完成、会等待输入、 输入 quit 退出tftp 输入 exit 退出终端、 等待路由重启完成、亮起power与router、刷机完成、
此时第一步完成了。注意OpenWrt没有自带GUI配置界面(我当时下载的trunk版(即开发版)是不带LuCi web界面的,但后来发布的Attitude Adjustment12.09版是自带的,trunk版未知),就是说你想像控制其他路由器一样,在浏览器里输入"192.168.1.1"来配置,办不到!不信你试试,你会得到一个“连接被关闭”的出错页面。OpenWrt只能用ssh登入后,用linux的命令行配置。
第一次登录需要用telnet来设置初始密码:telnet root@192.168.1.1,设置完成之后,就可以用ssh登录了:ssh root@192.168.1.1 默认无线没有打开,需要修改/etc/config/wireless,在wifi-device radio0的设置中,把最后一行option disabled 1删掉。 锐捷绑定了网卡的MAC地址,因此需要将路由器的外网网卡的MAC地址改成你的机器的MAC地址。修改/etc/config/network,在wan的配置后面加上这么一行option macaddr xx:xx:xx:xx:xx:xx,其中xx:xx:xx:xx:xx:xx是你的机器的网卡的MAC地址。 完成上面两步修改后,重启网络:/etc/init.d/network restart
第二步就是要安装wpad了,安装包依然是去OpenWrt的服务器下载,注意不要下载wpad-mini,OpenWRT已经自带了mini版,等会要先卸载掉mini版,安装完整版。我在这里犯过错误,卸载wpad-mini后,装了wpa_supplicant,结果路由器的无线功能没有了……还纠结老半天,才想起这一句“主要是把wpad-mini卸载换成wpad,mini版本的不支持802.1x认证。其实wpad就是wpa_supplicant和hostapd的集合。”(新的Attitude Adjustment版本已经可以在web界面直接管理软件,更加方便)
在电脑终端里(注意不是在ssh打开的那个窗口继续输命令了,要么exit退出,要么开一个新的终端窗口)用scp命令可以传文件到路由器的/tmp文件夹,或者参考这个:pscp -scp xxx.ipk root@192.168.1.1:/tmp
然后继续ssh到路由器,首先卸载wpad-mini。因为你是root登陆的,所以不会有权限问题,命令是:opkg remove wpad-mini
然后cd /tmp
opkg install xxx(xxx是你下载的wpad安装包的文件名)
安装完以后准备802.1x认证的配置文件,一般把文件放在/etc/config/ 目录下,比如叫802.conf,那么就在命令行直接输入命令vi /etc/config/802.conf
vi是一个很有趣的编辑器,我本来按照习惯想用nano,结果OpenWrt没装……只好硬着头皮用vi。vi打开以后不能直接输入,要先按一下“i”键,转换成插入模式,在窗口的左下角能看到状态的转换。然后输入如下内容:
ctrl_interface=/var/run/wpa_supplicant # ctrl_interface_group=wheel ap_scan=0 network={ key_mgmt=IEEE8021X eap=MD5 identity="username" # 这里的username换成你的认证用户名 password="password" # 这里的password换成密码 eapol_flags=0 }
退出vi编辑器时,先按一下“esc”,然后输入“:wq”,(:是命令头,w表示写入,q表示退出)
这个时候就万事俱备啦,很激动,于是我犯了个很二的错误:网线没有接就开始认证,能认证上我看就要到庙里去烧烧香了。
记得把网线接入路由器的WAN口。
继续在ssh窗口里输入:wpa_supplicant -B -i eth1 -c /etc/config/802.conf -D wired
如果一切顺利,这时你的路由应该能正常工作了。OpenWrt默认的WiFi热点就叫这个名字,无密码,你先试试能否上网,测试好再添加密码。
修改/etc/config/wireless文件就能添加密码,详细设置可以看官方wiki
注意这一段,如果你的路由是300M的,按照以下设置才会发挥全部功力,电脑网卡也要相应设置,自己google。
40 MHz channel (300 Mbps) Stuck at 130Mbps? Get 300Mbps! Note: this violates regulatory requirements. Edit the file /etc/config/wireless, and restart the wifi AP by executing the following commands… uci set wireless.radio0.htmode=HT40+ # or: HT40- if using channel 11 uci set wireless.radio0.noscan=1 uci commit wireless; wifi Note that option 'htmode' should be set to either HT40+ (for channels 1-7) or HT40- (for channels 5-11). You have to use WPA2 encryption with AES.
这一段它在命令行下吭哧吭哧用uci来修改配置文件,其实可以直接编辑配置文件:vi /etc/config/wireless
config wifi-device radio0 option type mac80211 option channel 11 option hwmode 11ng option path 'pci0000:00/0000:00:00.0' option htmode HT40- option noscan 1 list ht_capab SHORT-GI-40 list ht_capab TX-STBC list ht_capab RX-STBC1 list ht_capab DSSS_CCK-40 # REMOVE THIS LINE TO ENABLE WIFI: #option disabled 1 config wifi-iface option device radio0 option network lan option mode ap option ssid 你的网络名 //自己改 option encryption psk2+aes option key 你的密码 //自己改
最后解决脚本的问题,让路由器开机自动认证。脚本可以参考这个人的,还有这个OpenWrt论坛技术帖,详细的Linux指令也有。别无脑照着输,把路径变量替换成自己环境下的。
#!/bin/ash killall wpa_supplicant 2>/dev/null wpa_supplicant -B -D wired -i eth0 -c /etc/802.1x.conf sleep 5 udhcpc -i eth0
nano /etc/init.d/wpa #opens text editor copy paste code in it
#!/bin/sh /etc/rc.common # Example script # Copyright (C) 2007 OpenWrt.org START=99 start() { echo start wpa_supplicant -D wired -i eth1 -c /etc/config/wpa.conf & }
#ctrl-x save yes and exit chmod +x /etc/init.d/wpa chmod 755 /etc/init.d/wpa /etc/init.d/wpa enable reboot
从我这里的经验来看,和后一个帖子一样,手动运行udhcpc是不必要的,但各单位的设置可能不一样。还有WAN口到底是eth0还是eth1需要你用ifconfig看清楚,比如我这里的WAN口就是eth1,所以记得自己改一下,“wpa_supplicant -B -D wired -i eth1 -c /etc/config/802.conf ”
至此路由器终于配置完毕。连上WiFi速度杠杠的。
如果你是H3C、锐捷、港湾等非标准802.1x认证,资料也很多,安装相应的第三方软件就行。
以下链接汇总供参考
http://sfjblog.7yue7.net/?p=239
http://ghtt.hitwh.edu.cn/thread-1946615-1-1.html
http://www.chaochaoblog.com/archives/1116
http://apt-blog.net/802-1x_support_macos_freebsd