1. 程式人生 > >VRRP協議詳解-----(1)

VRRP協議詳解-----(1)

目錄

7.後記

  • 作者:張蒙 (zmouc)
  • 電子郵箱:[email protected]
  • QQ  : 407-960-134
  • 建立日期:2010年07月23日
  • 版    本:1.0
  • 版權說明:本文基於創作共用約定,內容歸作者版權所有,歡迎大家轉載,但要保留        作者的完整資訊和出處,謝謝!

1. VRRP產生背景及應用環境

1.1為什麼要用VRRP

VRRPVirtual Router Redundancy Protocol------虛擬路由器冗餘協議,其最新技術標準是RFC3768

為什麼要用VRRP呢,主要是為了實現資料鏈路層互通裝置的冗餘備份功能,我們來看圖一:

圖一(常規網路架構)

通過上圖可以看到,常規的區域網一般都是多個終端接到交換機上,然後通過單獨的出口路由器連線到Internet,這時候問題來了,如果這個出口路由器壞掉了,那麼整個上行的流量就會全部斷掉,這就是傳說中的單點故障。

所以說我們要避免出現這種情況,本著冗餘備份的思想,我們對上面的網路進行物理改造,如下圖:

圖二(消除了單點故障的常規網路架構)

現在,這個網路一共有兩個Internet出口,這樣任何一個出口路由器出現故障都不會導致終端使用者的上行流量斷掉。

另外一個問題出現了,我們怎麼讓終端PC知道區域網中有兩個出口路由器,並在其中一個出現故障後自動選擇另外一個呢?

可採用的方案包括讓終端PC執行動態路由協議,比如RIPOSPF,或者ICMP router Discovery clientDISC),或者指定一條靜態預設路由。

但是這三種實現方法都有其劣勢及不可行之處,我們來具體分析一下。首先對於在每一個終端PC上執行動態路由協議來講,幾乎是不可能的,這其中牽涉到網管的技術能力和日常維護、安全性問題、以及某些終端平臺不支援動態路由協議,比如我們常用的XPWindows7都不支援,而windows Server系列OS支援。

假定我們在終端PC上部署了動態路由協議,那麼每一個終端使用者都會遇到下面這種情況:

10086:尊敬的使用者您好,申報RIP

故障請按1,申報OSPF故障請按2,申報ISIS故障請按3……….

使用者: o  )啊!我家是OSPF,按2

10086:您好,您申報的故障是OSPF,請進一步選擇,OSPF鄰居無法建立請按1OSPF金鑰不對請按2,鏈路狀態資料庫異常請按3,路由表錯誤請按4…………..

使用者: o  )啊!……………然後吐血身亡………….

所以說,N多現實問題和困難導致在終端PC上部署動態路由協議具有不可行性。

那麼對於在終端PC上部署DISC等鄰居或路由器發現協議呢?也存在種種問題,例如在網路記憶體在大量主機,每一臺都需要執行DISC,除了增加主機的處理負擔外,也會導致協議收斂緩慢,從而不能及時發現不可用鄰居路由器,產生路由黑洞,這是不可接受的。

現在只剩下在終端PC上配置靜態預設路由了(其具體表現形式一般是設定網關),這是幾乎每一個IP平臺都支援的配置功能,即使是一部IP電話機,根據這個思路,我們在終端上配置多個預設閘道器即可實現路由備份了,但是存在以下兩個問題:

1.       對於下行裝置是PC來講,配置了多個預設閘道器之後,其中一個會作為活動預設

閘道器,其它的作為備份預設閘道器,其按照下列過程執行流量轉發和失效閘道器檢測:

