學校一直用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
