目錄

前言
First Hop Redundancy Protocol (FHRP)
Hot Standby Redundancy Protocol (HSRP)
Virtual Router Redundancy Protocol (VRRP)
Gateway Load Balancing Protocol (GLBP)
  Active Virtual Gateway (AVG)
  Active Virtual Forwarder (AVF)

前言

所謂 First Hop 就是由網絡裡的 Host 到 Gateway 這一跳,由於 Gateway 一旦出現問題而未能提供服務,該網絡裡的所有 Host 就無辦法與其他網絡溝通,對企業或組織影響極大 (尤其在老闆正在閒逛網頁的時候 😆)。因此必需為 Gateway 提供 Redundancy (冗餘),最常用的協定分別是 Hot Standby Redundancy Protocol (HSRP)、Virtual Router Redundancy Protocol (VRRP) 及 Gateway Load Balancing Protocol (GLBP)。筆者假設讀者已對 Routing 及 ARP 有相當的認識。

First Hop Redundancy Protocol (FHRP)

協定誕生的原因必然是為了解決某些問題,我們先看看在沒有 FHRP 的時候會有什麼困難發生。以下實驗 R1、R2 及 R4 已用 Routing Protocol 打通,R5 當成 Host,它把 Default Gateway 指向 192.168.125.1,於是能 Ping 通 4.4.4.4。

First Hop Routing Protocol

問題是當 R1 掛掉或需要維護時,我們便要把 R5 的 Default Gateway 改成 192.168.125.2 以維持服務,一台 Host 當然可以,如綱絡內有數百台 Host 則成了大問題,而且人手更改不合邏輯。FHRP 的發明是為 R1 的 e1/0 和 R2 的 e1/0 產生出一組 Virtual MAC Address 以及一組 Virtual IP Address (VIP),Host 只要把 Gateway 指向 VIP,R1 的 e1/0 和 R2 的 e1/0 自行協定由誰來工作,即接收 Host 傳來的 Traffic,接收的一方又喚作 Active,另一個 Interface 則是後備,即 Standby。當 Active 掛掉,Standby 便會補上變成 Active。FHRP 只是一個統稱,以下將會介紹 3 款 FHRP,分別是 HSRP、VRRP 及 GLBP。

First Hop Routing Protocol

Hot Standby Redundancy Protocol (HSRP)

Hot Standby Redundancy Protocol (HSRP) 是 Cisco 自家產品,只有 Cisco 設備可用,要設定 HSRP 極其簡單,首先設定 Group ID 和 VIP。參與 HSRP 的 Interface 之 Group ID 必需相同,VIP 需與 Interface 的 IP 處於同一個 Subnet 之中。指令是 standby <group id> ip <vip>

R1(config)#interface ethernet 1/0
R1(config-if)#standby 1 ip 192.168.125.3
R2(config)#interface ethernet 1/0
R2(config-if)#standby 1 ip 192.168.125.3

show standby 可查看 HSRP 狀態。

R1#show standby 
Ethernet1/0 - Group 1
  State is Active
    2 state changes, last state change 00:10:30
  Virtual IP address is 192.168.125.3
  Active virtual MAC address is 0000.0c07.ac01
    Local virtual MAC address is 0000.0c07.ac01 (v1 default)
  Hello time 3 sec, hold time 10 sec
    Next hello sent in 2.240 secs
  Preemption disabled
  Active router is local
  Standby router is 192.168.125.2, priority 100 (expires in 11.872 sec)
  Priority 100 (default 100)
  Group name is "hsrp-Et1/0-1" (default)

State 是 HSRP 現時的角色,在 R1 看到 Active 代表現時此 Interface 是負責工作的 Active Interface,如在 R2 查看則會看到 State 為 Standby。除了 Virtual IP 外,我們還看到相對的 Virtual MAC Address。Virtual MAC Address 是自動產生的,可用以下指令更改,必需於 Group 內所有 Interface 都下指令才能生效,但其實我們很少會更改,由它自行產生便可。

R1(config-if)#standby 1 mac-address 0000.0100.1a2b

預設 Hello Time 為 3 秒,即 Router 預設每 3 秒聯絡一下 Group 裡面其他 Interface,如 Standby Interface 過了 Hold Time (預設 10 秒) 也無法收到 Active Interface 報平安,則判斷對方掛掉,自己升格成為 Active。若嫌反應時間太慢,可用指令更改,但必需把 Group 裡所有 Interface 的 Timer 都更改,新設定才能生效。

