1、GRE簡介
通用路由封裝協議GRE(Generic Routing Encapsulation)可以對某些網絡層協議(如IPX、ATM、IPv6、AppleTalk等)的數據報文進行封裝,使這些被封裝的數據報文能夠在另一個網絡層協議(如IPv4)中傳輸。
GRE提供了將一種協議的報文封裝在另一種協議報文中的機制,是一種三層隧道封裝技術,使報文可以通過GRE隧道透明的傳輸,解決異種網絡的傳輸問題。
GRE實現機制簡單,對隧道兩端的設備負擔小。GRE隧道可以通過IPv4網絡連通多種網絡協議的本地網絡,有效利用了原有的網絡架構,降低成本。GRE隧道擴展了跳數受限網絡協議的工作范圍,支持企業靈活設計網絡拓撲。GRE隧道可以封裝組播數據,和IPSec結合使用時可以保證語音、視頻等組播業務的安全。GRE隧道支持使能MPLS LDP,使用GRE隧道承載MPLS LDP報文,建立LDP LSP,實現MPLS骨干網的互通。GRE隧道將不連續的子網連接起來,用於組建VPN,實現企業總部和分支間安全的連接。
2、GRE實現過程
報文在GRE隧道中傳輸包括封裝和解封裝兩個過程。
圖1 通過GRE隧道實現X協議互通組網圖
如上圖1所示,如果X協議報文從Ingress PE向Egress PE傳輸,則封裝在Ingress PE上完成,而解封裝在Egress PE上進行。封裝后的數據報文在網絡中傳輸的路徑,稱為GRE隧道。
1、封裝
Ingress PE從連接X協議的接口接收到X協議報文后,首先交由X協議處理。
X協議根據報文頭中的目的地址在路由表或轉發表中查找出接口,確定如何轉發此報文。如果發現出接口是GRE Tunnel接口,則對報文進行GRE封裝,即添加GRE頭。
根據骨干網傳輸協議為IP,給報文加上IP頭。IP頭的源地址就是隧道源地址,目的地址就是隧道目的地址。
根據該IP頭的目的地址(即隧道目的地址),在骨干網路由表中查找相應的出接口並發送報文。之后,封裝后的報文將在該骨干網中傳輸。
2、解封裝
解封裝過程和封裝過程相反。
Egress PE從GRE Tunnel接口收到該報文,分析IP頭發現報文的目的地址為本設備,則Egress PE去掉IP頭后交給GRE協議處理。
GRE協議剝掉GRE報頭,獲取X協議,再交由X協議對此數據報文進行后續的轉發處理。
3、GRE報文格式
圖2 GRE報文結構
GRE封裝后的報文結構如上圖2所示。
1、乘客協議(Passenger Protocol):
封裝前的報文稱為凈荷,封裝前的報文協議稱為乘客協議。
2、封裝協議(Encapsulation Protocol):
GRE Header是由封裝協議完成並填充的,封裝協議也稱為運載協議(Carrier Protocol)。
3、傳輸協議(Transport Protocol或者Delivery Protocol):
負責對封裝后的報文進行轉發的協議稱為傳輸協議。
GRE頭的各字段解釋如下表1所示。
| 表1 GRE頭的各字段解釋 |
|
| GRE頭字段 |
字段解釋 |
| C |
校驗和驗證位。 該位置1,表示GRE頭插入了校驗和(Checksum)字段。 該位置0,表示GRE頭不包含校驗和字段。 |
| K |
關鍵字位。 該位置1,表示GRE頭插入了關鍵字(Key)字段。 該位置0,表示GRE頭不包含關鍵字字段。 |
| Recursion |
表示GRE報文被封裝的層數。完成一次GRE封裝后將該字段加1。如果封裝層數大於3,則丟棄該報文。該字段的作用是防止報文被無限次的封裝。 RFC1701規定該字段默認值為0。 RFC2784規定當發送和接受端該字段不一致時不會引起異常,且接收端必須忽略該字段。 設備實現時該字段僅在加封裝報文時用作標記隧道嵌套層數,GRE解封裝報文時不感知該字段,不會影響報文的處理。 |
| Flags |
預留字段。當前必須置為0。 |
| Version |
版本字段。必須置為0。 |
| Protocol Type |
標識乘客協議的協議類型。常見的乘客協議為IPv4協議,協議代碼為0800。 |
| Checksum |
對GRE頭及其負載的校驗和字段。 |
| Key |
關鍵字字段,隧道接收端用於對收到的報文進行驗證。 |
因為目前實現的GRE頭不包含源路由字段,所以Bit 1、Bit 3和Bit 4都置為0。
4、GRE的安全機制
GRE本身提供兩種基本的安全機制:校驗和驗證,識別關鍵字。
1、校驗和驗證
校驗和驗證是指對封裝的報文進行端到端校驗。
若GRE報文頭中的C位標識位置1,則校驗和有效。發送方將根據GRE頭及Payload信息計算校驗和,並將包含校驗和的報文發送給對端。接收方對接收到的報文計算校驗和,並與報文中的校驗和比較,如果一致則對報文進一步處理,否則丟棄。
隧道兩端可以根據實際應用的需要決定配置校驗和或禁止校驗和。如果本端配置了校驗和而對端沒有配置,則本端將不會對接收到的報文進行校驗和檢查,但對發送的報文計算校驗和;相反,如果本端沒有配置校驗和而對端已配置,則本端將對從對端發來的報文進行校驗和檢查,但對發送的報文不計算校驗和。
2、識別關鍵字
識別關鍵字(Key)驗證是指對Tunnel接口進行校驗。通過這種弱安全機制,可以防止錯誤識別、接收其它地方來的報文。
RFC1701中規定:若GRE報文頭中的K位為1,則在GRE頭中插入一個四字節長關鍵字字段,收發雙方將進行識別關鍵字的驗證。
關鍵字的作用是標志隧道中的流量,屬於同一流量的報文使用相同的關鍵字。在報文解封裝時,GRE將基於關鍵字來識別屬於相同流量的數據報文。只有Tunnel兩端設置的識別關鍵字完全一致時才能通過驗證,否則將報文丟棄。這里的“完全一致”是指兩端都不設置識別關鍵字,或者兩端都設置相同的關鍵字。
5、GRE的Keepalive檢測
由於GRE協議並不具備檢測鏈路狀態的功能,如果對端接口不可達,隧道並不能及時關閉該Tunnel連接,這樣會造成源端會不斷的向對端轉發數據,而對端卻因隧道不通接收不到報文,由此就會形成數據空洞。
GRE的Keepalive檢測功能可以檢測隧道狀態,即檢測隧道對端是否可達。如果對端不可達,隧道連接就會及時關閉,避免因對端不可達而造成的數據丟失,有效防止數據空洞,保證數據傳輸的可靠性。
Keepalive檢測功能的實現過程如下:
當GRE隧道的源端使能Keepalive檢測功能后,就創建一個定時器,周期地發送Keepalive探測報文,同時通過計數器進行不可達計數。每發送一個探測報文,不可達計數加1。
對端每收到一個探測報文,就給源端發送一個回應報文。
如果源端的計數器值未達到預先設置的值就收到回應報文,就表明對端可達。如果源端的計數器值到達預先設置的值——重試次數(Retry Times)時,還沒收到回送報文,就認為對端不可達。此時,源端將關閉隧道連接。但是源端口仍會繼續發送Keepalive報文,若對端Up,則源端口也會Up,建立隧道鏈接。
對於設備實現的GRE Keepalive檢測功能,只要在隧道一端配置Keepalive,該端就具備Keepalive功能,而不要求隧道對端也具備該功能。隧道對端收到報文,如果是Keepalive探測報文,無論是否配置Keepalive,都會給源端發送一個回應報文。
華為通用路由封裝協議GRE介紹(二):http://www.023wg.com/vpn/391.html
