IPv6鄰居發現協議
鄰居發現協議NDP
鄰居發現協議NDP(Neighbor Discovery Protocol)是IPv6協議體系中一個重要的基礎協議。鄰居發現協議替代了IPv4的ARP(Address Resolution Protocol)和ICMP路由器發現(Router Discovery),它定義了使用ICMPv6報文實現地址解析,跟蹤鄰居狀態,重復地址檢測,路由器發現以及重定向等功能。
地址解析
在IPv4中,當主機需要和目標主機通信時,必須先通過ARP協議獲得目的主機的鏈路層地址。在IPv6中,同樣需要從IP地址解析到鏈路層地址的功能。鄰居發現協議實現了這個功能。
ARP報文是直接封裝在以太網報文中,以太網協議類型為0x0806,普遍觀點認為ARP定位為第2.5層的協議。ND本身基於ICMPv6實現,以太網協議類型為0x86DD,即IPv6報文,IPv6下一個報頭字段值為58,表示ICMPv6報文,由於ND協議使用的所有報文均封裝在ICMPv6報文中,一般來說,ND被看作第3層的協議。在三層完成地址解析,主要帶來以下幾個好處:
- 地址解析在三層完成,不同的二層介質可以采用相同的地址解析協議。
- 可以使用三層的安全機制避免地址解析攻擊。
- 使用組播方式發送請求報文,減少了二層網絡的性能壓力。
地址解析過程中使用了兩種ICMPv6報文:鄰居請求報文NS(Neighbor Solicitation)和鄰居通告報文NA(Neighbor
Advertisement)。
- NS報文:Type字段值為135,Code字段值為0,在地址解析中的作用類似於IPv4中的ARP請求報文。
- NA報文:Type字段值為136,Code字段值為0,在地址解析中的作用類似於IPv4中的ARP應答報文。
IPv6地址解析過程分析:
- Host A在向Host B發送報文之前它必須要解析出Host B的鏈路層地址,所以首先Host A會發送一個NS報文,其中源地址為Host A的IPv6地址,目的地址為Host B的被請求節點組播地址,需要解析的目標IP為Host B的IPv6地址,這就表示Host A想要知道Host B的鏈路層地址。同時需要指出的是,在NS報文的Options字段中還攜帶了Host A的鏈路層地址。
- 當Host B接收到了NS報文之后,就會回應NA報文,其中源地址為Host B的IPv6地址,目的地址為Host A的IPv6地址(使用NS報文中的Host A的鏈路層地址進行單播),Host B的鏈路層地址被放在Options字段中。這樣就完成了一個地址解析的過程。
報文抓包分析:
拓撲如下:
地址解析過程分析:
-
首先在兩端各配上IPv6地址,然后在AR1上ping ipv6 -a 2000::1 2000::2。抓包如下:
圖:ping ipv6 -a 2000::1 2000::2抓包
-
NS報文內容如下:
圖:第一個NS報文 AR1會以2000::1作為源地址,目標地址為2000::2的被請求節點組播地址 ff02::1:ff00:2。然后將AR1的MAC地址攜帶在ICMPc6的Option中。在ICMPv6中還會攜帶Target Address:2000::2,這個用來防止在廣播網中有多個前綴不同,最后24bit相同,而造成的混亂。攜帶這個字段后,當主機收到這個報文后,會首先檢查該字段是否是自己的IPv6地址,如果是,則接收並回應NA報文。如果該字段的地址不是自己的IPv6地址,則丟棄。
-
NA報文內容如下:
圖:NA報文抓包 當AR2收到AR1發送的NA報文后,檢查Target Address字段,如果是自己的IPv6地址,接收,並將對端的IP地址和MAC地址綁定到自己的鄰居表中。然后以自己IPv6地址2000::2為源地址,對端IPv6地址:2000::1為目的地址。並將自己的MAC地址封裝在ICMPv6的Option中,發送給對方。從而兩端都知道了對方的MAC地址。可以進行二次封裝。
鄰居通告報文中Flags字段解釋:
- R:路由器標記。當置1時,R位指出發送者是路由器。R位由Neighbor Unreachability Detection使用,用於檢測改變為主機的路由器。
- S:請求標記。當置1時,S位指出通告被發送以響應來自目的地地址的Neighbor Solicitation。S位用作Neighbor Unreachability Detection的可達性確認。在多播通告和非請求單播通告中置0。
- O:替代標記。替代標志,1表示通告中的信息替代緩存,如更新鏈路層地址時,對於任播的回應則不應置位。在針對任播地址的請求通告中,以及在請求的前綴通告中它不能被置1。在其他請求通告中和在非請求通告中它應當被置1。
- Target Address:對於請求的通告,是在Neighbor Solicitation消息(該消息催促這個通告)中的Target Address字段。對於非請求通告,是其鏈路層地址已經改變的地址。Target Address必須不是多播地址。
跟蹤鄰居狀態
通過鄰居或到達鄰居的通信,會因各種原因而中斷,包括硬件故障、接口卡的熱插入等。如果目的地失效,則恢復是不可能的,通信失敗;如果路徑失效,則恢復是可能的。因此節點需要維護一張鄰居表,每個鄰居都有相應的狀態,狀態之間可以遷移。
RFC2461中定義了5種鄰居狀態,分別是:
- 未完成(Incomplete)
- 可達(Reachable)
- 陳舊(Stale)
- 延遲(Delay)
- 探查(Probe)
鄰居狀態的具體遷移過程如下圖所示:
下面以A、B兩個鄰居節點之間相互通信過程中A節點的鄰居狀態變化為例(假設A、B之前從未通信),說明鄰居狀態遷移的過程。
- A先發送NS報文,並生成緩存條目,此時,鄰居狀態為Incomplete。
- 若B回復NA報文,則鄰居狀態由Incomplete變為Reachable,否則固定時間后鄰居狀態由Incomplete變為Empty,即刪除表項。
- 經過鄰居可達時間,鄰居狀態由Reachable(默認30s)變為Stale,即未知是否可達。
- 如果在Reachable狀態,A收到B的非請求NA報文(MAC地址修改),且報文中攜帶的B的鏈路層地址和表項中不同,則鄰居狀態馬上變為Stale。
- 在Stale狀態若A要向B發送數據,則鄰居狀態由Stale變為Delay,並發送NS請求。
- 在經過一段固定時間后,鄰居狀態由Delay(默認5s)變為Probe(每隔1s發送一次NS報文,連續發送3次),其間若有NA應答,則鄰居狀態由Delay變為Reachable。
- 在Probe狀態,A每隔一定時間間隔z(1s)發送單播NS,發送固定次數(3)后,有應答則鄰居狀態變為Reachable,否則鄰居狀態變為Empty,即刪除表項。
重復地址檢測
重復地址檢測DAD(Duplicate Address Detect)是在接口使用某個IPv6單播地址之前進行的,主要是為了探測是否有其它的節點使用了該地址。尤其是在地址自動配置的時候,進行DAD檢測是很必要的。一個IPv6單播地址在分配給一個接口之后且通過重復地址檢測之前稱為試驗地址(Tentative Address)。此時該接口不能使用這個試驗地址進行單播通信,但是仍然會加入兩個組播組:ALL-NODES組播組和試驗地址所對應的Solicited-Node組播組。
IPv6重復地址檢測技術和IPv4中的免費ARP類似:節點向試驗地址所對應的Solicited-Node組播組發送NS報文。NS報文中目標地址即為該試驗地址。如果收到某個其他站點回應的NA報文,就證明該地址已被網絡上使用,節點將不能使用該試驗地址通訊。
重復地址檢測原理如下:
Host A的IPv6地址FC00::1為新配置地址,即FC00::1為Host A的試驗地址。Host A向FC00::1的Solicited-Node組播組發送一個以FC00::1為請求的目標地址的NS報文進行重復地址檢測,由於FC00::1並未正式指定,所以NS報文的源地址為未指定地址。當Host B收到該NS報文后,有兩種處理方法:
- 如果Host B發現FC00::1是自身的一個試驗地址,則Host B放棄使用這個地址作為接口地址,並且不會發送NA報文。
- 如果Host B發現FC00::1是一個已經正常使用的地址,Host B會向FF02::1發送一個NA報文,該消息中會包含FC00::1。這樣,Host A收到這個消息后就會發現自身的試驗地址是重復的。Host A上該試驗地址不生效,被標識為duplicated狀態。
當兩端同時檢測時情況如下:
- 若2個節點配置相同地址,同時作重復地址檢測時,該地址處於Tentative狀態,當一方收到對方發出的DAD NS,則接收方將不啟用該地址
- 一種極端的情況,如果同時收到NS報文,則兩端都放棄改地址
抓包分析:
當在AR3上配置2000::1/64地址時,AR3首先會以 :: 為源地址,以自己配置的2000::1的被請求節點組播地址為目的地址,發送NS報文。如果有來自2000::1的NA回復,則該地址不能用。如果沒收到,則該地址可以使用。
在這個報文中因為AR1上已經使用了2000::1/64地址,所以會回復一個NA。如下:
IPv6地址生命周期:
在preferred time和valid lifetime之間叫做deprecated(棄用)狀態,當地址達到這個時間段的時候,地址不能主動的發起連接只能是被動的接受連接,過了valid lifetime時間,地址就變為invalid,這時任何連接就會down掉。
路由器發現
路由器發現功能用來發現與本地鏈路相連的設備,並獲取與地址自動配置相關的前綴和其他配置參數。
在IPv6中,IPv6地址可以支持無狀態的自動配置,即主機通過某種機制獲取網絡前綴信息,然后主機自己生成地址的接口標識部分。路由器發現功能是IPv6地址自動配置功能的基礎,主要通過以下兩種報文實現:
-
路由器通告RA(Router Advertisement)報文:每台設備為了讓二層網絡上的主機和設備知道自己的存在,定時都會組播發送RA報文,RA報文中會帶有網絡前綴信息,及其他一些標志位信息。RA報文的Type字段值為134。
圖:RS報文抓包示例 -
路由器請求RS(Router Solicitation)報文:很多情況下主機接入網絡后希望盡快獲取網絡前綴進行通信,此時主機可以立刻發送RS報文,網絡上的設備將回應RA報文。RS報文的Tpye字段值為133。
圖:RA鄰居通告報文抓包示例 RA報文中字段解釋:
- Cur Hop Limit:默認值應當放置在發出IP分組的IP首部的Hop Count字段中。 取0值意味着未(由該路由器)規定。
- M:M位為0表示無狀態自動配置生成IPv6地址,如果M=1表示需要通過有狀態(DHCPv6)方式獲取ipv6地址。
- O:O位為0表示除了IPv6地址以外的其他參數需要通過無狀態自動配置獲取,如果O=1表示除了IPv6地址以外的其它需要通過有狀態(DHCPv6)方式進行獲取。
- Router Lifetime:與默認路由器關聯的生存期,以秒為單位。最大值18.2小時。取0值的Lifetime指出路由器不是默認路由器並且不應當出現在默認路由器列表中。Router Lifetime僅適用於作為默認路由器的路由器應用;對包括在其他消息字段或選項中的信息不適用。需要對它們的信息規定時間限制的選項有它們自己的生存期字段。
- Reachable time:此時間以毫秒計,在收到可達性確認后節點假定該鄰居是可到達的。它由Neighbor Unreachability Detection算法使用。此值為0意味着沒有(由此路由器)作出規定。
- Retrans Timer:重發的Neighbor Solicitation消息間隔時間,以毫秒計。由地址解析和Neighbor Unreachability Detection算法使用。此值為0意味着沒有(由此路由器)作出規定。
- ICMP Prefix Option中的flag字段:
- aoto-config:如果該位為1表示該前綴可以用於無狀態自動配置,如果為0不能用於無狀態自動配置。
- on-link:指定0-flag標識位。若配置該參數,則只會本地鏈路內的主機RA報文中的前綴不是分配給本地鏈路的。主機若想該前綴指定的地址發送報文時,需要經過默認路由器轉發。
路由器發現功能如下圖所示:
RA在華為中的通告時間有兩種:
- min-interval=200s。
- max-interval=600s。
地址自動配置:
IPv4使用DHCP實現自動配置,包括IP地址,缺省網關等信息,簡化了網絡管理。IPv6地址增長為128位,且終端節點多,對於自動配置的要求更為迫切,除保留了DHCP作為有狀態自動配置外,還增加了無狀態自動配置。無狀態自動配置即自動生成鏈路本地地址,主機根據RA報文的前綴信息,自動配置全球單播地址等,並獲得其他相關信息。
IPv6主機無狀態自動配置過程:
- 根據接口標識產生鏈路本地地址。
- 發出鄰居請求,進行重復地址檢測。
- 如地址沖突,則停止自動配置,需要手工配置。
- 如不沖突,鏈路本地地址生效,節點具備本地鏈路通信能力。
- 主機會發送RS報文(或接收到設備定期發送的RA報文)。
- 根據RA報文中的前綴信息和接口標識得到IPv6地址。
默認路由器優先級和路由信息發現:
當主機所在的鏈路中存在多個設備時,主機需要根據報文的目的地址選擇轉發設備。在這種情況下,設備通過發布默認路由優先級和特定路由信息給主機,提高主機根據不同的目的地選擇合適的轉發設備的能力。
在RA報文中,定義了默認路由優先級和路由信息兩個字段,幫助主機在發送報文時選擇合適的轉發設備。
主機收到包含路由信息的RA報文后,會更新自己的路由表。當主機向其他設備發送報文時,通過查詢該列表的路由信息,選擇合適的路由發送報文。
主機收到包含默認設備優先級信息的RA報文后,會更新自己的默認路由列表。當主機向其他設備發送報文時,如果沒有路由可選,則首先查詢該列表,然后選擇本鏈路內優先級最高的設備發送報文;如果該設備故障,主機根據優先級從高到低的順序,依次選擇其他設備。
重定向
當網關設備發現報文從其它網關設備轉發更好,它就會發送重定向報文告知報文的發送者,讓報文發送者選擇另一個網關設備。重定向報文也承載在ICMPv6報文中,其Type字段值為137,報文中會攜帶更好的路徑下一跳地址和需要重定向轉發的報文的目的地址等信息。
重定向示例:
Host A需要和Host B通信,Host A的默認網關設備是Router A,當Host A發送報文給Host B時報文會被送到Router A。Router A接收到Host A發送的報文以后會發現實際上Host A直接發送給Router B更好,它將發送一個重定向報文給主機A,其中報文中更好的路徑下一跳地址為Router B,Destination Address為Host B。Host A接收到了重定向報文之后,會在默認路由表中添加一個主機路由,以后發往Host B的報文就直接發送給Router B。
當設備收到一個報文后,只有在如下情況下,設備會向報文發送者發送重定向報文:
- 報文的目的地址不是一個組播地址。
- 報文並非通過路由轉發給設備。
- 經過路由計算后,路由的下一跳出接口是接收報文的接口。
- 設備發現報文的最佳下一跳IP地址和報文的源IP地址處於同一網段。
- 設備檢查報文的源地址,發現自身的鄰居表項中有用該地址作為全球單播地址或鏈路本地地址的鄰居存在。