致敬mentohust,路由器使用Socket認證華科校園網
前言:
上一篇文章中,為了解決ESP32華科無線網認證的問題,我成功把網頁認證機制用Python+Socket復現。但痛點依然存在,無線網連線數量有限、公用路由可操作性低、有線網口少這些問題只有通過引入路由器才能解決。
我手上有兩臺洋垃圾網件R6300v2,均刷有梅林韌體380.70。折騰它們是為了實現路由器自動校園網認證並提供穩定的網路,為越來越多的聯網裝置以及後面的專案做準備。
前後兩篇文章都是對mentohust開發前輩的致敬,雖然技術層次遠不及前輩大佬,只是希望能傳遞一些精神。本文所用到的一些程式以及華科校園網認證的具體情況在登入華科校園網,我用Socket裡有詳細描述。不熟悉mentohust軟體的朋友可以先瀏覽文末致敬部分。
目錄:
條件分析
有線認證
首先要了解的就是校園網有線認證的可能途徑,才好有的放矢。下面是學校網路中心官網截圖:
可以看出,在學生區的有線網路僅允許使用認證程式,也就是銳捷認證客戶端進行認證。於是在理論準備的時候,我的想法是把mentohust部署到R6300v2上進行銳捷認證,也在網上找到了幾篇來自哈工大、浙江理工的同學的文章,甚至聯絡到一位華科研究生學長,他幾個月前將mentohust部署到了小米AC1200路由器上,充分證明了方案的可行性。
在實際使用中我發現,接入有線網路後竟然也會彈出Web認證頁面,也就是說雖然在上圖中沒有標出,但Web認證在學生區是完全可行的。後來,我也通過電話向學校網路中心確認了這種方式將會長期存在。
如上圖所示結構,當PC1
連線到路由器時,自動彈出認證網頁。認證完成後,會顯示有路由器
和PC1
兩個裝置佔用了校園網線上名額。此時其他裝置比如PC2
再連線到路由器也可以獲得網路連線,並且不會佔用校園網名額。
問題在於,如果PC1
斷開連線或者主動下線,路由器也隨之下線,其他裝置自然失去網路連線。所以,進行認證的裝置必須時刻線上,而且要具有重連功能以應對突發情況。
路由器平臺
如上圖,兩臺R6300v2都已經刷入梅林380.70,右邊的一臺加裝了散熱風扇。本次僅用到一臺路由器,至於為什麼會有兩臺,那就是另一個有趣的故事了。
R6300v2主要引數如下:
CPU:博通BCM4708 雙核800MHz Cortex-A9
記憶體:256MB
系統:梅林380.70 Linux 2.6
可以說是可玩性非常高了,在網上看到有人為R6300v2編譯了Python 2,這樣一來之前寫的Python版本認證不就可以直接拿來用了嗎?但是出於穩定與效率的考慮,並沒有繼續使用Python。
方案選取
綜合有線網路認證與路由器的軟硬體情況,思前想後有這麼幾種方案:
- 額外的裝置連線到路由器負責登入,這個裝置要保持隨時線上,比如ESP32,還有樹莓派、香橙派等SBC。要具備網路介面能力。
- 路由器執行mentohust進行銳捷認證,也是大多數教程的做法。
- 將之前的Socket認證程式移植到路由器端,通過Socket進行認證。
不難得出,方案一是曲線救國的下策。對比二和三,方案三由於Socket登入完全自主,會比方案二使用mentohust更加易於除錯。但方案三需要把之前Python程式改寫成C併為路由器交叉編譯,然而這款十年前的32位處理器,資料相當少,交叉編譯環境搭建十分費力,具體在後面也會提到。
綜上,方案二三我都進行了嘗試。部署mentohust之後無法找到認證伺服器,我沒有在這上面花費太長時間,畢竟mentohust由於認證的複雜程度高所以很難滿足穩定這一要求,我就將重點放到方案三上去,也就是:
使用C語言重寫Socket認證程式,併為R6300v2平臺編譯
方案實施
交叉編譯工具鏈與環境
雖然BCM4708本身效能已經與不少單板計算機(樹莓派)相差無幾,但由於系統缺失了許多構建工具,一般選用上位機交叉編譯的方法為其產生可執行程式。交叉編譯就需要用到BCM4708這款晶片的工具鏈以及相應環境,困難在於這款晶片比較古老,需要的工具鏈和環境在2021年算是比較少見,可考資料寥寥,加之我經驗淺薄,在環境搭建上花了不少時間。
我使用的工具鏈來自:https://github.com/RMerl/am-toolchains,其中的BCM-SDK
版本適合於BCM4708。
拿到工具鏈,我先是在搭載 Ubuntu 20.04 64位的雲伺服器上嘗試使用未果。由於需要32位的執行庫,於是在虛擬機器中安裝了Ubuntu 12.04 32位版,然而12.04發行版的各種支援都已經結束。只能又換為Ubuntu最後一個支援32位的長期維護版16.04。
上位機系統找好,添加了工具鏈及其動態連結庫後,執行arm-linux-gcc hello_world.c
得到了a.out
,用scp放到路由器上執行,成功打印出了hello world
。證明交叉編譯環境搭建成功。
認證程式的C語言實現與除錯
上一篇文章登入華科校園網,我用Socket中,咱們用Python控制Socket模擬瀏覽器進行認證,這一次只需要用C完全復現即可。不得不說,還是Python好用。同樣這次的程式碼也併入了之前的GitHub倉庫。
編碼的過程並不讓人享受,在Windows下編輯,在CentOS虛擬機器下編譯測試,Ubuntu虛擬機器下交叉編譯,再傳輸到目標機。期間使用GitHub進行同步需要使用全域性代理加速,測試為了連線校內認證伺服器又需要關閉代理。總而言之,折騰。
實際部署
有了登入的可執行檔案,只需要在上電開機以及固定時間自動執行即可。
梅林韌體雖然是基於Linux,仍有非常多與常用發行版不一樣的地方,下面是我的一種部署方法:
使用crontab
定時呼叫,以及開機自動執行的指令碼/jffs/scripts/nat-start
。
#在/jffs/下建立一個資料夾,我起名叫login_by_socket,把編譯好的程式(a.out)放到login_by_socket下
#並在login_by_socket下建立一個文字檔案crontab_table,內容為:
#*/30 * * * * date >> /jffs/login_by_socket/log;/jffs/login_by_socket/a.out >> /jffs/login_by_socket/log
#意為每隔30分鐘自動嘗試認證
#再向/jffs/scripts/nat-start新增兩句話:
#/jffs/login_by_socket/a.out
#crontab /jffs/login_by_socket/crontab_table
#總結為如下:
chmod a+w /jffs
mkdir /jffs/login_by_socket
#需要手動將a.out放到這裡來
echo '*/30 * * * * date >> /jffs/login_by_socket/log;/jffs/login_by_socket/a.out >> /jffs/login_by_socket/log' > /jffs/crontab_table
echo '/jffs/login_by_socket/a.out' >> /jffs/scripts/nat-start
echo 'crontab /jffs/login_by_socket/crontab_table' >> /jffs/scripts/nat-start
#以上這些只需要執行一次,所有的日誌可以在/jffs/login_by_socket/log中找到
顯然還可以進一步優化,來提高認證的精準度,比如可以主動判斷是否連線來儘量減少掉線時間。
致敬mentohust
十多年前,華科的幾位前輩開發了一個開源專案,它可以模擬銳捷認證客戶端進行上網認證,叫做mentohust。由於其開放原始碼特性,故可以被編譯到各種平臺上執行(路由器)。銳捷認證是華科也是很多高校選用的認證方式,因此mentohust也被無數學校的學生進行移植,修改,運用,直到今天。
我探索校園網的認證途徑,除了自己的需求以外,也是被前輩這樣的精神感召。雖然在技術難度上遠不及前輩,亦是想盡一份力,發一點光,正如圖片中mentohust化用的華科校訓:人到華中大,有甜亦有辣。明德厚學地,求實創新家。
後記
返校後開始著手去做,由於水平一般,實打實地肝了兩天才把所有都弄完,又用了一天時間來寫這篇文章。其中向學校網路中心諮詢時那邊的老師問了我的學號,我心裡咯噔一下想這怕不是要辦我,後來老師叫我不要多想。過程中交叉編譯等環境的描述也沒能非常詳細,畢竟還在用這樣古老平臺的人的確不多。
程式碼GitHub地址:https://github.com/HuXioAn/HUST_Wireless_login_by_socket 如果需要文中編譯工具鏈相關具體環境可以公眾號直接聯絡我,發現文中有錯誤或者其他意見也請一定指出。技術新人,還望各位前輩多指教。
上一篇文章也可以在公眾號裡找到,來和我聊聊天吧:
歡迎轉載!請註明作者與原文地址。
作者:胡小安
原文地址:https://www.cnblogs.com/huxiaoan/p/15235849.html