一個IPv6地址綁定失敗的問題


引子

   雙棧環境中,其中一個IPv6地址綁定失敗,日志中沒有打印具體的錯誤信息。

問題原因

    在環境中,bond6設備中,雖然協議層處於UP狀態,但是bond設備中所有的網口都是down,所以其IPv6地址處於tentative狀態。

bond6設備信息如下所示:

# ip addr show dev bond6
32: bond6: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 98:f5:37:e2:f3:ad brd ff:ff:ff:ff:ff:ff
    inet 198.116.16.180/16 scope global bond6
    inet 10.229.142.32/24 brd 10.229.142.255 scope global bond6
    inet6 2000:10:229:142::32/64 scope global tentative
       valid_lft forever preferred_lft forever

 

使用測試程序測試顯示,錯誤碼是99,為不能賦值為請求的地址:

# ./a.out 2000:10:229:142::32
UDP:Fail to bind<-1><99><Cannot assign requested address>

 

  查找有關IPv6地址狀態的信息,tentative狀態的地址正在確認在本地鏈路的唯一性,因此不可使用,

不能發送和接收單播地址,因此也就不能在socket中綁定。

 

解決方案一:

配置IPv6地址時,設置CONFFLAG為 nodad,如下所示

# ip -6 addr add 2000:10:229:142::32/64 dev bond6 nodad
# ip addr show dev bond6
38: bond6: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 98:f5:37:e2:f3:ad brd ff:ff:ff:ff:ff:ff
    inet 198.116.16.180/16 scope global bond6
    inet 10.229.142.32/24 brd 10.229.142.255 scope global bond6
    inet6 2000:10:229:142::32/64 scope global nodad
       valid_lft forever preferred_lft forever

 

CONFFLAG為nodad的IPv6可以綁定成功:
# ./a.out 2000:10:229:142::32
bind 2000:10:229:142::32 success!

 

解決方案二:

設置網口accetp_dad值為0

# echo 0 > /proc/sys/net/ipv6/conf/default/accept_dad
# echo 0 > /proc/sys/net/ipv6/conf/all/accept_dad
# echo 0 > /proc/sys/net/ipv6/conf/bond6/accept_dad

 

# ifconfig eth2 down
# ifconfig bond6 down
#   ip addr show dev bond6

38: bond6: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 98:f5:37:e2:f3:ad brd ff:ff:ff:ff:ff:ff
    inet 198.116.16.180/16 scope global bond6
    inet 10.229.142.32/24 brd 10.229.142.255 scope global bond6
    inet6 2000:10:229:142::32/64 scope global
       valid_lft forever preferred_lft forever

經測試,這種情況下,IPv6地址狀態不是tentative,可以綁定到socket上。

 

 

 

以下信息摘自《Understanding_IPv6》一書,翻譯過來供大家參考

地址自動配置概述

  IPv6其中一個最有用的方面是它的自動配置自己的能力,即使它不使用像DHCPv6這樣的全狀態地址自動配置協議。默認情況下,一個IPv6主機能夠為每個網口配置一個本地地址(link-local address)。

通過使用路由發現功能(router discovery),一個主機也能夠確定路由器地址,其他配置參數,附加地址和本地前綴(on-link prefixes).在路由通告消息(Router Advertisement message )中包含全狀態

地址自動配置協議是否使用的標識字段。

 

自動配置地址狀態

自動配置地址處於下面的其中一個或更多的狀態中:

  • Tentative(不確定/探測的)

      地址處於驗證是否是唯一的過程。驗證需要通過重復地址探測(duplicate address detection,簡稱DAD)進行。一個節點(主機)不能接收發送到處於不確定性狀態的地址的單播報文。

 

        但是,它能夠接收和處理組播近鄰通告消息( multicast Neighbor Advertisement messages),該消息是對在重復地址探測過程中發送的近鄰請求消息(Neighbor Solicitation message)的響應。

 

 

  • Valid(有效的)

           地址能夠用於發送和接收單播報文。有效狀態包括首選(preferred)狀態和老化(deprecated)狀態。地址處於不確定,首選和老化狀態的總時間是由路由通告消息中的前綴信息選項

 

     (the Prefix Information option)的有效生命時間(Valid Lifetime)決定的。

 

    • Preferred(首選的)

      地址是有效的,它的唯一性已經被確認,並且它能用於不受限制的通信。節點能夠發送單播報文到首選地址,也可以接收從首選地址發來的單播報文。處於不確定和首選狀態地址的時間

 

                   取決於路由通告消息(Router Advertisement message)中前綴信息選項(Prefix Information option)的首選生命周期(Preferred Lifetime)字段。

 

 

    • Deprecated(老化的)

      地址是有效的,它的唯一性已被確認,但是不建議(discouraged )在新的通信中使用它。已經存在的通信回話仍能夠使用老化的地址。節點能夠發送到老化地址的網口的單播報文,也可

 

                   以接收從首選地址發來的單播 報文。

 

  • Invalid(無效的)

            該地址不能再用於發送和接收單播報文。在有效生命時間超時后,地址進入到無效的狀態。

 

       下圖顯示了自動配置地址的狀態,以及首選狀態和有效狀態生命周期的關系。

 

 

圖1.自動配置地址的狀態
 
注意
除了自動配置用於本地鏈路地址之外,地址自動配置僅指定用於主機。路由必須通過另外的方式獲取地址和配置參數,比如手工配置。

自動配置類型

 有三種自動配置類型:

  • Stateless(無狀態)

    地址配置基於接收到的路由通告消息(Router Advertisement messages)。這些消息有可管理的地址配置(Managed Address Configuration)和其他的設置為0的狀態配置標志,

         並且包括一個活多個前綴信息選項(Prefix Information option),每個選項設置自動標記為1。

  • Stateful(有狀態)

    配置基於使用有狀態的地址自動配置協議,例如DHCPv6,來獲取地址和其他配置選項。主機使用有狀態的地址自動配置,當它接收到路由通告消息沒有前綴信息選項,並且可管理

         地址配置標志或其他有狀態配置標記設置為1。當本地鏈接中沒有其他路由的時候,主機也可以使用有狀態的地址自動配置。

  • Both

    配置基於收到包含前綴信息選項的路由通告消息,每個選項的自動標志設置為1,並且有可管理的地址配置,或者其他有狀態的配置標志設置為1。

 

    對於所有自動配置類型,本地鏈接地址總是自動地配置的。

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM