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 只會造成無線網路接近癱瘓,那是我們要的結果嗎?我想不是的.....

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

2012-02-03

[Linux]Ubuntu 10.04 LTS 重編 Kernel 戰記

前言

首先,要來稱讚的是 Ubuntu 這個 Linux Distribution 的出現。因為 Ububtu 的出現,所以在 Linux 上面終於有一個比較容易維運的 Distribution,不過,當然也有可能是我笨,所以學不會 ReaHat 系統要怎麼做才不會把事情越便越複雜。
不過呢,大家都知道:「Linux 的 Kernel 的預設值,往往是給正常人使用是綽綽有餘的。」可是呢?本公司有一件很討厭的地方就是:「使用者眾,所以動不動 1 台 Proxy 不夠用,多台 Proxy 分配不平均」,套具孫逸仙的話就是:「不是患貧,而是患不均」(OS:「不過你確定不是患貧也患不均嗎?」)
所以管理的前人呢,就引入的 Linux Virtual Server + keepalived,來造就 HA 的 Server Load Balancer。不過呢,因為預設 IPVS 的同時連線數只能承載 4096,所以必須要來乖乖重新 Compile Kernel。
由於本公司內部 Ubuntu Mirror Site 不 Mirror Source Package,所以,不適用透過 apt-get 安裝 source 的方式,不過,貼心的 Ubuntu 還是有考慮到這點,不 Mirror Source Package 還是可以安裝 Kernel Source 而且重新編譯 Kernel 的。

操作步驟

  1. 安裝 Ubuntu 10.04.3-LTS
  2. 更新 apt 資料庫,同時更新現有套件:
     $ sudo apt-get update
     $ sudo apt-get upgrade
    
  3. 安裝前置相關 Binary Package:
     $ sudo apt-get install fakeroot kernel-wedge build-essential makedumpfile \
            kernel-package
     $ sudo apt-get install libncurses5 libncurses5-dev libelf-dev binutils-dev
    
  4. 安裝 Kernel Package
     $ sudo apt-get install linux-source
  5. 解壓縮 Kernel Package
     $ cd /usr/src/
     $ sudo tar jxf /usr/src/linux-source-<version-number-here>.tar.bz2
     $ cd linux-source-<version-number-here>
     $ 
    
  6. 修改 Config 並重新編譯 Kernel
     $ sudo cp -vi /boot/config-`uname -r` .config
     $ sudo vim .config
     <修改CONFIG_IP_VS_TAB_BITS 從 12->16 >
     $ diff .config.old .config 
    731c731
    < CONFIG_IP_VS_TAB_BITS=12
    ---
    > CONFIG_IP_VS_TAB_BITS=16
     $ sudo fakeroot make-kpkg --initrd --append-to-version=-some-string-here \
            kernel-image kernel-headers
    < 編譯過程省略 >
    
  7. 安裝 Kernel Package
     $ sudo mkdir -p /etc/kernel/postrm.d/
     $ sudo cp /usr/share/kernel-package/examples/etc/kernel/postrm.d/initramfs \
            /etc/kernel/postrm.d/initramfs
     $ cd /usr/src
     $ sudo dpkg -i linux-image-<version-number-here>-some-string-here_<version-number-here>.Custom_amd64.deb
     $ sudo dpkg -i linux-headers-<version-number-here>-some-string-here_<version-number-here>.Custom_amd64.deb
     $ cd /boot
     $ sudo mkinitramfs -k -o initrd.img-<version-number-here>-some-string-here <version-number-here>-some-string-here
     $ sudo update-grub2
    
  8. 重新開機,安裝 LVS+ keepalived 套件
     $ sudo apt-get install keepalived
     <檢查是否有達成目標>
     $ sudo ipvsadm -L
    IP Virtual Server version 1.2.1 (size=65536)
     <以下省略>
    

以上參考自:Ubuntu 官網上的Kernel Compile文件,不過呢,因為可能組合情形太多,所以常常會搞不清楚要看那一段,所以之前重裝了N次,最後終於成功了,把結果記錄一下………