R1(config-if)#standby 1 timers 2 6
R1(config-if)#do show standby
Ethernet1/0 - Group 1
  State is Active
    5 state changes, last state change 00:06:53
  Virtual IP address is 192.168.125.3
  Active virtual MAC address is 0000.0c07.ac01
    Local virtual MAC address is 0000.0c07.ac01 (v1 default)
  Hello time 2 sec, hold time 6 sec
    Next hello sent in 1.488 secs
  Preemption disabled
  Active router is local
  Standby router is 192.168.125.2, priority 100 (expires in 11.872 sec)
  Priority 100 (default 100)
  Group name is "hsrp-Et1/0-1" (default)

在 Group 裡面的 Interface 中 Priority 最高者會成為 Active,預設值為 100,現在嘗試在 R2 把 Priority 調高:

R2(config)#interface ethernet 1/0
R2(config-if)#standby 1 priority 150
R2(config-if)#do show standby        
Ethernet1/0 - Group 1
  State is Standby
    9 state changes, last state change 00:00:39
  Virtual IP address is 192.168.125.3
  Active virtual MAC address is 0000.0c07.ac01
    Local virtual MAC address is 0000.0c07.ac01 (v1 default)
  Hello time 2 sec, hold time 6 sec
    Next hello sent in 0.336 secs
  Preemption disabled
  Active router is 192.168.125.1, priority 100 (expires in 11.760 sec)
  Standby router is local
  Priority 150 (configured 150)
  Group name is "hsrp-Et1/0-1" (default)

奇怪的是,把 R2 e1/0 的 Priority 調高至 150 後,並沒有使 R2 e1/0 即時成為 Active,反而仍處於 Standby 狀態。原來為了保持穩定性,當 Priority 被修改,又或者 Priority 較高的 Interface 出現,HSRP 不會立即把其升格成 Active。必需等到現時的 Active 掛掉,Standby 收不到 Active 的 Hello Message,才能變成 Active。

但有些情況我們卻希望能自主選擇 Active 多於保持此種穩定性,例如 R2 的性能較高,我們希望它總是成為 Active,這時便要使用 Preempt 指令。Preempt 的意思是當該 Interface 存在於 Group 時,如果 Priority 較高則必然即時升格為 Active,無需等待。

R2(config)#int ethernet 1/0
R2(config-if)#standby 1 preempt 
*Jul 28 17:32:03.571: %HSRP-5-STATECHANGE: Ethernet1/0 Grp 1 state Standby -> Active
R2(config-if)#do show standby
Ethernet1/0 - Group 1
  State is Active
    10 state changes, last state change 00:00:40
  Virtual IP address is 192.168.125.3
  Active virtual MAC address is 0000.0c07.ac01
    Local virtual MAC address is 0000.0c07.ac01 (v1 default)
  Hello time 3 sec, hold time 10 sec
    Next hello sent in 1.904 secs
  Preemption enabled
  Active router is local
  Standby router is 192.168.125.1, priority 100 (expires in 9.696 sec)
  Priority 150 (configured 150)
  Group name is "hsrp-Et1/0-1" (default)

然後有一個有趣的問題,再看看我們的 Topology,假設 R1 e1/0 是 Active,如果圖中 R1 與 R4 中間的網絡斷掉會出現什麼情況?因為這連線不會觸發 Active Standby 角色轉換,所以 Host 仍以 R1 作為 Gateway,所以訊息到了 R1 就會被 Drop 掉了。解決方法為 Track,假設 R1 e1/0 的 Priority 為 100,R2 e1/0 為 90,以下指令的意思是當 e1/1 Down 時,就把 Priority 扣減 20,如此一來,Priority 就會被扣減至 80,配合 R2 設定了 Preempt,就會立刻觸發 R2 成為 Active。

R1(config-if)#standby 1 track ethernet 1/1 20

最後,基於保安理由,可為 HSRP 設定密碼驗證,指令如下:

R1(config-if)#standby 1 authentication ? 
  WORD  Plain text authentication string
  md5   Use MD5 authentication
  text  Plain text authentication

R1(config-if)#standby 1 authentication md5 ?   
  key-chain   Set key chain
  key-string  Set key string

R1(config-if)#standby 1 authentication md5 key-string ccie

Virtual Router Redundancy Protocol (VRRP)

如果 Group 裡面存在有非 Cisco 品牌的 Router,則需使用 Virtual Router Redundancy Protocol (VRRP),其指令 99% 與 HSRP 相似,只不過把指令 standby 改為 vrrp,以下為基本設定:

interface Ethernet1/0
 ip address 192.168.125.1 255.255.255.0
 vrrp 1 ip 192.168.125.3
 vrrp 1 priority 150
 vrrp 1 authentication text ccie
R1#show vrrp
Ethernet1/0 - Group 1  
  State is Master
  Virtual IP address is 192.168.125.3
  Virtual MAC address is 0000.5e00.0101
  Advertisement interval is 1.000 sec
  Preemption enabled
  Priority is 150 
  Authentication text "ccie"
  Master Router is 192.168.125.1 (local), priority is 150 
  Master Advertisement interval is 1.000 sec
  Master Down interval is 3.414 sec

