2013年5月4日 星期六

WIFI 下分析網路問題的方法

近日在 iPad 上實作上的串流應用時,遇到一個奇怪的問題,串流播放約五分鐘後,WIFI 便會中斷,接著過幾十秒之後,WIFI又恢復正常,可以正常播放。

我們懷疑這可能是 iOS 本身的檢查網路機制,又或者是WIFI網路的問題。趁著這次機會,我好好研究了一下如何在 WIFI 下,捉取同一個網路內其他機器的網路封包,並進行問題分析的方法。

首先挑選捉取網路封包的工具,一開始我想使用 Debookee,但試用了之後,才發現不符合我的需求,因此最後仍使用 wireshark,在 Mac OS 10.8.2 下進行問題分析。




一、首先確認測試 AP 的 channel number 是否與其他 AP 相同
Capture -> Options -> 選擇 wifi adpater -> 勾選 Capture packets in monitor mode
如此便可以找到網路上目前可見的 AP,參考下圖,此畫面上共有三台 AP,其中第一台AP(Miukiu-1) 連線時使用 channel 8 ,藉由此方法可以設定一個沒人使用的 channel number。
若是只要收集網路上某個 AP 的相關封包,或是某台機器的封包,則可以設定 bssid filter,例如:
  • wlan.bssid==00:01:02:03:04:05
  • wlan.addr==40:30:04:1d:7a:c1 

二、捉取封包

測試機 iPad 的 IP=192.168.1.44, MacAddress=40:30:04:1d:7a:c1
首先嘗試的是使用 promiscuous mode,不作任何設定,直接在Mac捉取封包是無法看到iPhone封包的。
我們需要先設定 AP 需要的認證方式與密碼,讓wireshark有能力解開802.11的封包。 
設定方式是先選擇 Edit->Preferences->Protocols->IEEE 802.11,勾選 Enable Decryption,並且設定認證方式與認證所需的密碼。


設定完成後,從 Mac 上可以看到 iPhone 的封包,但只看的到 AP 送給 iPhone 的封包,卻看不到 iPhone 送到網路上的封包。如下圖,只看的到 Destination=192.168.1.44 的封包,看不到Source=192.168.1.44 的封包。


換成使用 monitor mode 會直接捉取 radio packet,資料量很多,由封包觀察,
可以同時收到 iPad 送出與接收的封包 (Apple_1d7ac1)。 

現在剩下的問題就是要將 monitor mode 下捉取的封包,轉換成一般的ethernet封包以方便檢視。
實驗的結果是在 Capture -> Options -> 選擇 wifi adpater -> 同時勾選 Capture packets in monitor mode 與 Capture packets in promiscuous mode,便可以達到我想要的效果

捉取 RTSP/RTP 封包也是沒問題的。這樣接下來要分析問題就容易多了。

這次測試讓我發現要在 WIFI 下擷取他人的封包真的是件很容易的事,以後在外面使用 WIFI時,還是盡量使用 https,以避免帳號密碼被盜。

註:以下說明一下 Capture packets 所採用的兩種方式的定義
Capture packets in monitor mode
All packets of all SSID's from the currently selected channel are captured. 
Capture packets in promiscuous mode
In computer networking, promiscuous mode or promisc mode is a mode for a wired network interface controller (NIC) or wireless network interface controller (WNIC) that causes the controller to pass all traffic it receives to the central processing unit (CPU) rather than passing only the frames that the controller is intended to receive. 
Even in promiscuous mode, an 802.11 adapter will only supply packets to the host of the SSID the adapter has joined. Although it can receive, at the radio level, packets on other SSID's, it will not forward them to the host. 
Therefore, in order to capture all traffic that the adapter can receive, the adapter must be put into "monitor mode", sometimes called "rfmon mode".

參考資料
  1. http://wiki.wireshark.org/Wi-Fi
  2. http://wiki.wireshark.org/CaptureSetup/WLAN
  3. http://en.wikipedia.org/wiki/Wired_Equivalent_Privacy