TCP/IP在通過活動預設閘道器向某個目標IP地址進行TCP通訊時,如果失敗的嘗試次數達到TcpMaxDataRetransmissions登錄檔值(預設為5)的一半(3)還沒有收到響應,TCP/IP將到達該目標IP地址的通訊改為使用列表中的下一預設閘道器,這一步是通過更改該遠端IP地址的路由快取項(Route Cache EntryRCE)來實現的,從而使用列表中的下一個預設閘道器來作為下一跳地址。其中RCE是路由表中的一個條目,用於儲存目的地的下一跳IP地址。當超過25%TCP連線轉向下一預設閘道器時,TCP/IP將活動預設閘道器修改為這些連線當前使用的預設閘道器。

  如果此時原始預設閘道器從故障中回覆,TCP/IP將繼續使用當前的活動預設網關,而不會轉移到原始預設閘道器,除非重啟計算機。如果當前的活動預設閘道器也出現故障,那麼TCP/IP就會繼續嘗試使用列表中的下一個預設閘道器,在嘗試完整個列表後將返回到列表的開始,又從第一個預設閘道器開始進行嘗試。

  死閘道器檢測僅監視TCP流量,如果其他型別的流量連線失敗,不會切換預設網關。另外TCP是端到端的協議,因此即使當前預設閘道器完全正常,本地計算機的TCP通訊失敗也可能會導致切換預設閘道器。

  當不同網路介面所連線的網路之間沒有連線性時(如一個網路介面連線到Internet,而一個網路介面連線到內部網路),如果在多個網路介面上同時配置預設網關,在活動預設網關出現故障導致切換預設閘道器時,就可能會引起連線性故障。比如活動預設閘道器為Internet連線,當它出現問題時,此時預設閘道器切換為內部連線,此時,本地計算機將無法再訪問位於Internet連線上的主機。對於這種情況,微軟建議使用 route add 來新增對應目的網路的匹配路由,而不是設定多個預設閘道器,這其實就是最長匹配原則,精確路由優先於預設路由。

2.對於下行裝置是路由器的情況,其不會切換預設路由,只會按照配置好的預設

路由優先順序進行流量轉發,從而導致路由黑洞。

結合上面兩個原因,在網路出口路由器的下行裝置上配置預設路由的方法也不可

綜上所述,要想消除單點故障,又同時實現下行裝置在故障發生時的流量無障礙

發,以上的三個方法均不可行,所以人們開發出了一種全新的協議:VRRP,這

協議無需下行裝置與出口路由器進行互動性操作,卻完全實現了網路出口的冗

餘備份,下一節,我們就來詳細討論下VRRP的基本原理及實現過程。

2VRRP基本原理及實現過程

VRRP路由器:執行VRRP協議一個或多個例項的路由器

虛擬路由器:由一個Master路由器和多個Backup路由器組成。其中,無論Master由器還是Backup路由器都是一臺VRRP路由器,下行裝置將虛擬路由器當做預設閘道器。

VRID虛擬路由器標識,在同一個VRRP組內的路由器必須有相同的VRID,其實VRID就相當於一個公司的名稱,每個員工介紹自己時都要包含公司名稱,表明自己是公司的一員,同樣的道理,VRID表明了這個路由器屬於這個VRRP組。

Master路由器:虛擬路由器中承擔流量轉發任務的路由器

Backup路由器:當一個虛擬路由器中的Master路由器出現故障時,能夠代替Master路由器工作的路由器

虛擬IP地址:虛擬路由器的IP地址,一個虛擬路由器可以擁有一個或多個虛擬IP址。

IP地址擁有者:介面IP和虛擬路由器IP地址相同的路由器就叫做IP地址擁有者。

IP地址:從物理介面設定的IP地址中選擇,一個選擇規則是總是選用第一個IP址,VRRP通告報文總是用主IP地址作為該報文IP包頭的源IP

虛擬MAC地址:組成方式是00-00-5E-00-01-{VRID},前三個位元組00-00-5EIANA組織分配的,接下來的兩個位元組00-01是為VRRP協議指定的,最後的VRID是虛擬路由器標識,取值範圍[1255]

下面我們來看VRRP報文的具體組成:

圖三(VRRP報文格式,取自RFC3768)

具體欄位含義:

Version:VRRP協議版本號,RFC3768定義了版本2.

Type:該欄位指明瞭VRRP報文的型別,RFC3768只定義了一種VRRP報文,那就是

VRRP通告報文,所以該欄位總是置為1,若收到的VRRP通告報文擁有非1的型別

值,那麼會被丟棄。

Virtual Rtr ID:也就是我們上面介紹過的VRID,一個VRID唯一地標識了一個虛擬

路由器,取值範圍是[1,255],所以一臺路由器的介面可以同時執行最多255個VRRP

例項,此欄位沒有預設值,必須人為設定。

