解決網路瓶頸,「無痛」倍增網路頻寬

利用 Linux Bonding 和 Cisco Etherchannel 技巧,輕鬆實現網路多通道!

1. 前言

Linux 核心能支援的功能真的是不勝枚舉, Ben 哥跟大家說一個最近發生的故事,間接體會 Linux 無遠弗屆的威力。日前 Ben 哥在奇科電腦教授 LPI Level 2 的課程當中,有位在業界從事網路系統管理的學員問了 Ben 哥一個問題: 「如果在同一個區域網路,要架設一台比周圍電腦擁有更多網路頻寬的主機,我要花多少錢、買什麼樣的網路設備」。 Ben 哥回答他,你只要花不到 1 千塊的新台幣,買幾塊「螃蟹牌」的網路卡,就可以立即倍增一台 Linux 主機的網路頻寬!

其實「如何在 Linux 系統下結合多張網路卡來增加網路頻寬」,這個議題 Ben 哥以前便常拿來作教學的實作練習!此次藉由本期的技術專欄,跟各位讀者細述說明「在 Linux 下如何結合多張網卡,並配合相對應的頻寬來增加網路的傳輸速率」 ! 同時間還可以讓該台機器提供「連線備援」的機制!

本期技術文件所需的實驗設備如下:

Linux機器乙台, 兩張以上的乙太網路卡。
Cisco 3550交換機乙台。

本期技術文件所需的軟體及Linux核心如下:

Linux機器:核心2.4.32版, bonding所需的指令:「ifenslave」。
Cisco 3550交換機的韌體:「c3500xl-c3h2s-mz.120-5.WC15.bin」。

本期技術文件所需基本知識如下:

Linux 802.1Q的設定 (詳見Linux Guide 第十一期) 。
Cisco 3550交換機上Etherchannel以及802.1Q的設定。」。

2. Linux 中 Bonding 的意義

Bonding的中文意義為「結合」,那到底要結合什麼東西呢?其實就是利用軟體的方式 (Linux Bonding的技術) 來結合網路傳輸的頻寬!舉個例子來說,每張網卡傳輸速率為100Mb,假使我們Bonding(結合)四張網卡,就可以把這四張網卡視同為一張,而這張網卡的傳輸速率則為400Mb/s。

3. 如何讓Linux支援Bonding

要使Linux能支援Bonding的功能,以及讓使用者能操作Bonding的指令,有幾個必備條件:

1. Linux核心必須支援bonding的功能。
在核心的選項中,各位可以在主選單下的「Network Device Support」裡,選取「Bonding driver support」;在這裡要特別提醒各位的是,請選用與Ben哥相同的核心版本「2.4.32」。因為早期Linux核心版本的bonding支援能力,並不支援待會我們所需要用到的「802.3ad」通訊協定。另外要特別注意的一點是,在Linux中的bonding設定,其對於「802.3ad」的命名為「PAgP」,但在Cisco所屬的設定名詞中,「PAgP」並非指的是「802.3ad」,而是「LACP」;兩者是完全不相同的。因此,讀者們在使用Cisco交換機設備時,務必弄清楚不要搞錯了,不要選到「PAgP」。

2. 必須要有ifenslave指令。
ifenslave為設定bonding功能的唯一指令,與核心所使用的版本有相當高的倚賴性,如果各位使用的核心是2.4.32版本的話,可以在核心原始碼根目錄中「Documentation/networking」的目錄位置下,找到「ifenslave」的原始碼—「ifenslave.c」,同時間也可在上述同樣的目錄下找到「bonding.txt」的檔案,其中簡單的陳述了在此Linux版本中,支援了哪些功能。

Linux-kernel-source-code-ifenslave

因此,我們可以進行編譯適合核心版本2.4.32的「ifenslave」指令。

Linux-gcc-compile-ifenslave

到此為止,我們已確定也必須確定系統的核心支援「bonding」功能,再者其核心版本為2.4.32,且有相對應的「ifenslave」操作指令存在。

4. Cisco支援的連接埠整合控制協定介紹

Cisco 對於交換機連接埠的整合有幾種方式,其一是先前描述過的 LACP ( Link Aggregation Control Protocol) LACP 是 IEEE 標準規格「 802.3ad 」協定中的一部份, 802.3ad 協定規範了:交換機上許多不同的實體連接埠,可以邏輯性的共同結合在一起,進而視為一條實體線;除了 LACP 以外, Cisco 本身也有其他相類似的功能,例如: Etherchannel 以及 PAgP ( Port Aggregation Protocol) 。

5. 實驗目標

在此次的實驗中,Ben哥需要讀者們把Linux的機器設定成為一個支援802.3ad的伺服器,以802.3ad的通訊協定方式與Cisco Catalyst 3550的交換機連結,最終達成連接埠整合的目的。
Linux-bonding-cisco-etherchannel-topology

以上的網路拓墣為此次實驗的主要連接方式,我們以第二層(Layer 2)的連接為本次實驗的主軸,以下為實驗的步驟:

1) 設定Linux的伺服器。
2) 設定Cisco的交換器。
3) 測試連線狀況。
4) 測試連線的備援機制(Redundancy)。

1.設定Linux的伺服器
首先,Ben哥已經有一台 Linux 機器,其核心版本為2.4.32,而且也已經有預先編譯好的 ifenslave 指令,該指令存於目錄「/root」中,Ben哥使用一片有四個連接埠的網路卡(附圖一),每個連接埠都有其獨立的MAC定址,因此可以將之視同為四張網卡,其設備代號各為:eth2、eth3、eth4、eth5。 Linux-ifconfig-eth-grep