VRRP 的 State 不是 Active 和 Standby,而是 Master 和 Backup,同樣是 Priority 較高者成為 Master。VRRP 用來報平安的不是 Hello Message 而是 Master Advertisement,Master 預設每 1 秒 (Master Advertisement Interval) 送出 Master Advertisement,Master Advertisement Interval 可以更改。如過了 Master Down Interval 後,Backup 沒有收到來自 Master 報平安,則升格成為 Master。Master Down Interval 不能設定,會自行計算,公式如下:

3 x [Advertisement Interval] + (256 - Priority) / 256

可用以下指令更改 Master Advertisment Interval:

R1(config-if)#vrrp 1 timers advertise 2

其他 Router 則要用以下指令把自己的 Timer 跟 Master 同步。

R2(config-if)#vrrp 1 timers learn

Track 在 VRRP 會多一點點設定,首先建立一個 Track Object,例如建立 Track 10 監察 e1/1 的 Line-protocol,如 Line-protocol Down 則 Track 10 成立。

R1(config)#track 10 interface ethernet 1/1 line-protocol

然後,當 Track 10 成立,則把 Priority 扣減 50,配合 R2 設了 Preempt,就會立刻觸發 R2 成為 Master。

R1(config-if)#vrrp 1 track 10 decrement 50

Gateway Load Balancing Protocol (GLBP)

HSRP 和 VRRP 都有一個問題,就是 Group 中只能有一個 Interface 成為 Active (或 Master),其他的 Interface 只能當後備,無法做到 Load Balancing 或 Load Sharing,Cisco 專有的 Gateway Load Balancing Protocol (GLBP) 可以解決此問題。GLBP 可容許多於一個 Interface 成為 Active Virtual Forwarder (AVF),可以同時接收 Host 的 Traffic,能做到這件事是因為每次有 Host 透過 ARP 詢問 Gateway IP 的 MAC Address 時,GLBP 就回覆不同的 MAC Address,於是相同的 Gateway IP 在不同的 Host 中有著不同的 MAC Address 紀錄,從而達成 Load Balancing。

GLBP 有兩個角色,AVG 和 AVF:

Active Virtual Gateway (AVG)

Active Virtual Gateway 的作用就是負責回覆 Host 的 ARP 查詢,它會收集所有 AVF 的資料,包括 IP Address 和 MAC Address 等,一個 GLBP Group 中只有一隻 AVG,就是 Priority 最高的 Interface,其餘成為 Standby,設定指令跟 HSRP 相若。Priority、Preempt、Authentication 及 Timer 等設定不在此重覆說明。

R1(config)#int ethernet 1/0
R1(config-if)#glbp 1 ip 192.168.125.3
R1(config-if)#glbp 1 priority 150
R1(config-if)#glbp 1 preempt
R1(config-if)#glbp 1 timers 2 6
R1(config-if)#glbp 1 authentication md5 key-string ccie
R2(config)#int ethernet 1/0
R2(config-if)#glbp 1 ip 192.168.125.3
R2(config-if)#glbp 1 authentication md5 key-string ccie

Active Virtual Forwarder (AVF)

預設所有在 GLBP Group 的 Router 都會成為 Active Virtual Forwarder,AVG 會收集所有 AVF 的資料,並跟據 Load Balancing 設定來回應 ARP 查詢。

首先用 show glbp 來看 GLBP 狀態,這個會比 HSRP 和 VRRP 較為複雜,大家可以把結果分成兩部份來看,第一部份是關於 AVG 的資訊,而第二部份則是 AVF。

R1#show glbp 
Ethernet1/0 - Group 1
  State is Active
    4 state changes, last state change 01:35:59
  Virtual IP address is 192.168.125.3
  Hello time 2 sec, hold time 6 sec
    Next hello sent in 0.480 secs
  Redirect time 600 sec, forwarder time-out 14400 sec
  Authentication MD5, key-string
  Preemption enabled, min delay 0 sec
  Active is local
  Standby is 192.168.125.2, priority 100 (expires in 4.800 sec)
  Priority 150 (configured)
  Weighting 100 (default 100), thresholds: lower 1, upper 100
  Load balancing: round-robin
  Group members:
    ca01.29e5.001c (192.168.125.1) local
    ca02.29f4.001c (192.168.125.2) authenticated

<--接下表-->

