歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> 關於Unix

用Linux打造路由器

Linux 作為一種新近崛起的操作系統,由於其 性能 穩定,源碼開放及價格方面的優勢而逐漸被廣大用戶所接受。現在Linux的主要用武之地在於 服務器 領域,但是,經過適當的配置之後,它還可以擔當互聯網的物理基石--路由器這一重要角色。 路由器是通信子網中的 Linux 作為一種新近崛起的操作系統,由於其性能穩定,源碼開放及價格方面的優勢而逐漸被廣大用戶所接受。現在Linux的主要用武之地在於服務器領域,但是,經過適當的配置之後,它還可以擔當互聯網的物理基石--路由器這一重要角色。

路由器是通信子網中的通信節點,每個路由器都計算並維護一張路由表,並據此指導數據報前往最佳路徑中的下一站,這便是所謂的路由。這樣,經過互聯網上所有路由器的通力合作,數據報就能夠沿著一條"最佳"路徑到達目的地。在 GNU 軟件 Zebra 的協助下,我們可以將 Linux 機器打造成一台功能完備的路由器,它能夠同時支持 RIPv1、 RIPv2、RIPng、OSPFv2、OSPFv3、BGP - 4 和 BGP - 4+ 等諸多 TCP/IP 協議。現在我們首先了解一下 OSPF 和 BGP 協議的運行模式和基本原理,然後介紹 Zebra 的安裝配置方法,讓你的 Linux 機器變成支持 OSPF 與 BGP 的路由器。

BGP/OSPF 概述

如今,許多公司都建有多個網絡,如果這些網絡的類型不盡相同,則需要用路由器進行互聯。路由器是與兩個或兩個以上的網絡連接的計算機,它根據路由協議生成並維護一個路由表,並按照該路由表中的信息轉發包。這些路由器對公司內部的網絡結構了如指掌,知道將分組送到目的地的全部細節,但對於其他公司的網絡結構並不了解。像這樣"在同一機構下管理的一系列路由器和網絡"被稱為自治系統(AS)。由不同機構掌管的自治系統,可以采用不同的路由選擇算法;但同一自治系統內的所有路由器都使用同一路由協議,以便於自治系統內部各個路由器互換路由信息來維持相互的連通性。每一個自治系統都有一個16位的"自治系統(AS)編號"作為標志,就像 IP 地址一樣,它是由專門機構來分配的。

自治系統內的路由器稱為"內部網關",所用的協議稱為"內部網關協議"。內部網關協議大體上分為兩類,一類是距離向量協議,如 RIP,EIGRP 協議;另一類是鏈路狀態協議如 OSPF 協議。鏈路狀態路由協議與距離向量協議的不同之處在於,采用鏈路狀態路由協議的路由器不是交換到達目的地的距離,而是維護一張網絡拓撲結構圖。然後用數據庫表示該圖,其中的表項對應網絡的一條鏈路。路由器根據數據庫的信息計算出"最佳路由",由此指導包的轉發。當網絡拓撲結構發生變化時,只需將相應紀錄而非整個數據庫通知其他節點。各路由器做出相應修改並重新計算路由後,就可以繼續正常工作。

因為"開放式最短路徑優先協議"的文檔必須公開發表,所以它是"開放式的"(Open);又因為它采用"最短路徑優先"(SPF)算法來計算一個節點到所有其它節點間的最短路徑,故名為 OSPF。OSPF 具有支持多重度量制式和多重路徑等諸多優點,因此成為因特網上推薦使用的內部網關協議,RIP 卻由於自身的局限性而被打入冷宮。現在,在性能上唯一能夠與 OSPF 相匹敵的內部網關協議便是 EIGRP--Cisco 的一個專有協議,但 OSPF 的"開放"本身就是一個響亮的招牌,因為誰也不想受制於某家供應商。

前面提到,自治系統內的路由器不必知道其他自治系統的內部結構細節,從而有效地節約了路由器的內存和 CPU 時間,並提高了網絡帶寬的利用率。但是,如果想與其他公司(自治系統)通信時該怎麼辦呢?很簡單,我們可以在自治系統內指定一個與其他自治系統相連的路由器為"外部網關",通過它進入其他自治系統。該路由器使用的協議叫做"外部網關協議",如邊界網關協議(BGP)。相鄰的兩個網關必須首先互換"鄰機探測"報文,協商是否願意成為"鄰機"。成為鄰機則意味著兩個自治系統同意中轉雙方的通信流。同意後,兩個鄰機互換"鄰機可達性報文",來監督他們之間的鏈路的工作情況。接下來便是最重要的工作,用"網絡可達性報文"來交換通過各鄰機所能到達的網絡的信息,從而實現自治系統之間的連通性。在外部網關的眼裡只由外部網關和連接他們的鏈路,如此以來,自治系統內的通信由內部網關處理,自治系統之間的通信交由外部網關處理--一個分級路由的景象已經展現在我們面前,實際上,因特網正是由大量自治系統組成的。