確定了網路卡可以使用之後,接下來就必須建立一個虛擬的整合連接介面(bond0),以便將eth2、eth3、eth4、eth5整合在一起。首先,我們必須安插支援bonding的核心模組,在安插模組的時候,同時通知核心待會在bonding時所要支援的模式,在這個版本(2.4.32)中,總共支援了7種模式,第四種模式就是「802.3ad」,因此在安插bonding模組的同時,需在其後加上『mode=802.3ad』或是『mode=4』的命令參數(兩者擇一使用皆可);另外,再加上一個用來「監控各個連接埠連接狀況」的參數,這個參數為『miimon=數字』(數字表示多少ms之意),讀者們可以從下圖看到Ben哥如何確認核心是否支援bonding的功能,進而配合相關參數,安插bonding模組的整個過程。
Linux-kernel-modprobe-bonding-mode-802.3ad

在核心支援bonding的功能後,在『ifconfig –a』指令的標準輸出中,會有一個名為「bond0」的介面設備,這個就是用來整合各張網路卡的介面,是以我們先對bond0介面設定其IP位址並將該介面啟動運作。

Linux-ifconfig-setup-bond0-ip-address

啟動完bond0後,皆下來當然就是把各個實體網路卡整合到bond0中,這時就要使用剛剛Ben哥教大家預先編譯好的「ifenslave」指令!只要鍵入『./ifenslave –v bond0 eth2 eth3 eth4 eth5』即可。

Linux-ifenslave-bonding-eth-interfaces

到此為止,整合連接埠的工作已大功告成。不過Ben哥有個習慣,無論做什麼設定,一定要在設定完後做再三的確認。各位熟悉Linux都知道,Linux的『/proc』目錄,為一個虛擬的檔案系統,其內包含了所有程序的內容,以及核心所提供的功能和各項支援的設備。因此當bonding功能納入核心的支援清單時,在目錄「/proc/net/bonding」下會出現相關的介面設備代號,在這個實驗中我們僅有bond0,因此我們可以觀察『/proc/net/bonding/bond0』的檔案內容,得知bond0所支援的整合連接埠的通訊協定和功能,同時間也可以知道有哪些實體網路卡與其相關。

Linux-get-bonding-info-802.3ad

觀察檔案內容完畢之後,再次鍵入『ifconfig』指令來確認是否包含剛剛所設定的各項設備。

Linux-ifconfig-show-interfaces-info

到現在為止,Linux伺服器已經設定好了,但是網路線另一端的3550交換器還沒有作任何的設定。是以我們先ping路由器的IP位址「192.168.10.2」,看看封包是否能夠到達路由器;結果當然是不行。因為交換器那一端並還沒有將802.3ad通訊協定設定進去,所以通訊協定不同,勢必就無法相互傳遞資料。

Linux-ping-dest-host-unreachable

2.設定Cisco的交換器
在這個階段的實驗中,我們使用FastEthernet連接埠13到16,分別對應到Linux伺服器上的eth2、eth3、eth4、eth5;在Cisco交換機的IOS文字使用介面下,可以使用範圍指令(range)來同時間對很多連接埠下達相同的指令。如下圖所示,我們利用範圍指令進入連接埠設定模式,設定步驟順序如下:

1) 下達指定VLAN的ID
2) 設定連接埠的模式
3) 加入802.3ad的支援,也就是LACP

Cisco-switch-console-setup-interface-range

設定完成後,鍵入『show running』指令,觀察一下FastEthernet 連接埠13到16的設定狀況。 至此,Cisco的交換器設定完畢。

Cisco-switch-console-setup-interface-vlan-access

3.測試連線狀況
在Linux伺服器以及Cisco交換器這兩台機器上,讀者們都已經完成了802.3ad的設定,接下來就是驗收設定成果的時候了。我們可以從Linux伺服器端ping交換器另一端的路由器,其結果是成功的,由此證明先前兩個設備的設定完全無誤。

Linux-telnet-ping

4.測試連線的備援機制(Redundancy)
連接埠整合的另一個好處就是可以提供連線的備援機制,以本實驗為例,我們使用了四個網路連接埠連接到交換器,理應獲得400Mb/s的總頻寬;順帶的這種網路連線機制也提供了連線備援的可能。簡單來說,四個網路通路中,如有其中一兩個連線有問題,這個連線機制(802.3ad)會偵測到連線的狀況,讓另外兩條正常工作的連線接替其他工作。

為了讓讀者實地觀察到這個狀況,Ben哥先從Linux的伺服器ping路由器,然後在第4個icmp答應時,Ben哥把eth2以及eth3的連線拔掉,各位可以從下圖『mii-tool』的指令輸出中,看到eth2及eth3是沒有連線的,當下,經由eth2以及eth3的封包就到達不了路由器,但是過了一分多鐘之後,在第77個icmp的封包之後,連線則自行恢復。

Linux-ping-mii-tool

6. 結論

藉由一致的通訊協定,達到與商業性網路設備的完善結合,並以最經濟、最穩定以及最方便的方式,提供企業一個整合的網路及伺服器環境,這就是Linux強大功能和價值體現的地方。

礙於篇幅關係,Ben哥無法詳細的交代所有細節,所以較重視幫助讀者們在觀念上的建立;其實這只是Linux實際運用的冰山一角而已,不管在OSI七層中的任何一層,Linux都有強大的支援,功能不勝枚舉,應用產品多不勝多,剩下所需要的也是最重要的,就是讀者們能不能去實地瞭解和發掘而已。

文◎奇科培訓資深網路技術顧問 - Ben 哥



我想了解更多資訊!