Priority:優先順序,在一個虛擬路由器中用來選取Master路由器和Backup路由器,值越大表明優先順序越高,此欄位共有8個bit,取值範圍[1,254],若沒有人為指定,預設值是100。其中,VRRP協議會將IP地址擁有者路由器的該欄位永遠設定為255,若人為指定為其它值,也不會影響VRRP協議的預設行為,即IP地址擁有者路由器的該字段總是255。另外,此欄位設定為0會出現在下面這種情形中,當Master路由器出現故障後,它會立刻傳送一個Priority置0的VRRP通告報文,當Backup路由器收到此通告報文後,會等待Skew time時間,然後將自己切換為Master路由器,其中Skew time=(256-Backup路由器的優先順序)/256,單位為秒,例如若Backup路由器的優先順序為100,那麼Skew time=156/256=0.609秒,對於主路由器來說,Skew time並沒有實際意義,雖然cisco的路由器也會計算並顯示出來。

Count IP Addrs:VRRP通告報文中包含的IP地址數量,這個欄位其實就是為一個VRRP虛擬路由器所分配的IP地址的數量,我們來看一個cisco的實際例子:

配置如下:

interface Ethernet1/0

 ip address 192.168.10.102 255.255.255.0

 duplex half

 vrrp 1 ip 192.168.10.52

 vrrp 1 ip 192.168.10.51 secondary

 vrrp 1 ip 192.168.10.53 secondary

end

我們來看一下上面的配置在封裝成VRRP通告報文的時候,是如何進行的,如下

圖:

圖四(VRRP報文的抓包分析)

大家可以看到,VRRP通告報文中的Count IP Addrs欄位的值為3,這是因為我們配置了3個虛擬IP地址,另外,下面的IP Address欄位也按照我們配置虛擬IP的順序進行了封裝。

Auth Type:認證型別欄位,是一個8位的無符號整數,一個虛擬路由器只能使用一種認證型別,如果Backup路由器收到的通告報文中認證型別欄位是未知的或和本地配置的不匹配,那麼它將丟棄該資料包。

值得注意的是,在RFC2338中為VRRP定義了3種認證型別:無認證、明文認證、MD5認證,但是在後續的實踐中發現,這些手段無法提供行之有效的安全性,並且還會導致多個Master路由器的問題,所以在最新的VRRP標準:RFC3768中已經去掉了所有的認證型別。

目前認證型別欄位的定義如下:

0 – 無認證,此時下面的Authentication Data欄位將會被置為全0,接收到的路由器也會忽略此欄位。

1 – 保留,是為了向前一個版本的RFC2338提供相容性

2 – 保留,是為了向前一個版本的RFC2338提供相容性

Adver Int::此欄位規定了Mater路由器向外傳送VRRP通告報文的時間間隔,以秒為單位,取值範圍是[1,255],若沒有人工配置,預設為1秒。

Checksum:整個VRRP報文的校驗和,計算過程中,將Checksum欄位置為0,計算完成後將結果填入此欄位。若希望進一步瞭解Checksum的計算,可以檢視RFC1071(CKSM)。

IP Address:此欄位存放3個VRRP虛擬路由器的虛擬IP地址,配置了幾個就封裝幾個,在上面的cisco例項中我們配置了三個,那麼VRRP通告報文就會封裝3個。

Authentication Data:RFC3768中規定,此欄位只是為了向RFC2338相容,在實際的封裝時,全置為0.,接收方也會忽略此欄位。

對一個VRRP虛擬路由器來講,,參與它的每一臺VRRP路由器,都只有3VRRP狀態:InitializeMasterBackup,在講述這三種狀態時會碰到一些新的概念,我們會在第一次遇到時做詳細解釋。

