特殊事件處理篇

區域網路與 switch LACP

在區域網路內經常需要的網路服務,以及很重要的 LACP 功能!雖然有 10G 就沒這需要...

最近更新時間: 2013/04/01

假設你已經看過 Linux 私房菜的基礎學習篇伺服器架設篇, 那麼你應該會知道,架設一個在網路實體媒體分離的區域網路 (LAN) 其實不難,最簡單的作法,那就 (1)買個便宜的 IP 分享器來處理對外連線, (2)內部的 LAN 使用一個便宜的 giga hub 來串接所有的 PC 與行動裝置,一切就結束了。好開心!好愉快啊!

只是,如果 (1)你的 LAN 裡面總共會有超過 60 部以上的電腦,而且這些電腦還需要常常共享資料,因此資料傳輸頻寬非常大, 一般的 5~8 埠數的 hub 根本不夠用!那該怎辦?此外, (2)由於想要預防區域網路被惡搞,或者是需要加上一些防火牆控制參數來避免使用者在區網內誤用網路資源時, 如果考慮 IP 分享器,它根本沒辦法提供這些功能,又該怎辦?又或者是 (3)LAN 裡面有部大家都需要使用的檔案伺服器,當所有人都連上去時, 總頻寬該怎麼算?由於單張 Gb 網卡最多就只能提供 1Gbits/s 的頻寬啊!但又不想要買 10Gbits/s 的網路設備 (現階段還貴的要死),那又該如何增加有效頻寬?

這些東西在伺服器架設篇裡頭並沒有仔細說明,因為那是給一般網際網路環境使用的架構!網際網路使用的資料量並不會太龐大! 但如果是校園或企業內部強調高速傳輸的環境底下,總傳輸資料量或尖峰傳輸量可能是相當龐大的!例如近年來相當熱門的虛擬化技術就用到很多區網內部的高速儲存設備! 這時,一個仔細規劃過的區域網路就很重要啦!

鳥哥這裡並沒有談到給高階儲存設備使用的環境,因為那屬於大型企業的尺度,那種環境的網路媒體,沒有數百萬是搞不定的。 我們這邊強調的是給校園及中小企業使用的環境,包括一般校園的電腦教室或小型計算機中心的環境架構,想要高速運作網路傳輸時, 那就得要加些功夫進來,否則,你常常會發現,怎麼區域網路的傳輸速度那麼慢啊!呵呵!醒一醒吧!來用功囉!

1. 區域網路的硬體連線考慮

如果你有看過私房菜伺服器篇了,那麼區域網路的建置應該不怎麼難才對~尤其是硬體的部分,不就是透過星形連線方式,中央部分使用集線器 (hub) 或交換器 (switch) 連接各個終端設備 (指的大部分就是 PC 啦),然後在各個終端設備上面搞定好作業系統,之後在區網內搞個路由器 (router) 或 IP 分享器提供區域網路的對外連線,一切就搞定了!有啥難度的啊?

話是這麼說沒錯啦!不過,想一想,如果你的電腦數量是 60~100 台 PC,這麼大量的電腦設備要連線,現在常見的多埠數交換器,最多也不就是 24~48 port 而已,那你要買幾部?此外,switch 對 switch 又要如何連接?連接幾個 port 會比較好?需要怎麼進行 switch 設定?這些好像都應該要考慮考慮才好!

1.1 硬體、速度與 port 數量的考量

一般家庭使用的區域網路,不過是區區五、六台電腦,所以買個小型的桌上型 gigabit 交換器也就搞定了,小型 8 port 交換器不過一兩千塊就搞定了。 而且體積小也不佔空間。唯一需要考慮的,是這個交換器不要放在密不通風的地方,例如桌子底下或櫃子裡面。因為鳥哥家裡實際使用的小型 8 port gigabit 交換器,連續兩三部都因為熱當的問題導致數個 port 損毀,每個交換器大約使用 3 年就壽命終了了~沒辦法,鳥哥的機器所在的工作室,人不在的夏天沒開冷氣的情況下, 室內溫度是高的嚇人的~所以,夏天的時候,數據機、無線 AP 與交換器上方還會擺個小電風扇去吹他~電風扇再用定時器去控制~避免交換器熱當導致沒有網路可以用...

