Linux作為一種新近崛起的操作系統(tǒng),由于其性能穩(wěn)定,源碼開放及價格方面的優(yōu)勢而逐漸被廣大用戶所接受?,F(xiàn)在Linux的主要用武之地在于服務(wù)器領(lǐng)域,但是,經(jīng)過適當?shù)呐渲弥?,它還可以擔當互聯(lián)網(wǎng)的物理基石——路由器這一重要角色。
路由器是通信子網(wǎng)中的通信節(jié)點,每個路由器都計算并維護一張路由表,并據(jù)此指導數(shù)據(jù)報前往最佳路徑中的下一站,這便是所謂的路由。這樣,經(jīng)過互聯(lián)網(wǎng)上所有路由器的通力合作,數(shù)據(jù)報就能夠沿著一條“最佳”路徑到達目的地。在GNU軟件Zebra的協(xié)助下,我們可以將Linux機器打造成一臺功能完備的路由器,它能夠同時支持RIPv1、RIPv2、RIPng、OSPFv2、OSPFv3、BGP-4和BGP-4+等諸多TCP/IP協(xié)議?,F(xiàn)在我們首先了解一下 OSPF 和 BGP 協(xié)議的運行模式和基本原理,然后介紹 Zebra 的安裝配置方法,讓你的 Linux 機器變成支持 OSPF 與 BGP 的路由器。
BGP/OSPF 概述
如今,許多公司都建有多個網(wǎng)絡(luò),如果這些網(wǎng)絡(luò)的類型不盡相同,則需要用路由器進行互聯(lián)。路由器是與兩個或兩個以上的網(wǎng)絡(luò)連接的計算機,它根據(jù)路由協(xié)議生成并維護一個路由表,并按照該路由表中的信息轉(zhuǎn)發(fā)包。這些路由器對公司內(nèi)部的網(wǎng)絡(luò)結(jié)構(gòu)了如指掌,知道將分組送到目的地的全部細節(jié),但對于其他公司的網(wǎng)絡(luò)結(jié)構(gòu)并不了解。像這樣"在同一機構(gòu)下管理的一系列路由器和網(wǎng)絡(luò)"被稱為自治系統(tǒng)(AS)。由不同機構(gòu)掌管的自治系統(tǒng),可以采用不同的路由選擇算法;但同一自治系統(tǒng)內(nèi)的所有路由器都使用同一路由協(xié)議,以便于自治系統(tǒng)內(nèi)部各個路由器互換路由信息來維持相互的連通性。每一個自治系統(tǒng)都有一個16位的"自治系統(tǒng)(AS)編號"作為標志,就像 IP 地址一樣,它是由專門機構(gòu)來分配的。
自治系統(tǒng)內(nèi)的路由器稱為"內(nèi)部網(wǎng)關(guān)",所用的協(xié)議稱為"內(nèi)部網(wǎng)關(guān)協(xié)議"。內(nèi)部網(wǎng)關(guān)協(xié)議大體上分為兩類,一類是距離向量協(xié)議,如 RIP,EIGRP 協(xié)議;另一類是鏈路狀態(tài)協(xié)議如 OSPF 協(xié)議。鏈路狀態(tài)路由協(xié)議與距離向量協(xié)議的不同之處在于,采用鏈路狀態(tài)路由協(xié)議的路由器不是交換到達目的地的距離,而是維護一張網(wǎng)絡(luò)拓撲結(jié)構(gòu)圖。然后用數(shù)據(jù)庫表示該圖,其中的表項對應網(wǎng)絡(luò)的一條鏈路。路由器根據(jù)數(shù)據(jù)庫的信息計算出"最佳路由",由此指導包的轉(zhuǎn)發(fā)。當網(wǎng)絡(luò)拓撲結(jié)構(gòu)發(fā)生變化時,只需將相應紀錄而非整個數(shù)據(jù)庫通知其他節(jié)點。各路由器做出相應修改并重新計算路由后,就可以繼續(xù)正常工作。
因為"開放式最短路徑優(yōu)先協(xié)議"的文檔必須公開發(fā)表,所以它是"開放式的"(Open);又因為它采用"最短路徑優(yōu)先"(SPF)算法來計算一個節(jié)點到所有其它節(jié)點間的最短路徑,故名為 OSPF。OSPF 具有支持多重度量制式和多重路徑等諸多優(yōu)點,因此成為因特網(wǎng)上推薦使用的內(nèi)部網(wǎng)關(guān)協(xié)議,RIP 卻由于自身的局限性而被打入冷宮?,F(xiàn)在,在性能上唯一能夠與 OSPF 相匹敵的內(nèi)部網(wǎng)關(guān)協(xié)議便是 EIGRP--Cisco 的一個專有協(xié)議,但 OSPF 的“開放”本身就是一個響亮的招牌,因為誰也不想受制于某家供應商。
前面提到,自治系統(tǒng)內(nèi)的路由器不必知道其他自治系統(tǒng)的內(nèi)部結(jié)構(gòu)細節(jié),從而有效地節(jié)約了路由器的內(nèi)存和 CPU 時間,并提高了網(wǎng)絡(luò)帶寬的利用率。但是,如果想與其他公司(自治系統(tǒng))通信時該怎么辦呢?很簡單,我們可以在自治系統(tǒng)內(nèi)指定一個與其他自治系統(tǒng)相連的路由器為"外部網(wǎng)關(guān)",通過它進入其他自治系統(tǒng)。該路由器使用的協(xié)議叫做"外部網(wǎng)關(guān)協(xié)議",如邊界網(wǎng)關(guān)協(xié)議(BGP)。相鄰的兩個網(wǎng)關(guān)必須首先互換"鄰機探測"報文,協(xié)商是否愿意成為"鄰機"。成為鄰機則意味著兩個自治系統(tǒng)同意中轉(zhuǎn)雙方的通信流。同意后,兩個鄰機互換"鄰機可達性報文",來監(jiān)督他們之間的鏈路的工作情況。接下來便是最重要的工作,用"網(wǎng)絡(luò)可達性報文"來交換通過各鄰機所能到達的網(wǎng)絡(luò)的信息,從而實現(xiàn)自治系統(tǒng)之間的連通性。在外部網(wǎng)關(guān)的眼里只由外部網(wǎng)關(guān)和連接他們的鏈路,如此以來,自治系統(tǒng)內(nèi)的通信由內(nèi)部網(wǎng)關(guān)處理,自治系統(tǒng)之間的通信交由外部網(wǎng)關(guān)處理--一個分級路由的景象已經(jīng)展現(xiàn)在我們面前,實際上,因特網(wǎng)正是由大量自治系統(tǒng)組成的。
建立一個高級路由器
許多人對路由器感到比較陌生,事實上作為一個防火墻使用的 Linux 系統(tǒng)已經(jīng)是一個路由器了,只不過還有點"簡陋"而已。然而,我們的目標是用 Linux 打造一個"高級"路由器,它必須能夠利用動態(tài)路由協(xié)議(上文提到的協(xié)議皆為動態(tài)路由協(xié)議)工作。這些協(xié)議能夠使路由器互換相關(guān)信息,從而共享穿越網(wǎng)絡(luò)時所用的那些路徑--路由。這一點對于大型網(wǎng)絡(luò)(比如 Internet)而言是"異常"重要的,因為此時再用靜態(tài)路由(也就是人工計算設(shè)置路由)是根本不現(xiàn)實的。
舉例來說,即使在比較理想--即不考慮路由的變化的情況下,一個邊界網(wǎng)關(guān)協(xié)議(BGP)路由表也至少包含 100,000 條以上的表項。這時,手工建立這樣的靜態(tài)路由是難以忍受的。很明顯,即使我們的網(wǎng)絡(luò)小于 Internet--比如一個大型公司網(wǎng)絡(luò),我們還是更加喜歡動態(tài)路由協(xié)議。
外部網(wǎng)關(guān)協(xié)議 BGP 通常作為 Internet 的骨干使用,而其它的協(xié)議(如 OSPF)則適于小型的互連網(wǎng)絡(luò)。開放式最短路徑優(yōu)先(OSPF)協(xié)議是一個應用最廣的內(nèi)部網(wǎng)關(guān)協(xié)議(IGP)。Zebra 是一個開放源代碼程序包,通過它你可以在 Linux 上運行 BGP 與 / 或 OSPF。
安裝 Zebra
你既可以從 Zebra.org 網(wǎng)站下載 Zebra 的最新源程序,也能從 Redhat 和 Debian 中獲得它,但不一定是最新版的。從源代碼中進行軟件安裝,你就會發(fā)現(xiàn)使用的是一些普通的安裝過程。簡介如下:
./configure make make install
配置腳本會搜索系統(tǒng)上已經(jīng)安裝的 IP 棧并且自動地設(shè)置成支持他們。當前,IP 棧很可能僅僅是指 IPv4,但是 IPv6 用戶也不用擔心,因為 Zebra 也會發(fā)現(xiàn)并且支持它。
程序安裝之后,還可能必須在 /etc/services 中增加一些命令行。Zebra 的守護程序在他們自己的虛擬終端連接(VTY)下運行,所以你的系統(tǒng)必須知道這些虛擬終端連接。這里是你應該增加的一些連接∶
zebrasrv 2600/tcp # zebra service zebra 2601/tcp # zebra vty ripd 2602/tcp # RIPd vty ripngd 2603/tcp # RIPngd vty ospfd 2604/tcp # OSPFd vty bgpd 2605/tcp # BGPd vty ospf6d 2606/tcp # OSPF6d vty
配置 Zebra
如果你已經(jīng)熟悉 Cisco IOS,那你就能在短時間內(nèi)掌握 Zebra,因為你會發(fā)現(xiàn)兩者極為相似。Zebra 的每個守護程序使用一個單獨的 VTY,這些 VTY 可以通過一個遠程登錄會話進行動態(tài)配置。所以,如果你需要設(shè)置 OSPF,簡單地遠程登錄到該 Linux 上 2604 端口;為了修改內(nèi)核的路由表或設(shè)置路由協(xié)議間的再分發(fā),你可以遠程登錄到端口 2601,該 Zebra 守護程序充當內(nèi)核管理器,管理其他的守護程序和系統(tǒng)本身之間的通信。
現(xiàn)在介紹如何在一個服務(wù)器上創(chuàng)建和運行 OSPF 和 BGP。Zebra 的守護程序運用純文本文件儲存它們的配置。對于 OSPF/BGP 路由器,將用到三個文件∶zebra.conf、ospfd.conf 和 bgpd.conf。舉例來說,zebra.conf 文件可能會是這樣:
! Zebra configuration saved from vty ! 2002/02/28 01:46:12 ! hostname LinuxRouter /*主機名為 LinuxRouter*/ password zebra /*口令為 zebra*/ enable password z3bRa /*進入特權(quán)模式時的口令為 z3bRa */ log file /var/log/zebra/zebra.log /*日志文件的地址*/ ! interface eth0 /*以太接口 eth0*/ description Interface to External Network/*對接口的描述*/ ip address 10.0.0.1/24 /*該接口的 IP 地址*/ ! interface eth1/*以太接口 eth0*/ description Interface to Internal Network/*對接口的描述*/ ip address 192.168.66.1/24/*該接口的 IP 地址*/
這里的感嘆號充當注解標識或分隔符。盡管存在大量不同的網(wǎng)絡(luò)接口類型(Ethernet、ISDN 等等),但只要是 Linux 內(nèi)核能夠辨認的網(wǎng)絡(luò)接口類型,Zebra 都可以使用。
子網(wǎng)掩碼都帶有網(wǎng)絡(luò)位的位數(shù)(例如/24),默認掩碼則不然(比如 255.255.255.0)。注意存在兩個口令,一個用于用戶模式而另一個用于特權(quán)模式。這不僅有利于向非管理員提供訪問權(quán)限,而且對于創(chuàng)建路由服務(wù)器或者路由探測鏡也是非常重要的。所有 BGP 管理員都知道,這些探測鏡是調(diào)試路由問題的關(guān)鍵,因為他們能夠使你就象從一個外部 AS( AS代表自治系統(tǒng))一樣查看路由。 BGP 路由需要用到 AS 編號,AS 編號是一些由 ARIN (美國互聯(lián)網(wǎng)絡(luò)號碼注冊機構(gòu))控制的注冊號碼。
下一步將啟動一些必要的程序。用以下命令完成∶
/usr/sbin/zebra -dk /usr/sbin/ospfd -d /usr/sbin/bgpd -d
第一個命令,啟動 zebra,該守護程序?qū)嶋H上用來更新內(nèi)核的路由表。-dk 告訴該程序作為一個守護程序運行(d),它的大部分時間在后臺運行。k 是另外的一個選項,告訴 Zebra 維護所有已配置的路由。它用來保證在你測試 Zebra 的時候不會意外地刪除路由表。一般情況下,設(shè)置路由和接口,需要將 ifconfig 和 route 這兩個命令配合使用。而 Zebra 完全可以替代這種路由管理方式,使用起來更為簡潔。
設(shè)置OSPF
至此,基本的服務(wù)已經(jīng)具備,現(xiàn)在讓我們 Telnet 到本地機器的 2604 端口,開始配置 OSPF。為進入特權(quán)模式,鍵入 enable (正如在Cisco IOS 中一樣),然后鍵入特權(quán)模式口令。接下來,用 configuration terminal 命令切換到配置模式。值得一提的是 Zebra 也能接受命令縮寫形式,這與 Cisco 極為相似,如 configuration terminal 可以簡寫為 config t,這大大縮短了輸入時間,使用起來更為方便。另外,如果輸入 list 和 ?,它將顯示一個當前可用命令的清單,并附有一些簡略解釋。除此之外,還可以鍵入 tab 用于命令的自動完成。這就是說,如果你想鍵入命令 clock,只要鍵入前兩個字母 cl 然后按 tab 鍵,機器就會自動"補全"這條命令--前提是你鍵入的字符足以唯一地確定這條命令。這是一個很好的功能,尤其是當你習慣于這種用法時。
接下來,我們還需要告訴守護程序?qū)⑼ㄟ^ OSPF 廣播哪些網(wǎng)絡(luò)以及相關(guān)的域(area)。OSPF 的可伸縮性允許它支持多個域。鍵入 router ospf 開始配置 OSPF,然后鍵入 network 192.168.66.0/24 area 0。這告訴路由器,我們將使用 OSPF 廣播一個子網(wǎng)掩碼為 255.255.255.0 的 192.168.66.0 網(wǎng)絡(luò)。
在本例中,我們讓 eth0 接口變成一個被動(passive)接口,以便使它不能發(fā)送路由更新。這對于實驗是非常重要的,因為在那個方向上的其他的路由器可能監(jiān)聽到發(fā)送的路由更新,將接口變成一個被動(passive)接口,從而有效的避免擾亂網(wǎng)絡(luò)的正常運行。為此,鍵入命令 passive - interface eth0。如果打算將此路由器作為工作路由器使用時,就沒有這個必要了。一旦你完成修改,用 end 命令從配置模式中退出,然后用 write file 命令保存。這里是一個快照:
labrat:~# telnet 0 2604 /*Telnet 到本地機器的 2604 端口*/
Trying 0.0.0.0...Connected to 0.Escape character is ‘^]‘. /*用 ‘^]‘退出該會話*/ Hello, this is zebra (version 0.84b)Copyright 1996-2000 Kunihiro Ishiguro
User Access VerificationPassword: /*在此鍵入口令,如 zebra*/
ospfd> enable/*進入特權(quán)模式*/
Password: /*輸入特權(quán)模式口令,如 z3bRa*/
ospfd# configure terminal /*從終端配置路由器*/
ospfd(config)# router ospf /*配置 OSPF*/
ospfd(config-router)# network 192.168.66.0/24 area 0 /*通過 OSPF 廣播網(wǎng)絡(luò) network 192.168.66.0,/24 指出子網(wǎng)掩碼為 24 位,area 0 指出該網(wǎng)絡(luò)所在的域*/
ospfd(config-router)# passive-interface eth0 /*將 eth0 接口設(shè)置成一個被動(passive)接口*/
ospfd(config-router)# end /*退出配置模式*/ospfd# write file /*保存修改*/ Configuration saved to /etc/zebra/ospfd.conf
建立 BGP
BGP 與 OSPF 的配置大致相同。開始,打開一個遠程登錄會話到端口 2605。之后執(zhí)行 configure terminal,輸入 router bgp 進入 BGP 配置模式。如前所述,BGP 使用 AS 編號建立鄰機關(guān)系并路由通信流。在我們的試驗中,我們將使用一個范圍在 64512 到 65534 之間的私有 AS 號碼(換句話說,該號碼旨在機構(gòu)內(nèi)部有效,而在因特網(wǎng)上無效)。用 network 命令設(shè)置由 BGP 廣播的那些網(wǎng)絡(luò),如 network 192.168.66.0/24.。與 OSPF 不同的是,BGP 鄰機必須靜態(tài)指定。如同下述∶
neighbor <neighbor IP> remote-as <remote AS #>
這里是一個范例:
labrat:~# telnet 0 2605 Trying 0.0.0.0... Connected to 0. Escape character is ‘^]‘. Hello, this is zebra (version 0.84b) Copyright 1996-2000 Kunihiro Ishiguro User Access Verification Password: bgpd> enable Password: bgpd# configure terminal bgpd(config)# router bgp 65530 /*配置 BGP,65530 是自治系統(tǒng)編號。也就是將該系統(tǒng)配置成自治系統(tǒng) 65530 上的外部網(wǎng)關(guān)*/ bgpd(config-router)# network 192.168.66.0/24 /*由 BGP 廣播的網(wǎng)絡(luò)*/ bgpd(config-router)# neighbor 10.0.0.5 remote-as 65531 /*靜態(tài)指定自治系統(tǒng) 65531 上 IP 地址為 10.0.0.5 的路由器為本機的鄰機*/ bgpd(config-router)# end bgpd# write file Configuration saved to /etc/zebra/bgpd.conf
對于OSPF和BGP,有大量選項可用,限于篇幅不能在此一一介紹。對于每個協(xié)議,我建議在實際使用之前,不妨先研究一番。為此,可以參考 GNU Zebra 文檔,它會給你提供許多幫助。
結(jié)束語
在網(wǎng)絡(luò)中,路由通信流的方法有若干種。就路由器而論,雖然有用各種硬件可用,但是費用較高--人們自然就會想到運行一個用 Linux 系統(tǒng)構(gòu)筑的功能豐富的路由器作為代替。Zebra 路由守護程序已經(jīng)使這一切變?yōu)楝F(xiàn)實。因為支持 IPv4、IPv6 和其它各式各樣的協(xié)議,所以 Zebra 能夠滿足我們所有的路由需求。它還有一個好處就是,因為 Cisco IOS 和 Zabra 極為相似,如果你以前在 Cisco IOS 環(huán)境中工作,可以輕松的過渡到 Zebra 系統(tǒng);同時,使用 Zebra 也能讓你積累起豐富的類似于使用 Cisco IOS 路由器的經(jīng)驗和知識。
作者簡介:
韓波,自由撰稿人,有近十年的 C 語言編程經(jīng)驗,主要感興趣的領(lǐng)域為 TCP/IP 協(xié)議以及 Linux 內(nèi)核。個人認為自由撰稿人的價值在于:在不影響問題實質(zhì)的前提下,用一種通俗的,易于理解的方式來闡述自己的見解。您可以通過 Email:hbzzx2001@yahoo.com.cn 與他取得聯(lián)系。