建立一個高級路由器

許多人對路由器感到比較陌生,事實上作為一個防火牆使用的 Linux 系統已經是一個路由器了,只不過還有點"簡陋"而已。然而,我們的目標是用 Linux 打造一個"高級"路由器,它必須能夠利用動態路由協議(上文提到的協議皆為動態路由協議)工作。這些協議能夠使路由器互換相關信息,從而共享穿越網絡時所用的那些路徑--路由。這一點對於大型網絡(比如 Internet)而言是"異常"重要的,因為此時再用靜態路由(也就是人工計算設置路由)是根本不現實的。

舉例來說,即使在比較理想--即不考慮路由的變化的情況下,一個邊界網關協議(BGP)路由表也至少包含 100,000 條以上的表項。這時,手工建立這樣的靜態路由是難以忍受的。很明顯,即使我們的網絡小於 Internet--比如一個大型公司網絡,我們還是更加喜歡動態路由協議。

外部網關協議 BGP 通常作為 Internet 的骨干使用,而其它的協議(如 OSPF)則適於小型的互連網絡。開放式最短路徑優先(OSPF)協議是一個應用最廣的內部網關協議(IGP)。Zebra 是一個開放源代碼程序包,通過它你可以在 Linux 上運行 BGP 與 / 或 OSPF。

安裝 Zebra

你既可以從 Zebra.org 網站下載 Zebra 的最新源程序,也能從 Redhat 和 Debian 中獲得它,但不一定是最新版的。從源代碼中進行軟件安裝,你就會發現使用的是一些普通的安裝過程。簡介如下:

代碼:
./configure
make
make install


配置腳本會搜索系統上已經安裝的 IP 棧並且自動地設置成支持他們。當前,IP 棧很可能僅僅是指 IPv4,但是 IPv6 用戶也不用擔心,因為 Zebra 也會發現並且支持它。

程序安裝之後,還可能必須在 /etc/services 中增加一些命令行。Zebra 的守護程序在他們自己的虛擬終端連接(VTY)下運行,所以你的系統必須知道這些虛擬終端連接。這裡是你應該增加的一些連接∶

代碼:
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

如果你已經熟悉 Cisco IOS,那你就能在短時間內掌握 Zebra,因為你會發現兩者極為相似。Zebra 的每個守護程序使用一個單獨的 VTY,這些 VTY 可以通過一個遠程登錄會話進行動態配置。所以,如果你需要設置 OSPF,簡單地遠程登錄到該 Linux 上 2604 端口;為了修改內核的路由表或設置路由協議間的再分發,你可以遠程登錄到端口 2601,該 Zebra 守護程序充當內核管理器,管理其他的守護程序和系統本身之間的通信。

現在介紹如何在一個服務器上創建和運行 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  /*進入特權模式時的口令為 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 地址*/



這裡的感歎號充當注解標識或分隔符。盡管存在大量不同的網絡接口類型(Ethernet、ISDN 等等),但只要是 Linux 內核能夠辨認的網絡接口類型,Zebra 都可以使用。

子網掩碼都帶有網絡位的位數(例如/24),默認掩碼則不然(比如 255.255.255.0)。注意存在兩個口令,一個用於用戶模式而另一個用於特權模式。這不僅有利於向非管理員提供訪問權限,而且對於創建路由服務器或者路由探測鏡也是非常重要的。所有 BGP 管理員都知道,這些探測鏡是調試路由問題的關鍵,因為他們能夠使你就象從一個外部 AS( AS代表自治系統)一樣查看路由。 BGP 路由需要用到 AS 編號,AS 編號是一些由 ARIN (美國互聯網絡號碼注冊機構)控制的注冊號碼。

下一步將啟動一些必要的程序。用以下命令完成∶

代碼:
/usr/sbin/zebra -dk
/usr/sbin/ospfd -d
/usr/sbin/bgpd -d


第一個命令,啟動 zebra,該守護程序實際上用來更新內核的路由表。-dk 告訴該程序作為一個守護程序運行(d),它的大部分時間在後台運行。k 是另外的一個選項,告訴 Zebra 維護所有已配置的路由。它用來保證在你測試 Zebra 的時候不會意外地刪除路由表。一般情況下,設置路由和接口,需要將 ifconfig 和 route 這兩個命令配合使用。而 Zebra 完全可以替代這種路由管理方式,使用起來更為簡潔。

設置OSPF