TP-Link 的 8 port 小型 switch hub
圖 1.1-1、學生推薦的,鳥哥目前在家裡用的 TP-Link 的 8 port 小型 switch hub
(圖片來源:http://www.tp-link.com/en/products/details/?categoryid=224&model=TL-SG1008D)

家庭環境還好啦,簡單就搞定了。不過一般中小型企業所在的環境就不是這麼簡單了!舉個例子來說,鳥哥服務的崑山科大資訊傳播系,系上有四間電腦教室,其中一間內部含有 61 台 PC、一部防火牆系統、一部印表機,隨便加一加就有 63 個設備,也就是說,至少得要有 63 port 的交換器才能夠處理這個環境。問題是,早期的交換器較多 port 數的通常比較貴,加上廠商認為我們可能會在交換器上面做些控制,因此採購的是 3 台 24 port 的有網管功能中低階交換器,每一台大約是一萬多塊台幣吧。 由於 3 台 switch 也需要連接,兩兩連接的結果,就佔用了 4 port 了,所以全部可用的埠數為 3*24-4=68 個,看起來,這個數量好像還夠喔!

兩款目前在本系服務的 24 port 有網管交換器 兩款目前在本系服務的 24 port 有網管交換器
圖 1.1-2、廠商規劃的,鳥哥服務的單位的兩款 24 port switch
(D-Link 圖片來源:http://www.dlink.com/us/en/support/product/...)
(ZyXEL 圖片來源:http://download.zytpe.com.tw/zyxel/support/...)

原本以為上述的規劃就夠了,因為都已經是 gigabit 的網路了嘛!但後來接觸到 DRBL+clonezilla (這個後面章節會談到),同時鳥哥之前也自己搞一套資訊傳播系自己的快速復原系統, 這些系統都是統一透過一部 server 來提供用戶端的快速復原。想一想,每一部 PC 都是向同一部 server 要資料啊,而一部 server 僅使用到一個 port, 每個 switch port 最高僅能使用 1Gbit/s 的速度,因此,60 台 PC 中,每部 PC 僅能分到 (1Gbits/s)/60=(1000Mbits/s)/60=17Mbits/s=2.1MBytes/s,要死了~如果每部 PC 同時下載一個 1GBytes 的檔案,那得要花上 (1024Mbytes/(2.1Mbytes/s))=480sec=8分鐘左右,這還是理論極限速度喔!哇!老師們隨便提供的一個作業影片,光是上傳就要死人~ 更何況是當系統需要復原時,需要傳輸的資料量通常是數十GBytes以上的資料量!所以,這樣的架構看起來是有些問題了。

我們是定位在中小企業的實作環境啊,也就是說,我們需要的是使用較少的錢可以取得較大的電腦與網路使用效益。所以,上述的環境如果要改善,有經驗的朋友當然會說, 阿全部換成 10Gbit 的網路就好了啊!那比 gigabit 的速度要再快上 10 倍呢!肯定沒問題了吧?問題是,錢錢啊! 10Gbit 在目前 2013 年的現實環境下,還是貴的要命! 而且不只交換器,連電腦的網卡都要換掉才行~這樣區網才能夠全部上 10Gbit 啊!一張 10Gbit 網卡可能比一部低階的主機還要貴了哩 (上萬塊新台幣)!那怎麼有這麼多錢錢? 所以,底下就得要來談談,有沒有比較便宜且可行的方案呢?

既然還是得要在 gigabit 的網路上面著手改良,那想一想,有沒有辦法增加 Server 的頻寬呢?舉例來說,能不能使用多張 gigabit 網卡來增加 server 的總頻寬? 如果可以用兩張網卡來處理,那不就可以增加 100% 的頻寬了 (從 1Gbits/s --> 2Gbits/s)!好棒呢!聽網路上許多前輩在說,bonding 這個技術可以使用多張網卡來綁定成為一個 IP, 如此一來,該 IP 就能夠使用多張網卡,就能夠解決頻寬問題了呢!真的嗎?當然要考慮很多方面啦!最重要的地方是,頻寬頻頸可能在 switch 對 switch 的連接處喔! 怎麼說呢?讓我們看看底下的連接範例:

沒有進行 trunk 的交換器連接方式
圖 1.1-3、一般進行網路連接時,交換器直接連接的狀況示意圖

仔細看上圖的結果喔,當有三部 PC 直接連上 B 這個 switch 時,這三部 PC 可以獲得完整的伺服器提供的三張網卡總頻寬。但如果是 A 與 C 區連接的 PC 呢?由於 A 到 B 兩個 switch 僅使用到一個埠口,因此這兩個 switch 之間最大的頻寬當然也只有 1Gbits/s 的量,所以,如果 A 區有三部 PC 要使用伺服器的資源時,你猜猜網路流量的頻頸在哪裡?想也知道是兩個 switch 間的總流量啊!那怎麼辦?能不能在兩部 switch 之間接上兩條以上的網路線啊?

後來又聽說,如果要增加兩個 switch 間的總頻寬,可以透過一個稱為 LACP 的協定來處理 (本章稍後會談到) ,當兩個 switch 想要分別使用到超過兩個以上的埠口來互連時, 如上圖的 A 到 B ,使用兩條網路線來連接這兩個 switch 時,可以透過這個協定來讓兩個埠口合成一個進行網路流通,如此一來,兩個 switch 間的流量就可以倍增了! 這真是好棒啊!那就能夠增加 A 區的 PC 連接到伺服器的總頻寬囉!

Tips 鳥哥 要注意的是,兩個 switch 不可以在沒有設定 LACP 或其他相關協定時,使用兩條以上 (含) 的網路線連接~如果你用了兩條以上的網路線串連兩部 switch, 這時就會產生 switch 內部的廣播風暴,好一點的 switch 會自動的關閉被你連接的那幾個埠口 (那幾個埠口不能使用了),差一點或者是沒有設定防堵機制的, switch 可能會熱當或者是造成連接到該 switch 的所有設備無法連線的問題喔!要注意!要注意!很嚴重!很嚴重!

由於 LACP 僅存在於有網管功能的 switch 上頭,如果你使用的是無網管功能的 switch ,那麼就無法使用 LACP,也就無法在兩個 switch 之間使用多條網路線串接了! 好佳在,當初我們系上請的廠商規劃的是有網管的 switch,那我們就可以使用多條網路線串接兩部 switch 來增加區域網路內的頻寬了嗎?當然不是!沒有這麼愉快!為什麼?

再回到圖 1.1-3 的鳥哥服務的單位的網路環境。由於我們的伺服器上頭可以接上最多 3 個對內的 Gbits/s 網路,為了讓 A, B, C 的 PC 均能夠順利的使用伺服器 3 張網卡的功能,因此每個 switch 之間我們打算使用 3 條網路線來串接。由於 switch 是兩兩成對的,因此用在連接 LACP 的埠口數將到達 12 個這麼多! 然後伺服器提供了三張網卡進行 bonding,加上一台印表機、61 台 PC 電腦,則總埠口數需求為 12+3+1+61=77 !但我們的 24 port 3 台 switch 最多僅有 24*3=72 個啦! 少了五個...所以說,預留 switch 埠口數以供未來利用有多重要了!

綜合來說,小型區域網路當然不用考慮底下的需求。但如果您的區網有超過 50 部以上的終端電腦設備,而且可能未來會考慮使用無硬碟環境、虛擬化環境, 或者是需要比較高資料傳輸的頻寬設定時,同時,你沒有錢錢購買較大型的網路設備 (10Gbits/s 之類的網路媒體),那你應該要注意:

  • 統一全區網的網路媒體到 1Gbits/s 的速度:
    還在使用 10/100 Mbits/s 的網路媒體嗎?這與 Gbits/s 的速度可是差了 10 倍喔!速度差異之大在你使用 Internet 時並沒有感覺,但使用 LAN 內部進行傳輸時, 傳一個 1GBytes 的檔案,理論極速傳輸完畢的時間分別是 80 秒與 8 秒喔!如果檔案越大,這個數值差異會越可怕!所以趕緊換成 1Gbits/s 的網路媒體吧! 其實最重要的是網路線啦!如果你的區網內還有 Cat5 的網路線,趕緊換掉他~至少也要 Cat5e 或 Cat6 以上的網路線才好喔!建議至少都得要 Cat 6 的線了。

  • 至少保留多個網路埠口與預留佈線線材 (預先設想未來可能會增加的設備):
    提到網路線就不能不說說,整個區網能夠順利運作與否,並非取決在伺服器上面,連 switch/hub 恐怕也不是主因~最重要的反而是你平時不會注意到的網路線! 雖然目前大家都喜歡使用無線網路設備,但是骨幹以及固定的終端設備總是使用網路線連結時,速度與可靠性都比較好!此外,網路線你總不會常常更換吧? 因此,檢驗一下你的區域網路,花一筆小錢將整個區網的網路線全部更換過,並且將這些網路線固定好,這些線材將可使用十年以上啊!為了避免日後一直去拆卸線材, 所以你最好預先設想某些重要設備的增加,預先留下幾個預留的線材,未來你就可以直接使用網路而不需要再拉一次線~這很重要啊!

  • 至少購買中低階的入門型網路媒體 (例如有網管的低階 switch):
    過去的服務並不需要大量的資料傳輸,不過近年以來,虛擬化、快速復原等任務,都會使用到相當龐大的網路資料量!而我們從上面也知道,龐大資料量的傳輸頻頸未來可能會出現在 switch 對 switch 之間!所以,能夠提供一些網管功能的 switch 來增加頻寬,就是一個很重要的考量因素~因此在大於 50 個以上的連接點,而你必須要有數個 switch 來串接的環境下,建議還是得要購買有網管功能的 Gbits switch 較佳!

1.2 網路連結拓樸

事實上,不同的網路使用行為產生不同的連線思考方向。如果你的環境僅是要實現大家都可以連上 Internet 的話,那麼簡單的連線即可。如果是想要在區網內部作個大流量的實驗, 那可就不能隨便連線而已,得要思考如何擴大頻寬頻頸處才行!

  • 一般辦公場合,內部尚無大量資料傳輸的需求環境:

如上個小節說的,小型區網只要星形連線中間的 switch/hub 所提供的 port 數量夠,將所有的 PC 與終端設備通通使用 cat6 以上等級的網路線連接在一起就好了! 但如果是具有比較多終端設備的環境下,就得要考慮考慮不同的方案了!上個小節鳥哥也提到我們系上的某間具有 61 台 PC 的電腦教室環境,使用了 3 台 24port switch 的環境。不過,後來我們在該教室內使用 PC 作業系統大量網路還原的機制,這就發現網路速度有點慢~因此只好將原本的網路環境稍作調整~

過去的文件都說,最好將每個小區網獨立出來,這樣除了可以克服網路封包的碰撞問題之外,管理與除錯也會變的比較方便(參考註1, 2文件)。舉例來說, 如果你所在的企業環境內部有三個部門,每個部門有大約 20 個左右的終端設備需要連線時,那麼在每個部門擺上一部 24port 以上的 switch,然後將三個部門的 switch 統一拉到公司對外的線路所在的那個 switch 上,而公司內部的伺服器也是連接到該部對外的 switch 上頭,如此就完成整個區網的連線設置。如下圖所示:

一般多個小型區網連線時的拓樸方式
圖 1.2-1、一般多個小型區網連線時的拓樸方式

上述的連接方式是比較簡單且單純的,如果你的區網內,每個員工常常有需要連線到 FTP 去下載大型檔案時,那麼這個連線的架構的頻頸將會發生在 FTP server 到 switch 這一段。 如果區網-1的內部網路中,有個特殊的服務被啟動,而區網-2的員工都得要去存取他時,那麼頻頸就會發生在 switch 到 switch 連接的那個 port 上面囉。

  • 教室內設有無碟環境或大量資料傳輸的情況--切割成數個獨立的小區網:

如果將上述的環境思考成在同一個電腦教室內呢?而且,在這個擁有 60 部電腦的教室中,若考慮統一控管電腦的作業系統,所以所有的 PC 其實內部並沒有硬碟,而是使用伺服器所提供的網路檔案系統呢?那麼上圖的連結方式就不行啦!因為效能頻頸會卡在伺服器上面的那張網卡,全部的頻寬僅有 1Gbits/s 而已。

在繼續說明之前,讓我們來作個數學吧!現在的新型桌機硬碟資料讀寫率大約在 100~150Mbytes/s 左右,至於中低階的筆記型電腦讀取效能則可能在 40~80Mbytes/s 左右。 如果我們的 PC 是無硬碟環境,因此作業系統碟的資料是來自於伺服器,PC 與伺服器之間使用的是 1Gbits/s 的網路設備,轉成檔案容量單位,則最大磁碟存取率約為 125Mbytes/s 左右, 這差不多是一般一部桌機的硬碟讀寫率。

好了,一部這樣的無碟設備是很 OK 的喔,如果是整間電腦教室 60 台電腦都使用這樣的無碟環境呢?那麼 125Mbytes/s 就得要分享給 60 部電腦,算一算喔, 平均每一部電腦能夠用到的資料量大約是 2Mbytes/s 喔!請查詢一下這個數據與一般低階筆電的 40~80Mbytes/s 數據比較看看,這 60 部電腦想要完成開機, 他開機所花費的時間是低階筆電的 20 倍以上時間喔!因為網路在很繁忙的時段將會造成更多的封包碰撞,導致網路效能低落~所以,想想看,一張 Gbytes 的網卡能夠符合我們的需求嗎?

為了改善單張 Gbits/s 網卡的困擾,台灣的國家高速網路中心所發展的 DRBL (Diskless Remote Boot in Linux, 註1) 安裝環境中,他們建議,在一間 40 部電腦的教室中, 伺服器至少得要有 4 張 Gbits/s 的網卡,每張網卡獨立分給 10 個用戶,因此分成 4 個小型區網。這 4 個區網得要分別安插在 4 個沒有串接的 switch 上面 (有網管交換器的 VLAN 功能也屬於沒有串接的環境),且這四個區網的網路 IP 網段是不一樣的 (考慮的每個區網的 NAT 與路由器設定之故)。詳細的 DRBL 建議 40 台電腦串接與 IP 網段示意如下:

DRBL + 40 clients
圖 1.2-2、DRBL 官網建議的,40 部電腦的環境底下,伺服器的連接方式

繼續來作個數學好了,上圖中,由於每個單張網卡僅負責 10 個用戶,因此每個用戶可使用的網路速度平均可達 10~12Mbytes/s 左右, 由於 DRBL 主要是提供開機時讀取資料量相對較少的 Linux 系統,因此整體的開機速度是可接受的。不過根據 DRBL 官網的說明,在這樣的環境底下, 10 個用戶同時打開 OpenOffice 這類比較大型的辦公室軟體時,得要等待數分鐘才能夠開啟完畢~雖然是比單機要慢很多,但至少是在可接受的範圍內~

Tips 鳥哥 老實說,由於虛擬化技術的成熟,目前我們常常會接觸到虛擬化的作業系統環境 (一般簡稱 VM)。就鳥哥的經驗來看,如果 VM 的磁碟讀寫效率不能到達 20 Mbytes/s ,亦即是達不到低階的筆電 40Mbytes/s 的一半性能時,那麼這個系統應該是算稍微失敗的。不過考慮到使用者經驗, DRBL 建議的每張網卡 10 個用戶,已經是很極限囉!最好是每張網卡給 5 個用戶使用,那樣的環境會較為合理些。

雖然說上述的網路連接環境可以滿足 DRBL 的需求,不過就鳥哥個人的觀點來看,實在有點不太舒服~怎麼說呢?鳥哥所服務的單位,很多老師教導的是屬於影音實務方面的課程, 得要使用到 Windows 加上 Adobe 這些較龐大的軟體怪物。由於 DRBL 暫時不支援 Windows 系統,因此,我們得要在個別的 PC 上面安裝各項所需要的軟體。 問題來了,假設老師的電腦放置於 192.168.100.0/24 的網段,那麼同網段的十個人可以很輕鬆的連結到老師端的網芳來下載老師提供的範例檔。 但是其他三個網段就沒有這個福利了!因為『網芳預設僅提供區網內的用戶端連線』而已。因此 192.168.101.0/24 之後的網段就無法使用老師的網芳了! 除非老師自行將 Windows 防火牆關閉或更改設定,否則就是很麻煩~

  • 教室內設有無碟環境或大量資料傳輸的情況--透過 switch 功能增大頻寬且放置於同一網段:

那有沒有辦法將所有的電腦放置在同一個區網內?不要再分不同網段了啦!是可以啊!不過可能需要有網管功能的 switch 協助才行喔!就如上個小節談到的, switch 對 switch 之間可以透過 LACP (下個小節會談) 的功能將幾個埠口綁在一起來加大兩者間傳輸的頻寬。

以鳥哥自己來說,鳥哥在自己的服務單位內,以一間共 61 台電腦的教室為示範空間, 裡頭擺了四部有網管的低階 switch,透過主控 switch 連接到其他三部 switch ,每部 switch 間使用 3 條網路線串接,透過 LACP 的功能,理論上可以讓每個 switch 對 server 的頻寬放大成三倍!同時 server 使用 bonding 功能安插了共 3 port Gbits/s 網卡,提高所有 PC 對 server 的總頻寬。如此一來,所有的 PC 將可以在同一個區網內, 而且頻寬方面也算是在還能接受的範圍~底下為實際連線的示意圖:

bonding + LACP
圖 1.2-3、透過伺服器主機的 bonding 加上 switch 間的 LACP 擴大頻寬的連線方式示意圖

如上圖所示,主控的 (最上方那部) switch 僅直接連接伺服器與 switch 而已,並不接受一般 PC 的連接。至於其他三部 switch 則是每部連接 20 個 PC 終端設備。 因為使用 24 port switch,所以這三部 switch 總共會花費 20+3 個埠口,就剩下一個備用的囉。其他共用設備 (印表機、伺服器等) 就都接在主控 switch 上頭, 如此一來,一般的網際網路連線,就只會經過主控 switch 與該 PC 連接的 switch,其實是有擴大頻寬的功能的。

除了擴大頻寬功能之外,這個方案與圖 1.2-2 的方案來比較,雖然封包碰撞的情況可能較嚴重,或許不利於 DRBL 的環境。但考量到目前電腦很少會沒有硬碟的狀況, 所以這個方案著重在上課過程中,除了同學間的資料分享可以具有較高的頻寬之外,所有設備都在同一個網段下,讓教學的網路環境較為單純,是比較優良的地方。

1.3 什麼是 LACP 與設定前準備

既然我們的區域網路連線需要使用到 LACP 來擴充頻寬,不瞭解一下怎麼行?所以底下就先來聊聊 LACP 吧!

  • 什麼是 LACP :(註3)

LACP 的全名是 Link Aggregation Control Protocol,中文翻譯為『鏈路聚合控制協定』,這個通訊協定可以在 switch 對 switch 之間,或 switch 對 PC 之間有連線的需求時,可連接多條實體網路線,以達到網路連線容錯以及增加兩者間頻寬的目的。

我們知道 swtich 對 switch 之間,如果沒有啟用特殊的功能,當連接兩個以上的連線時,恐怕會造成 switch 的內部廣播迴圈,導致整個 switch 或某些埠口的失敗。 因此一般 switch 對 switch 之間,僅能連接一條實體網路線。但 switch 對 switch 之間如果僅有一個埠口的連線時,由於埠口速度的關係,整體網路傳輸總量的頻頸將會產生在兩個 switch 對接的埠口上。因此,這個 LACP 協定最初發展的目的就有兩個,一個是由於有多條連線,因此連線就具有容錯功能,可以在某條連線失敗時, 兩者間的連線依舊可以透過其他存在的連線來達成。另一個就是在增加整體的網路流量傳輸率(throughput)

那麼 LACP 實際上在 switch 的連線是如何進行資料傳送的呢?其實所有的資料都會被分散在實體的 switch 間的連線中,另外,我們知道 switch,尤其是第二層的 switch 主要是針對網卡卡號 (MAC) 來進行資料的傳送,為了不要讓 switch 一直在埠口間切換同一個 MAC,因此,同一部主機所發出的連續訊框 (frame), 基本上都會透過同一個實體網路線來傳送,而不是交替在不同的網路線間傳送。舉例來說,如果有兩條對接的線,在兩邊的 switch 各有兩部主機,並且分別對另一台 switch 的主機連線。理論上,兩兩 PC 連線會透過不同的兩條實體線路連接,所以總頻寬就可以增加一倍了!當然,這是最佳的情況啦!

  • LACP 連線設定的設定模式與連線類別:

事實上,兩個 switch 間多條連線達成的設定模式有兩種,一種是靜態的固定設定 (static),一種是讓 switch 自動動態詢問的模式 (就是 LACP):

  • Static(靜態) 模式:switch 兩邊的連接埠口數量是固定的,而且需要設定成 Link Aggregation Group (LAG) 群組,且由於是靜態設定, 因此每一條實體網路線都不可以出錯,否則就會無法連線成功。

  • Dynamic(動態) LACP 模式:當 switch 兩邊都設定 LACP 模式時,兩邊埠口會透過詢問的方式來檢查是否有加入 LAG 群組,如果有的話,就達成 LACP 連線, 不然就略過 LACP 連線。

既然可以直接靜態設定好 LAG 的鏈路聚合,幹嘛需要使用 LACP 呢?這麼說好了,假設你有三條固定的 switch 間的連線加入靜態的固定設定方式, 那麼這三條線都得要同時達成連線成功,有任何一條連線失敗時,這兩個 switch 間的連線都會失敗了,因為這種方式並沒有容錯啦!那 LACP 就不一樣, LACP 可以自動詢問兩個 switch 之間的連線是否有加入 LACP 協定,若有的話就會達成連線,若是該連線失敗了 (例如線路脫落),那麼該連線就會自動脫離 LACP 的控制,以讓還存在的連線繼續運作,這就是具有容錯的能力了。

同時,動態的 LACP 模式提供兩種類別的設定,包括 active 與 passive 兩種類型,說說兩種類別的運作方法吧!

  • Active:主動類別,設定為此類別的埠口會主動的詢問連結的對口是否為 LACP (會發送 LACP 詢問訊框),若是的話,就加入 LACP 的連線管理方式;

  • Passive:被動類別,主要是可以回覆 active 的類別,並且被動的達成 LACP 的連線功能。若沒有任何 LACP 的 active 要求時, 就不會處理 LACP 的任何動作。

所以,要達成 LACP 連線,switch 兩端可以都是 active 連線,或是一邊是 active 一邊是 passive 才行!如果兩邊都是 passive 的話,那就不會有 LACP 詢問訊框產生,那麼 passive 就不會回應,自然也就無法達成 LACP 連線了。也就是說,接口兩邊至少需要有一邊是 active 類別才行!

不知道你會不會覺得很奇怪,既然兩者間的連線需要兩個埠口間的主動溝通詢問來達成 LACP 的完整連線行為,那為何需要 passive 這種類別呢? 根據 wiki 的內容說明,這是因為當 LACP 設定在 passive 類別時,即使你的環境沒有任何 LACP 的連線,你的網路就不會去回應與發出任何 LACP 的訊框,如此一來,你的網路就可以持續正常運作,也不會有任何的 LACP 訊框產生。有何好處?可以節省設定的手續啦!何解?聽鳥哥慢慢道來!

妳可以將你的 switch 設定啟動 LACP 並且啟動在 passive 類別下,那當你的 switch 並沒有任何的多條網路連線與 active 的設定,那也不會有任何的干擾!可作為預設的設定值也沒關係!當有 LACP 的 active 訊框產生時,你的 passive port 就會自動的跟對方達成連線,想想看,這樣是否就變得比較人性化些呢?有要求就連線,沒要求就保持正常工作啊!

  • LACP 的設定前準備工作:

能不能設定 LACP 還是有一些限制的,前提之下當然就是你的 switch 要支援這個協定,一般來說,switch 上面寫有支援 IEEE 802.3ad 或 IEEE 802.1ax 的, 理論上就可以支援啦!另外還有一些小細節要注意:

  • 所有作為 LACP 網路連結的元件都需要全雙工模式 (full duplex mode);
  • 必須使用相同的資料傳輸速度,例如全部都是 1Gbits/s 的速度才行;
  • 必須點對點直接連線;
  • 總頻寬為非線性增加,且由於分佈的演算法差異,通常流量分配率不太可能達到理論的 50/50 (假設有兩條實體網路線時),能夠到達 30/70 的分配率以上就很好了。

1.4 實際設定 LACP 的案例:

由於鳥哥所接觸的環境中,目前僅測試過 ZyXEL 對接的系統,以及 ZyXEL 對接到 Cisco 的 switch 系統,其中又由於 Cisco 得要使用終端介面登入 RS232 的連接環境, 所以這邊鳥哥就不列出示意圖,詳細資料可以參考文末的參考文獻 (註3) 的說明內容。底下僅列出 ZyXEL 他們家的設定, 其他廠牌的 switch 請各自參考使用手冊來設定吧!反正只要注意到幾個重點,對接的埠口號碼要對、模式要啟動成 LACP,LACP 類別要設定成 Active,這樣通常就能夠設定妥當了。

請回到圖 1.2-3 的內容,我們區網共有四台 switch,其中三台分別負責內部的 20 部電腦 (所以總量為 60 台電腦), 一台則是主幹用的。主幹 switch 必須要設定三個 LAG 群組,每個群組分別對應到一部 switch 的相對應群組。所以看起來主幹 switch 最麻煩~ 我們就拿主幹 switch 來設定給大家瞧瞧,那其他的三部依樣畫葫蘆即可完成囉!

首先,妳必須要依據你的產品手冊,找到能夠登入這部 switch 的連線方式,包括 IP、帳號、密碼等,ZyXEL 剛剛好有提供 web 介面的設定,於是我們就用瀏覽器來設定啦! 輸入正確的參數後,理論上妳會看到如下的畫面示意圖:

ZyXEL switch 的 LACP 設定示範
圖 1.4-1、ZyXEL switch 的 LACP 設定示範

如上圖所示,左上角主要有四個設定值,詳細的各項設定請參考您的使用手冊。我們主要是找出 LACP 的設定而已,因此,依據上圖箭頭所指,依序點選 1 (Advanced Application), 2 (Link Aggregation), 3 (Configuration) 號按鈕,同時請注意,因為這個 switch 的設定值已經實際在運作了,因此妳會看到上圖畫面已經有 4 個 LAG 群組!如果是您的環境,應該會看到上圖右側畫面會空空如也~依序按了箭頭之後,就會出現如下的畫面了!

ZyXEL switch 的 LACP 設定示範
圖 1.4-2、ZyXEL switch 的 LACP 設定示範

上圖是設定畫面的上半部,首先,請勾選 1 號箭頭指的位置,那是啟動 switch 的 LACP 支援的意思,這個設定項目務必要啟用! 因為這是全域設定,如果妳沒有勾選他,那麼後面的所有設定值都預設不會執行的!妳可以看到底下有四個 Group ID,這代表這個 switch 只支援最多四個 LAG 的群組而已。請選擇你需要的項目,勾選 Active 與 Dynamic(LACP) 這兩個設定值。為什麼要兩個通通勾選? 請自行參考上個小節 1.3 的介紹吧!不再贅述了!

上圖中鳥哥會四個通通勾選,是因為除了這間教室的三部其他 switch 之外,我們還另外拉了三條網路線到主控機房,因此就得要有四個 LAG 群組。 這個示意圖並不是要您全部都勾選喔!請依據妳的環境來設定即可。如果妳只有兩部 switch 要互相作為 LACP 的話,那只要勾選 T1 那一列的 Active 與 Dynamic(LACP) 即可,不必每項都勾選!注意注意喔!勾選完畢後,將畫面往下拉一些,妳會看到如下的圖示出現了:

ZyXEL switch 的 LACP 設定示範
圖 1.4-3、ZyXEL switch 的 LACP 設定示範

由於考慮到預留埠口的問題,所以我們原本是使用 9~12, 13~16, 17~20, 21~24 作為四個群組,但由於 9, 11 兩個埠口又剛好出問題~ 因此,最終我們是使用如下的埠口對應到各個 LAG 的 ID:

  • T1: 10, 12, 13
  • T2: 14, 15, 16
  • T3: 18, 19, 20
  • T4: 22, 23, 24

選擇好了每個 port 對應的 LAG 群組 ID 之後,那麼每一個 port 最後面的 30 seconds 又是什麼呢?那個是 LACP 發送檢測訊框時間啦 (Control Frame Interval)!預設應該是 1 秒鐘才對,那個檢測訊框時間,指的是 LACP 多久檢測一次實體連線有沒有保持在連線的狀態中!Wiki 是說不可以設定的太長,否則當實體連線失敗時,整個 LACP 群組恐怕會有一小段時間的連線中斷的問題。鳥哥是建議使用 ZyXEL 的預設 30 秒~ 這個時間不算太頻繁,但也不會太短暫~算很 OK 的時間囉!

Tips 鳥哥 基本的設定值就介紹到這裡,其他詳細的說明除了參考您的 switch 使用手冊之外,也可以參考文末的參考資料 (註3) 的說明! 那些文件都寫得很詳細了!可以詳細參考看看囉! ^_^

設定完畢之後,回到狀態列,妳就會看到如下圖所示的模樣!在這個畫面擷取的時候,這間電腦教室的四部 switch 是正常運作的, 所以 T1, T2, T3 就會看到設定的埠口 (Enabled Ports) 有對應到同步的埠口 (Synchronized Ports)。但第四個拉到外部的那三條線, 由於設定完畢之後,鳥哥的學生突然又重新整線,整線的時間超過了 30 秒以上,結果機房的 Cisco switch 就認定這組 LACP 完全失敗了! 根據 Wiki 的文件顯示,某些不同品牌的 switch 互相作為 LACP 時,確實會發生這樣的情況。那怎麼解決呢? 妳一定想不到!解決的方法就是,將 switch 重新設定或重新開機即可。在我們將 Cisco switch 重新開機後,嘿嘿! 整個畫面就正常了! ^_^

ZyXEL switch 的 LACP 設定示範
圖 1.4-4、ZyXEL switch 的 LACP 設定示範
  • LACP 設定完畢後的實驗結果

根據 wiki 的 LACP 文件內容說明,由於訊框在 LACP 各個實體連線之間散佈,其實整體效能並不可能有幾條網路線就提升幾倍!所以, 老實說,如果每條網路線都可以增加 50~80% 的話,那就賺到了!

為了測試整體效能,鳥哥在作好了教室內的 LACP 之後,就開了 8 部 Linux 主機來進行測試。 這 8 部主機中每 4 部串接在同一個 swich 上面,也就是說,兩部 switch (假設為 A, B) 上各有 4 部主機的意思。然後兩兩成對,A switch 上的四部主機開啟 NFS 檔案系統,B switch 上的四部主機則分別掛載了 A switch 上的不同主機的 NFS 檔案系統。接下來鳥哥這樣做測試:

  1. 基本磁碟效能測試:首先,鳥哥先在 A switch 上面的四部 NFS 主機進行 dd 一個 2GB 的大檔案測試,結果除了一部速度可達 80Mbytes/s 之外, 其他的三部大約都在 65Mbytes/s 左右。這表示網路檔案系統最大也只能到這樣的速度而已 (65~80Mbytes/s)。

  2. 用戶端單部主機的網路效能測試:然後我們到 B switch 上面的四部主機上,個別 (非同時) dd 一個大檔案到 NFS 的掛載點上面, 結果速度與上述的磁碟效能差不多 (65~80Mbyes/s)!這表示成對的兩部主機透過 switch 串接後,網路效能比磁碟效能佳,所以效能是卡在磁碟上。

  3. 用戶端全部四部主機的網路效能測試:之後將四部 B switch 上面的主機通通進行 dd 2GB 大檔案到 NFS 掛載點,結果除了一台速度可達 65Mbytes/s 之外,其他的三部平均差不多均為 40Mbyes/s 左右而已。

上面的測試中,我們大概可以看出來,LACP 的訊框分佈演算機制可能沒有這麼完美,因此沒有辦法將四部主機平均分散到三條網路線。同時,根據訊號的觀察, 三條網路線接口的閃燈,通常僅有兩條在閃爍,其中一條可能沒有被分配到,所以常常都沒有閃爍的情況...

另外,如果將四部主機同時運作的速度相加, 那麼可得到整體的傳輸效能是 65+40*3=185 Mbytes/s ,這差不多是兩條 Gbits/s 網路線的頻寬了!因為通常一條 Gbits/s 的網路線,能夠取得的傳輸頻寬達到 100Mbytes/s 就很不錯了啦!因此,上述的測試結果,還是可以看出 LACP 是有幫助的!而且, 當用戶端數量越大時,應該可以越看得出效果呢!

2. 區域網路內主控伺服器設定

談完了區網內硬體連線的方式,加上以 LACP 的手段來處理 switch 間的頻寬合併功能後,接下來我們得要談談區網內最重要的一部設備,那當然就是 NAT + 防火牆設備! 但是大家都會忘記,其實區網內還有兩個很重要的服務,那就是自動發派 IP 的 DHCP 服務以及私有領域名稱解析的 DNS 服務!咦!不是只要 DHCP 就好嗎? 不要忘記了,現在很多服務都會主動的去查詢『反解』的,因此,這個 DNS 真的很重要!不要忽略他~

另外,既然連 switch 之間的頻寬都增加了,那如果 server 還是僅有區區那 1Gbits/s 的流量,不是很可笑嗎?這時有用的 Linux bonding 技術就得要來討論討論才行呦!不過, bonding 的使用還是有限制的喔!並不是加了更多張網卡對於區域網路的速度就一定會有幫助的! 那就讓我們來談談如何使用吧! ^_^

2.1 透過 Linux bonding 技術合併多張網卡的頻寬

承接上一章的內容,在區域網路裡面,如果考量用戶端彼此之間的流量,以及整體區域網路的效能頻頸,那麼 LACP 是不可或缺的好幫手! 但是,一般企業或者是學校的電腦教室環境,還有後續章節我們會持續介紹的 DRBL 無碟環境中,其實大家存取最頻繁的應該是伺服器才對吧! 尤其是電腦教室環境中,常常需要做為用戶端復原的映象檔提供者 (Server),在大家都來取得映象檔的時刻,網路說有多忙就有多忙! 所以啦,當然就得要增加伺服器的頻寬才行啊!

增加頻寬?能不能將伺服器的網卡變換成為 10Gbits/s 呢?當然不行!因為區域網路內各網路媒體如果要達成連線功能, 那麼網路傳輸的速度必須要相同才行!如果只是將 server 的網卡改成 10Gbits/s 的情況,其他的設備通通不變,那麼這張 10Gbits/s 網卡將必須要向其他 Gbits/s 妥協,所以他的速度將會降到 1Gbits/s 來跟大家連線才行!真是浪費錢了~

那我能不能用數張 Gbits/s 的網卡組合起來,讓這些網卡的頻寬通通綁在同一個 IP 底下,這樣不就能夠放大頻寬了嗎?OKOK!這樣想才有通! 這就是 Linux kernel 裡面談到的 bonding 技術囉!

  • 什麼是 bonding ?(註4)

早期由於乙太網路卡的速度還不夠快,那如果妳的伺服器需要比較大的頻寬使用時,就得要購買更昂貴的設備才行。 那為什麼不能將幾張網卡合併成為一張來擴大頻寬呢?此外,對於重要的服務來說,網路是不能中斷的!所以,能不能使用兩條以上的線路連接到我的伺服器呢? 因此,(1)合併網路卡的頻寬與 (2)讓網路具有容錯能力 (fault tolerance) 就成了 Linux bonding 最主要的考量了!目前 Linux bonding 功能已經加入核心,所以妳只要啟動它即可!不需要額外安裝其他軟體呦!

另外得要注意的是,如果妳的伺服器想要使用 bonding 來增加合併頻寬的話,那就不能使用 hub 了!因為 hub 是共享媒體,總頻寬是不變的! 要使用 switch 才行!這樣才能夠增加伺服器的整體頻寬使用喔!不過還是有些限制的~後面會再來講一講。

既然 Linux bonding 主要的任務是將多張網卡合併頻寬或者是作為備援與容錯,那麼妳的伺服器上面當然就得要有多張網卡才行!那這麼多張網路卡組合起來使用, 到底可以怎麼用呢?這時候就得要考慮到妳想要達成什麼功能啦!底下就來談談~

  • Bonding 的模式與功能:

根據 wiki 的文件以及相關核心文件的說明, Linux bonding 共有七種模式!不過我們僅說說常見的幾種模式而已:

  • 模式 0,循環負載平衡合併頻寬 (Round-robin, balance-rr):
    Linux bonding 會將要發送的封包循序的從任何可用的網卡上面循環發送,因為是循環發送的,所以每張網卡就能夠被充分利用~ 這種模式可以提供負載平衡來合併頻寬並具有網路容錯的能力。不過,由於 switch 是會自動學習每個埠口所對應的網卡卡號 (MAC),但同一個目標的連續封包,可能會經由不同的網卡來傳送(循環傳送的方式)~這時可能會造成 switch 的誤判問題。雖然 bonding 可以處理這些問題,不過,就鳥哥的經驗來看,這種模式的負載平衡方面似乎沒有想像中的好!所以鳥哥不建議使用。

  • 模式 1,自動備援模式 (Active-backup):
    假設有三個網路卡做成這種 bonding 模式的話,那麼永遠都只有一個網路卡會運作,我們稱之為主要網卡 (primary)!除非這個主要網卡連線失敗了, 另一張網卡 (slave) 才會扶正而成為下一個主要網卡,並持續提供服務。這種模式並不會合併頻寬,只會用在連線的容錯而已。 所以如果妳想要同時合併頻寬,這種模式並不可行。

  • 模式 4,LACP 鏈路聚合模式 (IEEE 802.3ad Dynamic link aggregation):
    這種模式算是業界的標準支援吧!上一小節我們才剛剛談過 LACP,妳應該不會忘記吧?妳的 bonding 網卡啟動在這種模式下, 然後讓串接到這些網卡的 switch 埠口設定好 LACP 群組,這樣就能夠達成與 LACP 相同的頻寬倍增功能!當然啦,既然連 switch 都要支援 LACP, 所以這種模式不能用在普通的 switch 上頭~得要有支援網管且提供 LACP 設定的 switch 才行!這種模式可以同時提供合併頻寬與網路容錯! 唯一傷腦筋的,就是必須要有網管的 switch 支援才行!

  • 模式 5,自動調整傳輸負載平衡 (Adaptive transmit load balancing, balance-tlb):
    從字面上的意思來看,這種模式主要就是針對『傳送』合併頻寬所設計的,但是接收恐怕就沒有辦法做到合併頻寬了。這種模式得要分傳送與接收來說明。 在傳送方面,這種模式會將封包分散在各個可用的 bonding 網卡上送出,因此傳送才能夠達到合併頻寬。不過在接收封包時,由於考慮到 switch 的 MAC 記憶能力,因此僅有一個網卡的 MAC 會被紀錄於 switch 上頭,簡單的說,就是僅有一張網卡會用於接收!除非該接收網卡掛點, 否則其他網卡不會被用在接收上。

    因為一般伺服器就是服務提供者,主要負責餵資料給用戶,至於接收部分,又由於 switch 僅要負責一張網卡的 MAC 記憶,伺服器透過 switch 接收是相對穩定的。所以這種模式也很適合於服務提供者的角度上。但如果考慮到區域網路的雙向溝通,這種模式總覺得好像缺少了些什麼的感覺~

  • 模式 6,自動調整全負載平衡 (Adaptive load balancing, balance-alb):
    這個模式包括了模式 5,除了傳送可以合併頻寬之外,連接收也可以合併頻寬了。當伺服器要傳資料出去給用戶端時,bonding 模組會主動的攔截封包, 並透過 ARP 協商機制 (ARP 就是透過 IP 去找出 MAC 的通訊協定),將不同的網卡要送出到同一個用戶端的封包,都改寫成單一一個固定的發送端 MAC 位址, 如此一來,發送有合併頻寬的功能了,但接收卻還是只有一個 MAC 而已對吧?那怎麼說接收有合併頻寬的負載平衡機制呢?

    原因是這樣的:當有資料封包要送出到多個不同的用戶端時,此模式的 bonding 模組就會透過 ARP 協商機制,找出 bonding 管理的比較閒置的網卡 MAC 分配給下個用戶端,如此一來,不同的用戶端回傳給伺服器的資料,就可以透過不同的網卡來接收,就能達到接收也合併頻寬的功能了。

    這個模式不需要特別的 switch 支援,而且設定簡單,可以在接收、傳送都達成合併頻寬的能力,且也具有基本的網路容錯功能, 是目前鳥哥最愛使用的 bonding 模式啦!
  • 一個實際設定成 mode=6 的 bonding 範例:

讓我們回到圖 1.2-3 的環境下,所有的 switch 之間的連線已經改成 LACP 了! 這個圖示中,我們是可以使用 LACP 的 mode=4 的方式來處理 bonding,不過,鳥哥比較建議使用 mode=6 這個簡單的設定方式!效能其實沒有差很多, 設定與使用上則更簡便!圖 1.2-3 裡面的那部主機,其實是 2009 年左右的產品,裡頭僅有一張內建的網卡而已。鳥哥在上頭額外安插了三張網卡 (所以共有 4 張), 一張作為 Gateway 對外提供 Internet 連線,三張 (連同內建網卡) 則做為內部的區網環境使用。

設定 bonding 的方法其實很簡單,首先,(1)妳必須要載入 bonding 模組,且將妳的 bonding 介面取個名字,通常最常取的名字就是 bond0。 如果妳想要做成兩個 bonding 的話,那就得要有 bond0, bond1.. 依此類推。再來,(2)妳得要修改歸這個 bonding 介面管理的網路卡設定檔, 就是在 /etc/sysconfig/network-scripts/ifcfg-ethX 的檔案內容,改完之後,(3)接下來就是建立 bond0 這個新的介面的網路設定檔, (4)最後重新啟動網路就成功了!就讓我們來實際測試看看吧!

  1. 載入 bonding 模組,並將介面取名為 bond0
    在 CentOS 5.x 以後,Linux 的模組對應表已經寫入到 /etc/modprobe.d/*.conf 檔案內了~這個目錄內的檔名是可以自己取的,不過副檔名必須是 .conf 就是了。 我們取個名為 bonding.conf 的檔案好了,內容這樣寫即可:
    [root@centos ~]# vim /etc/modprobe.d/bonding.conf
    alias bond0 bonding
    # bond0 為我們需要的介面, bonding 則是 Linux 的核心模組之意!
    
  2. 修改 bond0 所管理的各個實體網卡設定檔:
    在鳥哥的這個案例中,Linux 系統的 eth0 為對 Internet 連線的介面,所以 bond0 管理的介面有 eth1, eth2, eth3 這 3 個!那這三張網卡的設定檔該如何修改呢? 很簡單,如底下這樣設定即可。(注意,被 bonding 所管理的各張網卡,習慣上,我們都會稱之為 slave 網卡!)
    [root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
    DEVICE="eth1"
    HWADDR="00:1B:21:3E:8C:47"   <==某些情況下,可能要對應好網卡卡號,才能夠讓網卡正確取得代號
    NM_CONTROLLED="yes"
    ONBOOT="yes"
    MASTER=bond0
    SLAVE=yes
    USERCTL=no
    # 最重要的是那個 MASTER 與 SLAVE 兩個設定項目。且因為是受 bond0 管理,所以不需要網路參數。
    # 至於 eth2, eth3 則是依樣畫葫蘆,這裡就不示範囉!自行修訂即可。
    
  3. 建立 bond0 新介面的設定檔:
    現在開始,這 eth1~eth3 這 3 張網卡都是歸 bond0 所管,那當然要建立一個名為 ifcfg-bond0 的網路參數設定檔囉!鳥哥目前管理的這個教室的網域參數為 192.168.42.0/24 這一段,因此這樣設定我的伺服器:
    [root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
    DEVICE=bond0
    USERCTL=no
    BOOTPROTO=none
    ONBOOT=yes
    IPADDR=192.168.42.254
    NETMASK=255.255.255.0
    BONDING_OPTS="miimon=100 mode=6"
    TYPE=Unknown
    IPV6INIT=no
    # 重點是 BONDING_OPTS 這一串!mode=6 不用談,當然就是各個模式!這裡我們用 6 ,
    # 至於那個 miimon 指的是『多久偵測一次各個 slave 網卡的連線狀態』的意思,
    # 這個值的單位是『毫秒』,就是 10 的 -3 次方秒~1000毫秒為一秒~
    # 也就是說,我們大約 0.1 秒就偵測一次每張網卡的狀態!據以進行網路容錯測試!
    
  4. 重新啟動網路與觀察 bond0 介面狀態:
    重新啟動很簡單,但如何觀察 bond0 呢?這就得要直接觀察記憶體內的 bond0 相關參數了!如下所示:
    [root@centos ~]# /etc/init.d/network restart
    
    [root@centos ~]# ifconfig
    bond0     Link encap:Ethernet  HWaddr 00:1B:21:3E:8C:47
              inet addr:192.168.42.254  Bcast:192.168.42.255  Mask:255.255.255.0
              inet6 addr: fe80::21b:21ff:fe3e:8c47/64 Scope:Link
              UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
    ....(中間略過)....
    eth1      Link encap:Ethernet  HWaddr 00:1B:21:3E:8C:47
              UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
    ....(中間略過)....
    eth2      Link encap:Ethernet  HWaddr 00:07:E9:5E:2D:76
              UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
    ....(中間略過)....
    eth3      Link encap:Ethernet  HWaddr 00:07:E9:5E:09:8D
              UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
    
    上表中觀察的重點有幾個:(1)你會看到 bond0 所使用的網卡卡號與底下的某個 slave 介面相同~這代表目前正在使用當中的網卡主要是以該 MAC 的實體網卡為主。 (2)你也會發現 bond0 的啟動資訊為 MASTER 而其他的介面為 SLAVE 的顯示!再來,我們想要看一下完整的每個網卡的資訊時,可以這樣做:
    [root@centos ~]# cat /proc/net/bonding/bond0
    Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
    
    Bonding Mode: adaptive load balancing  <== 注意到,是否為 mode 6 才行!
    Primary Slave: None
    Currently Active Slave: eth1           <== 目前以哪張網卡為主要網路服務提供者!
    MII Status: up
    MII Polling Interval (ms): 100         <== 多久偵測一次網卡連線有問題否 (單位毫秒)
    Up Delay (ms): 0
    Down Delay (ms): 0
    
    Slave Interface: eth1
    MII Status: up
    Speed: 1000 Mbps                       <== 這張網卡的速度有多快?
    Duplex: full                           <== 是否為全雙工/半雙工
    Link Failure Count: 0                  <== 這張網卡連線曾發生過幾次錯誤?
    Permanent HW addr: 00:1b:21:3e:8c:47
    Slave queue ID: 0
    
    Slave Interface: eth2
    MII Status: up
    Speed: 1000 Mbps
    Duplex: full
    Link Failure Count: 0
    Permanent HW addr: 00:07:e9:5e:2d:76
    Slave queue ID: 0
    ....(底下省略)....
    
    如果你可以看到上面的訊息顯示,那就表示你的 bonding 已經開始順利運作了!接下來你就可以 (1)開始在用戶端同時連線到這部主機來測試看看,到底頻寬的增加有多少囉! 並且可以 (2)拔除某一條網路卡上面的線路,再來查詢一下 /proc/net/bonding/bond0 這個檔案內的變化,看看能不能有容錯的情況發生啊!^_^
  • bonding 的使用限制:

雖然說 Linux bonding 有很多好處,但是它並不是萬靈丹!某些場合底下還是無法增加頻寬的!很多文件都沒有寫到這點,或者是雖然有帶到,但是卻沒有特別強調! 因此,鳥哥一開始利用 bonding 來增加虛擬機器的頻寬時,曾經遭遇到非常多的問題,導致有一陣子有點厭惡 bonding 哩~就是沒有搞清楚的原因啦! 那就來讓大家搞清楚一點好了!來看看吧!

  • 連接的網路媒體必須使用 switch 不能使用 hub:
    這是因為 hub 是共享頻寬,只有 switch 才具有每個埠口獨立頻寬的功能!另外,除了 mode=4 的 bonding 需要用到支援 802.3ad (LACP) 協定的有網管 switch 之外,其他模式的 bonding 都可以使用無網管低階的 switch 來達成喔!

  • 兩部主機之間,只會有一個 NIC 有作用:
    想像一個狀況,你有兩部主機需要很頻繁的進行網路交換,因此需要超高頻寬!那我能不能在兩部主機上面都安裝三張網卡,然後將各自的三張網卡都做成 bonding 合併頻寬, 讓兩部主機之間可以透過各自的一個 bonding IP 來達成流量的倍增呢?答案是『不可能!』因為不論是 LACP 還是 bonding ,主要還是透過乙太網路的 MAC 來進行收發! 因此,兩者之間最多還是僅能透過一張網卡來進行接收~所以,這種 bonding 行為只能增加容錯的好處,並無法增加頻寬喔!很多文件這點都沒有寫好, 害鳥哥之前花了好幾個月去測試這東西~結果是『杯具』啊!準備喝茶去 @_@~

  • 針對 Internet 的服務而言,頻寬卡在對外的傳輸,因此 bonding 不會有合併頻寬的好處:
    如果考慮你的伺服器主要是針對 Internet 提供服務,那麼由於你的伺服器還是得要透過網際網路來傳送~而網際網路的速度應該不可能超過 Gbits/s 的速度! 加上你的 Gateway 通常也只是 1Gbits/s 的速度而已,因此針對 Internet 所設計的 bonding 僅有網路容錯的功能,合併頻寬在現階段應該是不可能達成的! 也就是說, bonding 通常僅使用於區網或者是需要大頻寬的內部網路,不會用在 Internet 上。

  • Bonding 不見得會增加傳輸量,需考慮伺服器的檔案系統:
    如果你的伺服器主要是針對區網提供用戶端映像檔的存取,而你的磁碟機並沒有使用較新的機制,因此最快的效能僅達到 80Mbytes/s 的速度時,那麼 bonding 對你的系統來說, 並沒有什麼幫助!因為用戶端透過網路到你的系統後,你還是得要從自己的伺服器將資料讀出來才能傳出去!但讀取的速度就已經受限於 80Mbytes/s (還不到 1Gbits/s 呢!), 所以 bonding 當然只有容錯而沒有增加頻寬的可能性!也就是說,如果用在磁碟 I/O 很頻繁的主機狀態,則速度的頻頸將會發生於磁碟讀寫上而不是網路。

  • 虛擬化所附掛的橋接 (bridge) 網卡,不建議使用 bonding:
    所謂的虛擬機器,指的是讓你的 Linux 透過類似 KVM 的軟體在你的系統上模擬出一個獨立的硬體主機,這個虛擬的獨立的硬體主機當然就得要分享你的實體硬體囉。 由於一部實體主機可以產生多部虛擬機器,過去鳥哥以為,那麼透過 bonding 來做成分享給虛擬機器使用的網路橋接器之後,那虛擬機就可以增加頻寬的使用量了。 結果非常『杯具』 (又喝茶去)~

    因為 bonding 常常會去改變 MAC ,其中 mode 6 甚至會去分析與變更 MAC,如此一來,虛擬機器的虛擬 MAC 將會附掛於變更後的網卡上~ 但是實體主機的 bonding 並不會去調整虛擬機器的虛擬網卡卡號,這時就會造成時通時不通困擾~雖然使用 mode 5 等其他類型可以克服這個問題~但是,對於同時的收/發來說, 就沒有兩者均增加頻寬的功效。因此,對於虛擬化附掛的橋接設備 (bridge) 來說,bonding 最好不要使用,鳥哥的經驗是『很容易出問題』。

另外,鳥哥用過最簡單而且效能最好的應該是 mode 6 這個模式!簡單好用,又不用重新設定 switch,缺少網卡就疊上去,非常簡單! 所以,有興趣的伙伴們,可以使用這個模式來製作一下,應該可以得到不錯的效果呦!

  • 用於 bonding 上面的 GB 網卡介面選擇與效能測試:

我們知道 gigabit 網路卡的理論極限速度可以到達大約 120Mbytes/s 的檔案傳輸量。不過,由於 gigabit 網路卡設計的插槽介面的差異,速度落差非常大喔! 鳥哥去年 (2012) 為了研究上面的需求,又因為要買比較便宜的 GB 網卡 (沒有錢作大量研究啦),因此購買了數十張的 Intel PCI 介面的網卡,原本想說,PCI 的傳輸率為 32bit * 33MHz => 1000 Mbits/s ,這與 GB 網卡的速度應該是差不多才對!沒想到實際應用之後,可能 PCI 介面的傳輸已經快要飽和, 所以測試出最快的 PCI 傳輸率大約只到 70Mbytes/s 而已,與理論值也差太多了...

後來還是為了經費,所以還是買了比較便宜的 PCI-E 1X 一倍數的網卡,只是沒想到,這個 PCI-E 的 GB 網卡 (用的是螃蟹卡晶片組) ,效能隨隨便便就可以上 90~100 Mbytes/s,與 Intel 的 PCI-E 1X 的 105~110 Mbytes/s 差異沒很大,但跟 PCI 介面也差太多了!因此,建議如果想要使用 bonding 時,最好所有的網卡速度能夠差不多比較妥當!不要使用 PCI-E, PCI 介面混插,不然好像效果會沒很好,因為這與 bonding 的主控 slave 網卡找到哪一張有關~

那怎麼測試效能呢?過去鳥哥都習慣使用 NFS 然後一堆用戶端掛載伺服器後,用力的 dd 下去!後來發現,這樣的測試方法不太準確,因為都卡在磁碟的效能上~測不出網路效能。 因此,如果想要測試 bonding 到底有沒有效果,你可以這樣實驗看看:

  • 先在做好 bonding 的那部伺服器上面,使用 dd 建立一個大約 2GB 的大檔案 (dd if=/dev/zero of=somefile bs=1M count=2048) ;
  • 將上述建立檔案的目錄,使用 NFS 分享出來給區域網路用戶讀取;
  • 開啟至少三部 Linux 用戶端,並且掛載剛剛來自伺服器的 NFS 目錄;
  • 跑到掛載點,利用『 dd if=somefile of=/dev/zero 』指令,測試一下網路速度。

這個測試中,因為伺服器的大檔案僅提供用戶端讀取,並沒有寫入。如果你的記憶體夠大 (超過 4G 以上),這個檔案將被記憶體快取住!此時,所有傳輸將不會再次的讀取硬碟了。 而你在用戶端使用 dd 讀入大檔案後直接丟入垃圾桶 (/dev/null) ,這樣用戶端也沒有用到磁碟讀寫,如此就可以單純的去測試網路效能了。

在鳥哥的測試中,四部主機同時跑時,由於鳥哥用了三 GB 網卡作 bonding,此時將會有兩部主機共用一張網卡,所以有兩部主機速度可達 80~90Mbytes/s,另外兩部僅能到達 60Mbytes/s 而已。 不過,這樣也差不多有 70~80% 的理論速度啦!還算很 OK 的啦!

2.2 NAT 伺服器 (IP 分享功能) 與防火牆設定

整理完伺服器與區域網路內的網路頻寬問題後,再來就是得要處理處理區域網路內的整體網路參數啦!在鳥哥本章的案例中,我們用的是圖 1.2-3 裡頭的環境,因應該環境所在的教室編號,所以鳥哥使用的是 192.168.42.0/24 這一段私有網域啦!在鳥哥的習慣上,會使用最後一個可用 IP 作為路由器設定,因此,鳥哥這部伺服器對內的 IP 就會是 192.168.42.254 囉。另外,本教室對外的那個 IP 我們就假設為 1.2.3.4/24 ,Gateway 就設為 5.6.7.8 (詳細的對外 IP 就得要詢問貴中心囉)。

另外,在伺服器架設篇當中,我們提到通常區域網路的主控電腦防火牆中,對內部的主機管理會比較鬆散,對外則比較嚴格。不過,由於這是個電腦教室環境,啥時會有人來惡搞,你也不知道, 也就是說,對內的防火牆設定恐怕也得思考才行!不能隨便通通放行的!底下我們就來談一談吧!

  • 網路參數設定:

其實網路參數設定在本案例中,就僅有 eth0 與 bond0 需要設定而已,其中 bond0 已經在前一個小節裡面談過了。至於 eth0 這個對外的 IP 設定,你只要注意到 IP, Netmask, Gateway 必須要跟你的 ISP 取得正確的資料來設定即可,並沒有什麼難處啊!不過這裡得要特別強調一下,希望不要啟動 Network Manager 這個網路管理模組, 否則常常會出現一些奇奇怪怪的問題喔~

# 1. 先設定好 ifcfg-eth0 設定檔吧!ifcfg-bond0 請參考上一小節的設定:
[root@centos ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
HWADDR="00:26:18:C3:7D:21"
NM_CONTROLLED="yes"
ONBOOT="yes"
IPADDR=1.2.3.4               <== 重點是改這三行!
NETMASK=255.255.255.0
GATEWAY=5.6.7.8

# 2. 設定好 DNS server 的設定:
[root@centos ~]# vim /etc/resolv.conf
nameserver 120.114.150.1     <== 先用教室所在處的崑山科大的 DNS 伺服器!這未來會變喔!
nameserver 120.114.100.1

# 3. 關閉 Network Manager 之後,重新啟動網路並觀察:
[root@centos ~]# /etc/init.d/NetworkManager stop <== 立刻關閉
[root@centos ~]# chkconfig NetworkManager off    <== 重新開機也不會啟動
[root@centos ~]# chkconfig NetworkManager --list
NetworkManager  0:off   1:off   2:off   3:off   4:off   5:off   6:off

[root@centos ~]# /etc/init.d/network restart
[root@centos ~]# ifconfig            <== 看 IP/Netmask 對否
[root@centos ~]# route -n            <== 看 GW 對否
[root@centos ~]# ping -c 3 5.6.7.8   <== 看與 GW 的連線正常否
[root@centos ~]# dig www.google.com  <== 看 DNS 設定正確否
# 建議上面的檢查步驟請每次設定完網路且重新啟動後,一定要進行一次!避免出現問題啊!
  • 系統初步安全強化整理 -- 更新!更新!更新!關掉!關掉!關掉!

還記得伺服器篇裡面說過嗎?針對你開放的網路服務來說,防火牆其實一點用處也沒有~那如何強化你的網路服務呢?最簡單的想法就是『更新到最新版本!』 雖然對某些強調酷炫的 Linux distribution 來說,升級到最新的版本不見得是有修補漏洞的結果,但針對企業版的 CentOS 來說,更新到最新版,確實就有一定程度的保護力。

考慮到中小企業對外網路頻寬可能原本就不夠啊,因此,找一個最靠近你的映射站是很重要的!以崑山科大來說,我們學校有提供 FTP 服務,且 FTP 裡面就有 CentOS 的映射資料了!當然就選擇校內的網址為優先!如果你是非崑山校內的機器,那就建議使用國家高速網路中心的 FTP 囉!

# 如果是在崑山科大校內,那就使用校內的 FTP 伺服器了:
[root@centos ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/6/os/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[updates]
name=CentOS-$releasever - Updates
baseurl=http://ftp.ksu.edu.tw/FTP/CentOS/6/updates/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
# 建議就保留這兩個,其他的都先殺掉或者是加上 enabled=0 的設定來暫時不使用!

# 如果不在崑山科大,但是在台灣本島,那就使用國家高速網路中心吧!
[root@centos ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ftp.twaren.net/Linux/CentOS/6/os/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

[updates]
name=CentOS-$releasever - Updates
baseurl=http://ftp.twaren.net/Linux/CentOS/6/updates/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

# 選擇好你的 YUM 軟體倉儲來源後,開始更新系統啊!依據 CentOS 版本不同,速度會有差異!
[root@centos ~]# yum clean all
[root@centos ~]# yum -y update
# 開始一堆升級程序!這裡鳥哥就略過不寫了!

[root@centos ~]# vim /etc/crontab
10 0 * * * root /usr/bin/yum -y update  <== 每天凌晨 12 點進行一次自動更新!!

更新了軟體之後,還得要記得,不用的軟體最好將他關掉!不但節省系統資源,也能夠避免某些忘記關掉的網路服務被攻擊!那麼哪些服務可以關閉呢? 這就得要看您的環境而定了,並沒有一定的規範~不過,鳥哥通常喜歡用『 netstat -tlunp 』這個指令來查出目前有啟動於 TCP/UDP 監聽的服務, 然後再去 /etc/init.d/* 找到相對應的啟動腳本,進入該腳本去查詢該功能為何,如果該功能真的不需要,那就予以關閉,如果不知道是啥咚咚,通常會先保留啦!

[root@centos ~]# vim close_service.sh
#!/bin/bash
services="NetworkManager autofs avahi-daemon certmonger cups kdump rpcbind rpcgssd rpcidmapd nfslock"
for service in ${services}
do
        chkconfig ${service} off
        /etc/init.d/${service} stop
done
# 將不需要的服務一個一個關掉~請依您的需求寫入上頭的 services="" 雙引號內即可!
# 完全照上面的抄寫時,可能會有某些不存在的服務,發生一些錯誤也沒關係~

[root@centos ~]# sh close_service.sh

在更新系統完畢且關閉不必要的服務後,如果你從來沒有更新過,或者是好長一段時間忘記更新了,那可能就得要重新開機 (reboot)!原因是, 你的系統核心可能已經被更新過,核心升級一定要重新開機才能選擇新核心,否則升級的核心是不會被使用的!這與一般軟體不太一樣喔!注意注意!一般來說, 更新完畢後如果有:(1)核心與 (2)重大軟體函式庫 (例如 glibc, openssl 等軟體) 時,就一定要重新開機!否則呼叫這些函式庫的軟體並不會使用新的函式庫功能之故!

  • 伺服器服務規劃與防火牆設定:

前面稍微提到,我們的重點是想要讓這部伺服器針對內網提供一堆服務~不過又擔心被內網的使用者搞破壞~所以,針對 Internet 應該要嚴格限制, 但對於內部網路而言,還是僅開放要讓使用者連線的服務之埠口即可!沒必要全部放行啦!我們這部伺服器『並不針對 Internet 放行任何服務』,不過, 由於管理者可能會從另一段區域網路連進來,因此可能還是得要設定信任 IP 給網際網路連進 port 21, 22, 80 來進行測試才行啊!預計的伺服器對內、對外服務以及信任 IP 分別是:

  • 信任 IP 與網段: 1.2.3.4/24, 4.3.2.1/32
  • 對信任網段 (eth0) 放行的服務主要有: port 21, 22, 80 而已;
  • 對內網而言 (bond0) 規劃未來放行的服務有: DNS, DHCP, TFTP, NFS, SSHD, Proxy 等服務,其中 NFS 透過該服務自己的內部設定,規定 port 901~904 來放行各相關服務。
  • 對內網而言 (bond0) 還得要開放向外部聯網的功能 (SNAT)

針對上述功能,鳥哥拿伺服器架設篇的簡易防火牆來進行修改,並將整個腳本再簡化,得到如下的結果:

[root@centos ~]# vim iptables.sh
#!/bin/bash
# 先設定好本腳本所需要的各項參數:
nic_out="eth0"                 <== 對外部連線的網卡代號
nic_in="bond0"                 <== 對內部連線的網卡代號
trust_ip="1.2.3.4/24,4.3.2.1"  <== 來自外部連到本伺服器的信任 IP

# 底下 6 行在清除規則與設定預設防火牆政策
iptables -F
iptables -X
iptables -Z
iptables -P INPUT   DROP
iptables -P OUTPUT  ACCEPT
iptables -P FORWARD ACCEPT

# 底下三行放行伺服器本機所需要的網路封包
iptables -A INPUT -i lo -j ACCEPT 
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT

# 底下數行是針對內網開放各式服務!請參考上述說明,就知道這幾個 port 的意義為何了!
iptables -A INPUT -i ${nic_in} -p tcp -m multiport --dport 21,22,53,80,3128 -j ACCEPT
iptables -A INPUT -i ${nic_in} -p udp -m multiport --dport 53,67,69 -j ACCEPT
iptables -A INPUT -i ${nic_in} -p tcp -m multiport --dport 111,2049,901:904 -j ACCEPT
iptables -A INPUT -i ${nic_in} -p udp -m multiport --dport 111,2049,901:904 -j ACCEPT
iptables -A INPUT -i ${nic_in} -p udp --dport 9000:9001 -j ACCEPT
iptables -A INPUT -i ${nic_in} -j REJECT  

# 針對外部來的信任 IP 網段之設定!
iptables -A INPUT -i ${nic_out} -p tcp -m multiport --dport 21,22,80 -s ${trust_ip} -j ACCEPT

# 清除內部要連到外網的 SNAT 功能!並設定好 IP 偽裝,後面幾行則是保留給未來使用的!
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
iptables -t nat -P PREROUTING  ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT      ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.42.0/24 -o eth0 -j MASQUERADE
#iptables -t nat -A PREROUTING -s 192.168.42.0/24 -p tcp --dport 80 -j REDIRECT \
#                --to-ports 3128
#iptables -t nat -A PREROUTING -i ${nic_out} -p tcp --dport 8080 -j DNAT \
#                --to-destination 192.168.42.40:80

/etc/init.d/iptables save   <== 這行加上去,自動儲存防火牆規則!

[root@centos ~]# sh iptables.sh
[root@centos ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
# 找到上面這行,將內容加上兩個可以讓 FTP 順利運作的模組呦!

[root@centos ~]# /etc/init.d/iptables restart

# 不要忘記還得要啟動核心轉遞的規則才行呦!
[root@centos ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1   <==將這一行的 0 改成 1  即可!

[root@centos ~]# sysctl -p

這樣就整個處理完畢囉!有夠好簡單吧! ^_^!不過由於你開放內網與信任網段的 ssh 連線,這裡鳥哥也是要建議您,/etc/ssh/sshd_config 這個設定檔中, 針對 root 是否可以登入的項目部分,最好是設定為 no,不讓 root 登入為宜喔!

2.3 DHCP 伺服器與 switch 的 STP 協定設定

區網的硬體網路頻寬搞定、伺服器本身的網路參數搞定,再來要幹嘛?當然是區域網路內部用戶端的網路參數分派啦!用戶端取得的網段為 192.168.42.0/24, 至於 Gateway 則是伺服器本身內網的 IP (192.168.42.254),那 DNS 呢?

大家知道,很多軟體都會去反向檢查 DNS 的反解~我們知道 192.168.42.0/24 是私有 IP 的網段,因此,當有內部網路連線的需求時,如果沒有加上反解的確認, 在達成連線的時間會比較久~為解決這問題,因此鳥哥的伺服器也會提供 DNS 的服務,因此,用戶端取得的 DNS 也是咱們這部伺服器的 IP 喔!

  • 固定 IP 與非固定 IP 之規劃:

老實說,這件示範教室還挺有趣的,因此很多會議或研習都會在這裡舉行,因此,很多時候,伙伴們都會攜帶筆電或者是其他行動裝置來這裡上網~一聽到這種模式,當然 DHCP 自動分配 IP 是最簡單的!不過,由於這間教室平時是電腦教室課程來上課的,老師們喜歡固定座位有固定的 IP,這樣也比較好管理啊!也就是說,這間教室在桌上型電腦的部分, 希望是固定 IP 的分配,但是額外還會提供一些 IP 來給行動裝置使用的。

鳥哥的規劃是,自動分配的是 192.168.42.101~192.168.42.200 這 100 個可用 IP,至於 192.168.42.1 到 192.168.42.100 則保留給教室內的固定終端設備使用。 但這間電腦教室共有 62 個裝置ㄟ!包括 61 部主機以及一部印表機。如果要每部主機都去登記網卡的 MAC 再來伺服器設定 dhcp 設定檔,真的很頭昏~因此,固定 IP 的部分, 我們透過的方式,是先去用戶端電腦啟動一個 Linux 系統,將該 Linux 系統手動設定 IP (ifconfig eth0 192.168.42.X),然後透過 ARP 的指令去偵測 IP 與 MAC 的對應, 最終寫入設定檔即可。這樣可以避免抄錯卡號,在實作上面也比較能夠相信實際座位與主機 IP 的對照表!

在你完成後面幾章才會談到的 kickstart 大量部署 Linux client 端作業系統後,教室內每部電腦都會有一個可用的 Linux 系統,登入他,用上述的方法實作, 然後執行下列的功能來取得每部電腦的 MAC 吧!

[root@centos ~]# vim getmac.sh
#!/bin/bash
read -p "How many PC's in this class (31, 54, 61)? " num
if [ "$num" != "" ]; then
        for site in $(seq 1 ${num})
        do
                siteip="192.168.42.${site}"
                allip="$allip $siteip"
                ping -c 1 -w 1 $siteip > /dev/null 2>&1
                if [ "$?" == "0" ]; then
                        okip="$okip $siteip"
                else
                        errorip="$errorip $siteip"
                        echo "$siteip is DOWN"
                fi
        done
        [ -f getmac.conf ] && rm getmac.conf
        for site in $allip
        do
                pcname=pc$(echo $site | cut -d '.' -f 4)
                mac=$(arp -n | grep "$site " | awk '{print $3}')
                echo "  host $pcname {"
                echo "          hardware ethernet ${mac};"
                echo "          fixed-address     ${site};"
                echo "  }"
                echo "  host $pcname {"                         >> getmac.conf
                echo "          hardware ethernet ${mac};"      >> getmac.conf
                echo "          fixed-address     ${site};"     >> getmac.conf
                echo "  }"                                      >> getmac.conf
        done
else
        exit 0
fi
echo "You can use getmac.conf (this directory) to modified your /etc/dhcp/dhcpd.conf"
echo "Finished."

[root@centos ~]# sh getmac.sh
How many PC's in this class (31, 54, 61)? 4
  host pc1 {
          hardware ethernet 52:54:00:ac:30:56;
          fixed-address     192.168.42.1;
  }
....(底下省略)....
You can use getmac.conf (this directory) to modified your /etc/dhcp/dhcpd.conf
Finished.

最終你會在該目錄中取得一個名為 getmac.conf 的檔案,將裡面的資料貼上 dhcpd.conf 即可。但是,dhcpd.conf 內容要怎麼製作呢?我們用最陽春的方式來設定他! 而且,預計每部主機的名稱會是 pcX.i4502.dic.ksu ,其中 i4502 就是我們這間電腦教室的編號!

[root@centos ~]# yum -y install dhcp
[root@centos ~]# vim /etc/dhcp/dhcpd.conf
ddns-update-style       none;
default-lease-time      259200;
max-lease-time          518400;
option routers          192.168.42.254;
option broadcast-address        192.168.42.255;
option domain-name-servers      192.168.42.254;
subnet 192.168.42.0 netmask 255.255.255.0 {
        range 192.168.42.101 192.168.42.200;
        option subnet-mask      255.255.255.0;
        option domain-name      "i4502.dic.ksu";
  # 從這行底下的,都是剛剛 getmac.conf 的內容抓過來使用的!
  host pc1 {
          hardware ethernet 52:54:00:ac:30:56;
          fixed-address     192.168.42.1;
  }
....(中間省略)....
}   <== 不要忘記這個大刮號!

[root@centos ~]# /etc/init.d/dhcpd restart <== 立刻啟動
[root@centos ~]# chkconfig dhcpd on        <== 下次開機也會啟動
[root@centos ~]# vim /var/log/messages     <== 重點是看一下登錄檔有沒有順利啟動

你沒有看錯喔!這樣就結束了!更多 DHCP 相關的介紹,請參考伺服器篇的相關內容吧!

  • 用戶端延遲 DHCP 取得網路參數的時間問題 -- 什麼是 STP?

如果你真的很有伺服器課程的經驗時,那偶而可能會發現,在比較高階 switch 的教室環境中,介紹如何自動取得 DHCP 網路參數的課程時,讓學生重新取得 IP 的速度怎麼會這麼慢? 大概得要等個十幾秒到半分鐘左右!怎麼會這樣?明明都是 gigabit 的網路速度了!不可能這麼慢吧?其實,這是由於 switch 為了要避免某些呆瓜不小心讓 switch 之間連線錯誤, 導致迴圈 (loop) 來造成廣播風暴,最終讓整個區網的網路停止的問題,而增加的 STP (Spanning Tree Protocol) 這個通訊協定的問題。

我們在前面的小節裡面談到 LACP 之前,曾經說過,有兩部 switch 之間如果沒有做好一些通訊協定的設定,直接拿兩條網路線同時串接起來,switch 之間可能就會產生廣播風暴, 造成整個 switch 的停頓。那個廣播風暴的成因就是 switch loop (交換器內部封包迴圈問題)。那你會說,好!我知道了,為了避免這個問題,每個 switch 之間都最多串接一條線就好! 這樣總不會出問題了吧?很可惜,還是會出錯!怎麼回事?找個案例好了,如下圖所示:

swith loop
圖 2.3-1、交換器的廣播迴圈問題 (switch loop)

每間電腦教室都已經串接在一起,主要透過教室 A 來跟其他兩個教室的 switch 串接。有個同學來這個環境後,想說,那我能不能直接將教室 B 與教室 C 串在一起, 實體線路串在一起比較快嘛!所以,拿了條網路線就直接串在一起啦!如上圖所示的環境。這時,有沒有看到一個圈圈啊!這就形成一個迴路 (Loop)!這個時候就會產生廣播風暴了! 沒有人是故意的!問題是,如果線拉的夠長,就有可能會出現這個情況啊!理解乎?

為了解決這個問題,因此,國際組織就核定了 STP (Spanning Tree Protocol) 這個通訊協定!這個通訊協定的目的,就是在於解決 switch loop 的問題! 透過的解決方式是:『讓產生 loop 的埠口中,找出最無關緊要的那條線,讓那條線中斷 (down) 』就解決了!但這裡就產生幾個問題要處理:

  • switch 是如何判斷有沒有 loop 迴圈產生的呢?其實有支援 STP 協定的 switch 會發送一個名為 BPDU (Bridge Protocol Data Units) 的封包,這個封包就會主動的去偵測每個埠口, 以及鄰近的幾個 switch 之間的溝通狀況,透過這些狀況去瞭解有沒有產生非預期的 loop 狀態,並同時去尋找出『最不重要的』那個連線;

  • 那如何判斷『最不重要的』那條連線呢?其實在 STP 的協定中,他會透過 STP 協定主動設定 stwitch 的優先權 (Priority, 數值越小代表越重要),若沒有設定的話, STP 會透過 switch 的卡號 (MAC) 自動設定好最重要交換器 (root switch),然後如果有 loop 的狀態時,就以這個 root switch 為主,每個 switch 都必須要可以連接到 root switch ,並藉此找出連接到 root switch 的最快路徑,保留該路徑,然後將其他非重要路徑關閉!

更詳細的 STP 相關介紹可以參考文末的參考文獻的資料,這裡不再重複。你要問的問題是,那為何 STP 會影響 DHCP 呢? 由於 switch 會偵測 switch 之間是否有產生 loop 的情況,因此當你在某個埠口安裝一部主機後,這部主機的網路使用權大約得花 30 秒鐘才能夠啟動。 那當你重新取得 IP 時,某些 swtich 就有可能誤判你這個 switch port 有重新被調整過,為了避免 loop,於是他就進入檢測狀態,一般得要花 30 秒鐘才能夠偵測完畢啊!

所以,為了節省不必要的等待時間,你可以:

  1. 保留 STP 給設定為 LACP 或尚未接上設備的埠口,其他的已經接上電腦的埠口,建議就關掉他;
  2. 如果不想隨便關掉 STP 的話,那可以修改一下 STP 的收斂時間,讓 STP 的檢查速度加快~也能夠處理掉這個 DHCP 延遲的問題;
  3. 如果是比較新的交換器,或許可以設定為快速 STP (Rapid STP) 模式,這樣可以在 10 秒內檢測完畢,就不會有很嚴重的 DHCP 延遲問題囉!
  • 一個簡單的 switch STP 設定處理方式:

如同在 LACP 設定的小節裡面談到的,鳥哥管理的這間電腦教室目前使用的是舊式的 switch,過去全部的埠口都啟用 STP 的預設設定時,dhcp 的延遲非常嚴重! 很多同學甚至會發生 DHCP timeout 的慘劇,導致無法取得 IP 來進行上課!這真是非常的杯具啊~(喝茶去)~後來問了崑山科大計中的羅豐彬組長,這才發現有可能是 STP 這玩意兒的影響! 相當感謝羅組長大人的提醒啊!

之前我們是將 STP 整個關閉的,不過,STP 既然可以避免 switch loop 的狀況,那,在做成 LACP 的那幾個埠口,應該還是開啟一下 STP 比較好!同時, 為了降低 DHCP 的延遲,因此鳥哥將整個 STP 的收斂時間設定的比較短些,因此目前 DHCP 的 IP 參數取得,大約是在 10 秒鐘內可以順利完成!算是可接受的範圍內啦! 底下還是使用 ZyXEL 的交換器來作個簡單的示範吧:

STP
圖 2.3-2、ZyXEL 的交換器設定 STP 示意圖

如上圖所示,按下 1 號箭頭『 Spanning Tree Protocol 』的設定後,再按下右上角的『 Configuration 』進入設定環境中!如下圖所示:

STP
圖 2.3-3、修改 STP 的收斂時間

為了避免用戶端電腦透過 LACP 的線路向 server 要求 DHCP 服務而有延遲現象的狀況,所以我們是將這個 STP 的許多收斂時間整個縮小了!基本上,Hello Time 保留 2 秒鐘, Max Age 則從 20 秒修訂為 7 秒,Forwarding Delay 則由 15 秒縮減為 5 秒,這樣的設定完成之後,用戶端取得 DHCP 的時間可大幅的從 timeout 的悲劇性狀況, 變成小於 10 秒內完成的可接受範圍內。這個是整體設定,那設定僅將 STP 開放於 LACP 埠口上的情況,就得要針對每個埠口來調整,如下:

STP
圖 2.3-4、僅將 STP 啟動在有設定 LACP 的埠口上

如上圖所示,我們僅針對有設定 LACP 的埠口作 STP 的設定而已。其實如果修改了上面的時間參數,全部的埠口啟動應該也還 OK 沒問題~ 不過如果沒有調整 STP 的收斂時間,那你的 DHCP 恐怕會很慢!

Tips 鳥哥 會發現這個問題,是因為鳥哥管理的電腦教室都會使用到 PXE (後面章節會談到) 的相關功能,就是透過網路卡開機取得網路參數後,讓主機自動安裝或進行其他任務的方式。 但是每次開機等待 DHCP 的時間常常會 timeout,這才到處詢問專家!才有後來羅組長的說明!感謝呢! ^_^

2.4 與 DHCP 參數相符合的 DNS 伺服器設定

區域網路的 DNS 設定那就簡單了!重點是你務必要有正解與反解~因為『反解』才是我們要作內部區網 DNS 的主要原因啊!再重複一次我們預計要處理的網域名稱對應:

  • pcX.i4502.dic.ksu <==> 192.168.42.X (X 從 1~200 通通要設定),並且將 DNS 資料庫檔名設定為: named.i4502.dic.ksu
  • server.i4502.dic.ksu <==> 192.168.42.254 (這是伺服器名稱),並且將 DNS 資料庫檔名設定為: named.192.168.42

其實,整個 DNS 的設定與注意事項,都在伺服器篇裡面談過了,這裡僅是很快速的將我們所需要的環境,如果你需要每個設定項目的詳細說明,就請參考伺服器篇裡面的 DNS 吧!那就讓我們開始來處理囉!只要兩個 domain,一個正解的 i4502.dic.ksu,以及一個反解的 192.168.42.254 即可!

  1. 安裝所需要的 bind 以及 bond-chroot 等軟體,並設定好 /etc/named.conf 主設定:
    先裝好所需要的軟體才行!伺服器篇裡面談到的,要設定好有點被保護的 DNS 系統,最好要加上 chroot 才好!所以這樣做:
    [root@centos ~]# yum install bind bind-chroot
    [root@centos ~]# vim /etc/named.conf
    options {
            directory       "/var/named";
            dump-file       "/var/named/data/cache_dump.db";
            statistics-file "/var/named/data/named_stats.txt";
            memstatistics-file "/var/named/data/named_mem_stats.txt";
            allow-query     { any; };
            recursion yes;
    };
    
    zone "." IN {                         <== 一定要存在的項目
            type hint;
            file "named.ca";
    };
    
    zone "i4502.dic.ksu" IN {             <== 這是正解的相關設定
            type master;
            file "named.i4502.dic.ksu";
    };
    
    zone "42.168.192.in-addr.arpa" IN {   <== 這是反解的相關設定
            type master;
            file "named.192.168.42";
    };
    

  2. 在 /var/named 底下設定好正解檔 named.i4502.dic.ksu:
    設定好整個區網內的可能產生的 IP 對應的主機名稱!記得,要有 1~200 以及 254 的 server 對應才行!
    [root@centos ~]# cd /var/named
    [root@centos named]# vim named.i4502.dic.ksu
    $TTL    86400
    @       IN SOA  @ root ( 20130401 1D 1H 1W 3H )
    @       IN NS   @
    @       IN A    192.168.42.254
    server  IN A    192.168.42.254
    pc1     IN A    192.168.42.1
    pc2     IN A    192.168.42.2
    ....(中間省略)....
    pc199   IN A    192.168.42.199
    pc200   IN A    192.168.42.200
    
    [root@centos named]# chmod 640 named.i4502.dic.ksu
    [root@centos named]# chown root.named named.i4502.dic.ksu
    

  3. 在 /var/named 底下設定好反解檔 named.192.168.42:
    反解檔就不可以使用縮寫了!必須寫上完整的 FQDN 才行喔!
    [root@centos named]# vim named.192.168.42
    $TTL    86400
    @       IN SOA  server.i4502.dic.ksu. root.server.i4502.dic.ksu. (
                    20130401 1D 1H 1W 3H )
    @       IN NS   server.i4502.dic.ksu.
    254     IN PTR  server.i4502.dic.ksu.
    254     IN PTR  i4502.dic.ksu.
    1       IN PTR  pc1.i4502.dic.ksu.
    2       IN PTR  pc2.i4502.dic.ksu.
    ....(中間省略)....
    199     IN PTR  pc199.i4502.dic.ksu.
    200     IN PTR  pc200.i4502.dic.ksu.
    
    [root@centos named]# chmod 640 named.192.168.42
    [root@centos named]# chown root.named named.192.168.42
    

  4. 啟動並觀察與檢測設定值:
    不要忘記啟動後檢查 /var/log/messages 的內容,同時修改 /etc/resolv.conf 並且使用 dig 自我檢測一下才好!
    [root@centos ~]# /etc/init.d/named start
    [root@centos ~]# chkconfig named on
    [root@centos ~]# vim /etc/resolv.conf
    nameserver 127.0.0.1    <== 注意!這要在上面才對!才會用到自己的 DNS!
    nameserver 168.95.1.1
    
    [root@centos ~]# vim /var/log/messages
    Apr  1 12:14:53 centos named[2212]: zone 42.168.192.in-addr.arpa/IN: loaded serial 20130401
    Apr  1 12:14:53 centos named[2212]: zone i4502.dic.ksu/IN: loaded serial 20130401
    Apr  1 12:14:53 centos named[2212]: managed-keys-zone ./IN: loaded serial 0
    Apr  1 12:14:53 centos named[2212]: running
    # 要看到如上圖的特殊字樣才好!
    
    [root@centos ~]# dig server.i4502.dic.ksu
    [root@centos ~]# dig pc1.i4502.dic.ksu
    [root@centos ~]# dig -x 192.168.42.254
    [root@centos ~]# dig -x 192.168.42.1
    # 要有出現個別的 IP 以及個別的主機名稱才是對的!
    

進行到這一步,你的整個區網內部網路連線,應該是有備援的穩定,以及合併頻寬的優點~接下來的章節,就讓我們來搞一搞怎麼大量部署內部網路的用戶端吧! 期待下一章的內容吧! ^_^

3. 參考資料與延伸閱讀

其實,這整篇文章最重要的地方在講一個概念,那就是我們的區域網路使用 1Gbits/s 的流量已經不夠用了!尤其是在需要較大頻寬的電腦教室或中小型企業環境下。 這時就得要進行一些手腳才能夠讓區網的頻寬給予提升!所以才會談到 LACP 以及 bonding 等功能。此外,未來的世界裡面,非常多的虛擬化啊!這些虛擬化的伺服器, 最可怕的地方在於檔案系統的跨網路存取,恐怕連 10G 都無法解決虛擬化的大頻寬需求!這時,很多上面用到的技術就值得來練習囉!

這篇文章也很感謝鳥哥的學生們,包括吳虹霖、劉俊睿幫忙查詢 LACP 以及 Cisco 的 switch 設定模擬,蘇偉哲、施譯其、林佳辰等人協助區域網路的線路設置, 還有其他的同學們,感謝妳們喔!

另外,上面的實作中,其實最簡單的是伺服器的設定,最麻煩的地方在於網路線路的配置!實際動工過,您就知道鳥哥為什麼這麼講了! 所以,如果對自己的施工沒有信心,記得一定要請專家來配線!因為,線路一配下去,一用就是十數年~留心!留心!注意!注意!


修改歷史:
2013/04/01:區域網路硬體環境重點在配線以及 LACP/bonding,伺服器主力在 NAT+DHCP+DNS 囉!好不容易終於完成了!
2013/04/16:防火牆加入了 FTP 的 NAT 模組~

2013/04/01 以來統計人數
計數器
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計