實驗平臺如下:
路由器型號:TP-LINK TL-WR703N v1
OpenWrt版本:Chaos Calmer 15.05.1
前言:
802.11幀有三種,管理幀、控制幀,數據幀。每種類型幀又分很多種“子幀”。手機WIFI開啓掃描熱點、連接熱點的過程主要涉及管理幀。
當我們的手機掃描周邊WiFi熱點時,會發出一種probe_request的幀(它是管理幀的一種,其中包含了手機的MAC地址),遍歷空間所有信道,等待AP返回Probe Response幀。
這個交互過程中,終端到各AP的信號強度值是一清二楚的,從而可以採用RSSI等方式來定位。也就是說只要你手機終端開啓了Wi-Fi,在後臺它是會與空間內的AP發生一次或反覆的幀聽與響應,這些可以幀聽,基本暴露了你在空間的大致位置了。
通過這種方式,WiFi熱點亦可掃描並收集周圍的AP信號,無論是否加密,是否已連接,甚至信號強度不足以顯示在無線信號列表中,都可以獲取到AP廣播出來的MAC地址。
一、基本原理
利用工作在monitor模式的無線網卡可以探測到所有經過它的數據流,在AP端使用無線網卡抓取AP與AP、AP與STA之間的MAC層管理數據包,然後對抓取的MAC幀進行實時解包,提取所需要的Timestamp、MAC address、RSSI等信息,並將其存入服務器數據庫中,用於後續的wifi定位、鏈路分析等。
二、獲取周圍wifi強度的兩種方法:
1、抓取AP與AP之間的MAC層管理數據包
OpenWrt路由器無線網卡工作於AP模式,無需連接周圍wifi,通過以下指令即可監聽到它們的MAC地址、RSSI強度等信息。
如何在Linxu程序內部嵌入shell終端指令並獲取該指令的輸出結果。請參考 此處。
iw dev wlan0 scan | egrep "^BSS|singal"//參考註釋[4]
最終效果:在703N路由器測試最快速度爲 0.8秒以上,此外獲得的RSSI不穩定,浮動較大,不適合做控制,故尋找第二種方法。
原因分析:此條語句執行時,會將周圍所有的 wifi熱點的MAC層管理數據包都捕獲進來,然後再挨個解包、提取,這個過程將花費相當長時間,造成讀取線程堵塞。
2、抓取AP與STA之間的MAC層管理數據包
OpenWrt路由器無線網卡工作於AP模式並作爲Master路由器,其它路由器作爲Client,連上該AP,即可通過下列指令查看所有連入該AP的客戶端的信息。
如使用帶WDS功能的路由器作爲客戶端,請參考 TP-LINK無線路由器設置無線WDS擴展無線網絡
如使用OpenWrt路由器作爲客戶端,請參考,OpenWrt路由器設置萬能中繼及如何永久修改MAC地址
iw dev wlan0 station dump | egrep "Station|singal:"//參考註釋[5]
//iw wlan0 station get 40:b0:fa:c1:75:41//查看單個路由器信息
最終效果:在703N路由器測試最快速度爲 28ms,獲得的RSSI較爲穩定,實時性也滿足要求。
參考文章:
[1] wifi關鍵數據提取
[2] Linux使用tcpdump抓獲取WIFI包
[3] Linux系統無線網絡抓包程序(分析手機WIFI MAC地址)
[4] 實戰無線網絡分析(篇一)無線監聽
[5] How to get RSSI in a linux AP (iw station dump doesn’t work)
@本文作者:LeathreWang