以上是 AVG 的部份,可見本機是 Active AVG,負責回應 ARP 查詢。比較令人關注的應該是關於 Weighting 和 Load Balancing 的部份。GLBP 預設的 Load Balancing 辦法是 Round-robin,即每次有 Host 提出 VIP 192.168.125.3 的 ARP 查詢時,AVG 就會把所有 AVF Group Members 的 MAC Address 輪流用作回覆,假設 Group 內有兩隻 AVF,Round-robin 令大約一半 Host 紀錄了 MAC Address ca01.29e5.001c (即 R1 自己),而另一半 Host 則紀錄了 ca02.29f4.001c (即 R2),於是網絡裡的 Host 便可平均地使用 R1 和 R2 作為 Gateway 了。當然,如有 AVF 突然掛掉,AVG 就會把其 MAC Address 從 Group Members 移除,不會再向 Host 發放該 MAC Address。至於 Weighting 則會在稍後介紹另一個 Load Balancing 方法 Weighted 時再作說明。

<--接上表-->

  There are 2 forwarders (1 active)
  Forwarder 1
    State is Listen
      2 state changes, last state change 00:22:54
    MAC address is 0007.b400.0101 (learnt)
    Owner ID is ca02.29f4.001c
    Redirection enabled, 598.816 sec remaining (maximum 600 sec)
    Time to live: 14398.816 sec (maximum 14400 sec)
    Preemption enabled, min delay 30 sec
    Active is 192.168.125.2 (primary), weighting 100 (expires in 5.888 sec)
  Forwarder 2
    State is Active
      1 state change, last state change 01:56:33
    MAC address is 0007.b400.0102 (default)
    Owner ID is ca01.29e5.001c
    Redirection enabled
    Preemption enabled, min delay 30 sec
    Active is local, weighting 100

然後,我們又看到這個 Group 裡有兩組 Forwarder (即是剛才說過的兩組 MAC Address),第一組是 ca02.29f4.001c (R2),R1 對於這組 Forwarder 的狀態是 Listen,而對方 (R2) 是 Active,如果對方掛掉則 R1 會由 Listen 轉為 Active,幫忙處理傳到 ca02.29f4.001c 的訊息。剛才提過,當 R2 掛掉,AVG 就不會再用它的 MAC Address 來回應 ARP,所以為什麼需要有 Active 和 Listen 的機制呢?道理很簡單,由於 MAC 紀錄會存在於 Host 一段時間 (大約 10 分鐘),在這段時間裡,必需要有人接手 R2 的工作才可令該些 Host 不會因為找不到 Gateway 而斷線。另一組 Forwarder 2 則相反,由 R1 做 Active,R2 是 Listen。

除了 Round-robin 外,其他的 Load Balancing 方法可用以下指令設置:

R1(config-if)#glbp 1 load-balancing ?
  host-dependent  Load balance equally, source MAC determines forwarder choice
  round-robin     Load balance equally using each forwarder in turn
  weighted        Load balance in proportion to forwarder weighting

R1(config-if)#glbp 1 load-balancing weighted 

如使用 Weighted,則可設定 Weighting 值去調校各 AVF 的 Traffic 比例。例如把 R1 e1/0 的 Weighting 值改成 200,而 R2 E1/0 則維持原設定值 100,則 AVG 會把 R1 和 R2 的 MAC Address 按 2:1 的比例來回應 Host 的 ARP 查詢,於是 Host 也會按 2:1 的比例把 Traffic 送至 R1 和 R2。

R1(config-if)#glbp 1 weighting 200
R1(config-if)#end
R1#show glbp

<--Output Omitted-->

  Forwarder 1
    State is Listen
      2 state changes, last state change 00:44:18
    MAC address is 0007.b400.0101 (learnt)
    Owner ID is ca02.29f4.001c
    Redirection enabled, 598.688 sec remaining (maximum 600 sec)
    Time to live: 14398.688 sec (maximum 14400 sec)
    Preemption enabled, min delay 30 sec
    Active is 192.168.125.2 (primary), weighting 100 (expires in 5.632 sec)
  Forwarder 2
    State is Active
      1 state change, last state change 01:01:40
    MAC address is 0007.b400.0102 (default)
    Owner ID is ca01.29e5.001c
    Redirection enabled
    Preemption enabled, min delay 30 sec
    Active is local, weighting 200

另外有個進階的玩法是可以由系統主動調校 Weighting 值,籍此控制 Router 的 Traffic 處理量。假設已建立 Track 10 在 SLA 不達標時 (例如回應時間變慢) 被觸發,關於 SLA 設定請參考以下文章:SLA,如想 Track 10 被觸發時把 Weighting 減少 100,使用以下指令。

R1(config-if)#glbp 1 weighting track 10 decrement 100

我們甚至可以在 Weighting 過低時把 AVF 從 Group 中移除,這就是 Threshold 設定。當 Weighting 值低於 Lower Threshold 時,該 AVF 會從 Group 中移除,直至 Weighting 值高於 Upper Threshold 時,AVF 才再次被加入 Group,指令如下:

R1(config-if)#glbp 1 weighting 200 lower 150 upper 200