2.3.1初始狀態(Initialize

這是配置好VRRP後,VRRP等待一個開始事件時的狀態,當本地VRRP程序切換到此狀態後,會依次執行下列操作:

2.3.1.1如果本地優先順序為255,也就是說自己是IP擁有者路由器,那麼接下來它會:

1.傳送VRRP通告報文

2.廣播免費ARP請求報文,內部封裝是虛擬MAC和虛擬IP的對應,有幾個虛擬IP址,那麼就傳送幾個免費ARP請求報文。

3.啟動一個Adver_Timer計時器,初始值為Advertisement_Interval(預設是1秒),當該計時器超時後,會發送下一個VRRP通告報文

4.本地VRRP程序將自己切換為Master路由器

2.3.1.2如果,本地優先順序不是255,,那麼接下來它會:

1.設定Master_Down_Timer計時器等於Master_Down_Interval,也就是主路由器死亡時

間間隔,如果此計時器超時,那麼Backup路由器就會宣佈主路由器死亡。

其中Master_Down_Interval = 3*Advertisement_Interval+ Skew_time舉例來說,一個VRRP例項(也就是一個VRRP虛擬器)的優先順序是100,報文傳送

間隔是1秒,那麼Master_Down_Interval = 3*1s + 256-100/256s = 3.609秒。

2.本地VRRP程序將自己切換為Backup路由器

2.3.2備份路由器狀態(Backup

2.3.2.1

備份路由器是為了監控Master路由器的狀態,如果一個VRRP路由器處於此狀態,那麼它會:

1.       不響應對虛擬IP地址的ARP請求報文

2.       丟棄幀頭目的MAC地址是虛擬MAC的幀

3.       丟棄IP頭中目的IP地址是虛擬IPIP

2.3.2.2

如果此時該VRRP路由器收到了一個shutdown事件,那麼它會:

1.    取消Master_Down_Timer

2.    轉換為初始狀態(Initialize state

2.3.2.3

如果Master_Down_Timer超時,那麼該VRRP路由器會執行:

1.傳送一個VRRP通告報文,

2.廣播免費ARP請求報文,內部封裝是虛擬MAC和虛擬IP的對應,有幾個虛擬IP

地址,那麼就傳送幾個免費ARP請求報文。

3.設定Adver_Timer計時器為Advertisement_Interval(預設為1秒)

4.切換到Master狀態

2.3.2.4

如果該Backup狀態的VRRP路由器收到了一個VRRP通告報文;

當該VRRP通告報文的優先順序欄位為0時,那麼路由器會將當前的

Master_Down_Timer 設定為Skew_Time

如果優先順序不為0,並且大於或等於本地優先順序,那麼本地路由器會重置Master_Down_Timer計時器並保持Backup狀態;

如果優先順序不為0,並且小於本地優先順序,如果開啟了搶佔模式(Preempt mode),

那麼該Backup路由器等待指定的搶佔延遲時間後將自己切換為Master路由器;並執

Master路由器的所有動作;例如:vrrp 1 preempt delay minimum 10,表示等待10

後切換自己為Master

如果優先順序不為0,並且小於本地優先順序,如果沒有開啟搶佔模式(Preempt mode),那麼本地路由器保持Backup狀態。

2.3.3 Master路由器(Master state

處於Master狀態的路由器會執行目的MAC為虛擬MAC資料幀的轉發,這裡要清楚是對於下行裝置的arp表裡,該虛擬MAC是和虛擬IP地址相對應的。

2.3.3.1

當路由器處於Master狀態時,會進行下面的動作:

1.    響應對虛擬IP地址的ARP請求

2.    轉發目的MAC地址是虛擬MAC的資料幀

3.    拒絕目的IP地址是虛擬IP的資料包,除非它是IP地址擁有者(也就是優先順序是

255的那個路由器)。

2.3.3.2

如果處於Master狀態的VRRP程序收到了一個shutdown事件,那麼它會:

1.    取消Adver_Timer計時器

2.    傳送一個優先順序欄位置零的VRRP通告報文

3.    切換為初始狀態(Intialize state

2.3.3.3

如果Adver_Timer計時器超時,那麼:

1.    傳送一個VRRP通告報文

2.    重置Adver_Timer計時器

2.3.3.4

如果收到了一個VRRP報文且其優先順序為0,那麼:

1.  傳送一個VRRP通告報文

2.  重置Adver_Timer計時器

2.3.3.5

如果收到了一個VRRP報文且其優先順序高於本地優先順序,或者收到的VRRP報文優先級等於本地優先順序但是主IP地址高於本地的主IP地址,那麼:

1.    取消Adver_Timer計時器

2.    設定Master_Down_Timer計時器為Master_Down_Interval

3.    切換為Backup狀態

轉載:http://blog.chinaunix.net/uid-11654074-id-2857384.html