2012-04-22

[Network]ARP Spoof 怎麼防制比較好

話說,最近看到有人再徵求 PPPoE 的設備,原因只是要減少 ARP Spoof 的機會,讓我突然覺得,還是要來從原理面聊聊 ARP Spoof 是怎麼發生的………

首先,我們從 TCP/IP 4 Layer Model 以及 802.3 Ethernet 裡面的 CSMA/CD 來看 TCP/IP 在 Data Link Layer 怎麼在 Ethernet 實作的。

Ethernet 的本質,就是一個基於廣播的一個網路,所以,想像一下,我們在山谷中開研討會,然後每個主講人都拿著大聲公對著台下每個聽眾說話…………

那我們會發現,鄰近的場子,因為大聲公所以兩個場子的聽眾根本聽不清楚兩位主講人在說些什麼,其實在 Ethernet 的世界裡,也是很類似的狀況,只是,每個人手上都有自己的大聲公,外加一雙耳朵,然後還把大家眼睛矇起來,讓大家自由可以按下大聲公對群眾或對某個人發言…………

也因為廣播的特性,所以要偵測是否有人發言就很簡單了,就是張大耳朵聽。假設今天我要發言,可是我又怕跟別人同時發言,影響大家,所以我是不是可以先聽,然後發現沒有人在講話的時候,我就可以發言了………………

不過代誌沒有大家想的那麼簡單,要是這個安靜的時刻,同時有兩個以上的人開始發言,那豈不是也是一團混亂嗎?所以囉,發言的同時,也要張大耳朵,聽聽看有沒有干擾,如果有的話,表示有人跟我搶發言,那我就等個亂數個時間,再來衝一次,直到我要講的話,沒有人干擾為止…………

這就是 CSMA/CD 的由來,那…………跟 ARP 有啥關係啊?

ARP 就是幫助我們只知道對方 IP 卻不知道 MAC 的時候,來找 MAC 的通訊協定……

在 Ethernet 上,當我要跟別人溝通的時候,我會先說:「我要找XXX(Destination),我是OOO(Source),我要告訴你 Blah blah………」,不相干的人就會發現:「這不是要找我的,忽略…………」,可是要是與會人數越來越多,不同場次的人都同時要發言的時候,我可能就沒辦法確定,現在說他是 OOO 的那個人,是不是五分鐘前的那個人…………

在 Ethernet 的世界裡面,我們是採信任制,也就是說,你說你是 OOO ,所有人就認為你沒有虎爛我………然後,利用ARP來虎爛的事件就可以這樣發生了………

首先,我們如果使用 Ethernet 與不同網段的設備溝通的時候,第一件事情就是:「發 ARP 問 Gateway 的 MAC 」,如果我是壞人,我聽到 ARP Reply 之後,馬上跟著發 Gateway 是我的 ARP Reply 給發 ARP request 的人,那麼接下來在 ARP 的 timeout 之前,被虎爛的人,都會把我當作 Gateway……………然後應該就不用多說了吧?

好,那接下來我們來看看,用 PPPoE 或者是 802.1X有沒有辦法阻擋 ARP Spoof 呢?對於 PPPoE 或者是 802.1X 來說,都是類似一個 Gateway Door-Opening Protocol。也就是說,經過認證,你可以穿過進到網路裡面。用個簡單的比喻,就是我們在飛機登機門前面會看到的金屬探測器,如果身上沒有會引發金屬探測器的物品的時候,你就可以過關,但是一定保證你不是恐怖份子嗎?我想應該沒有人可以給這個答案.......

所以,看來 ARP Spoof 很難預防?是的,不過如果是有線的網路設備,可以多一點檢查,ex. 檢查是不是有人要跟我搶 Gateway?如果是,那就用 ARP Reply 搶回來?或者是要是這個Port只有一個 MAC,那就直接 shutdown 這個 port 就好啦.....

那接下來看無線的設備,我想,我必須要說,在無線網路中,只能求神保佑了…………因為就算是 AP 發現有壞人,可是,你要怎麼告訴其他 Client 你才是正牌的?且狂發 ARP Reply 只會造成無線網路接近癱瘓,那是我們要的結果嗎?我想不是的.....

所以,結論是,地球是很可怕的,能用有線就不要用無線啊…………