至此,基本的服務已經具備,現在讓我們 Telnet 到本地機器的 2604 端口,開始配置 OSPF。為進入特權模式,鍵入 enable (正如在Cisco IOS 中一樣),然後鍵入特權模式口令。接下來,用 configuration terminal 命令切換到配置模式。值得一提的是 Zebra 也能接受命令縮寫形式,這與 Cisco 極為相似,如 configuration terminal 可以簡寫為 config t,這大大縮短了輸入時間,使用起來更為方便。另外,如果輸入 list 和 ?,它將顯示一個當前可用命令的清單,並附有一些簡略解釋。除此之外,還可以鍵入 tab 用於命令的自動完成。這就是說,如果你想鍵入命令 clock,只要鍵入前兩個字母 cl 然後按 tab 鍵,機器就會自動"補全"這條命令--前提是你鍵入的字符足以唯一地確定這條命令。這是一個很好的功能,尤其是當你習慣於這種用法時。

接下來,我們還需要告訴守護程序將通過 OSPF 廣播哪些網絡以及相關的域(area)。OSPF 的可伸縮性允許它支持多個域。鍵入 router ospf 開始配置 OSPF,然後鍵入 network 192.168.66.0/24 area 0。這告訴路由器,我們將使用 OSPF 廣播一個子網掩碼為 255.255.255.0 的 192.168.66.0 網絡。

在本例中,我們讓 eth0 接口變成一個被動(passive)接口,以便使它不能發送路由更新。這對於實驗是非常重要的,因為在那個方向上的其他的路由器可能監聽到發送的路由更新,將接口變成一個被動(passive)接口,從而有效的避免擾亂網絡的正常運行。為此,鍵入命令 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 Aclearcase/" target="_blank" >ccess Verification

Password:  /*在此鍵入口令,如 zebra*/
ospfd> enable/*進入特權模式*/
Password:  /*輸入特權模式口令,如 z3bRa*/
ospfd# configure terminal  /*從終端配置路由器*/
ospfd(config)# router ospf  /*配置 OSPF*/
ospfd(config-router)# network 192.168.66.0/24 area 0  /*通過 OSPF 廣播網絡 network 192.168.66.0,/24 指出子網掩碼為 24 位,area 0 指出該網絡所在的域*/
ospfd(config-router)# passive-interface eth0  /*將 eth0 接口設置成一個被動(passive)接口*/
ospfd(config-router)# end  /*退出配置模式*/
ospfd# write file  /*保存修改*/
Configuration saved to /etc/zebra/ospfd.conf



請記住,為了讓 OSPF 或 BGP 在某接口上工作,那麼該接口必須處於"運行"狀態。為手工運行一個接口,登錄到端口 2601 並且在該接口上執行 no shut 命令。

建立 BGP

BGP 與 OSPF 的配置大致相同。開始,打開一個遠程登錄會話到端口 2605。之後執行 configure terminal,輸入 router bgp <AS #_> 進入 BGP 配置模式。如前所述,BGP 使用 AS 編號建立鄰機關系並路由通信流。在我們的試驗中,我們將使用一個范圍在 64512 到 65534 之間的私有 AS 號碼(換句話說,該號碼旨在機構內部有效,而在因特網上無效)。用 network 命令設置由 BGP 廣播的那些網絡,如 network 192.168.66.0/24.。與 OSPF 不同的是,BGP 鄰機必須靜態指定。如同下述∶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 是自治系統編號。也就是將該系統配置成自治系統 65530 上的外部網關*/
bgpd(config-router)# network 192.168.66.0/24  /*由 BGP 廣播的網絡*/
bgpd(config-router)# neighbor 10.0.0.5 remote-as 65531  /*靜態指定自治系統 65531 上 IP 地址為 10.0.0.5 的路由器為本機的鄰機*/
bgpd(config-router)# end
bgpd# write file
Configuration saved to /etc/zebra/bgpd.conf


對於 OSPF 和 BGP,有大量選項可用,限於篇幅不能在此一一介紹。對於每個協議,我建議在實際使用之前,不妨先研究一番。為此,可以參考 GNU Zebra 文檔,它會給你提供許多幫助。

結束語

在網絡中,路由通信流的方法有若干種。就路由器而論,雖然有用各種硬件可用,但是費用較高--人們自然就會想到運行一個用 Linux 系統構築的功能豐富的路由器作為代替。Zebra 路由守護程序已經使這一切變為現實。因為支持 IPv4、IPv6 和其它各式各樣的協議,所以 Zebra 能夠滿足我們所有的路由需求。它還有一個好處就是,因為 Cisco IOS 和 Zabra 極為相似,如果你以前在 Cisco IOS 環境中工作,可以輕松的過渡到 Zebra 系統;同時,使用 Zebra 也能讓你積累起豐富的類似於使用 Cisco IOS 路由器的經驗和知識

作者簡介:

韓波,自由撰稿人,有近十年的 C 語言編程經驗,主要感興趣的領域為 TCP/IP 協議以及 Linux 內核。個人認為自由撰稿人的價值在於:在不影響問題實質的前提下,用一種通俗的,易於理解的方式來闡述自己的見解。您可以通過 Email:[email protected] 與他取得聯系。

Copyright © Linux教程網 All Rights Reserved