引子
雙棧環境中,其中一個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(首選的)
地址是有效的,它的唯一性已經被確認,並且它能用於不受限制的通信。節點能夠發送單播報文到首選地址,也可以接收從首選地址發來的單播報文。處於不確定和首選狀態地址的時間
- Preferred(首選的)
取決於路由通告消息(Router Advertisement message)中前綴信息選項(Prefix Information option)的首選生命周期(Preferred Lifetime)字段。
-
- Deprecated(老化的)
地址是有效的,它的唯一性已被確認,但是不建議(discouraged )在新的通信中使用它。已經存在的通信回話仍能夠使用老化的地址。節點能夠發送到老化地址的網口的單播報文,也可
- Deprecated(老化的)
以接收從首選地址發來的單播 報文。
- Invalid(無效的)
該地址不能再用於發送和接收單播報文。在有效生命時間超時后,地址進入到無效的狀態。
下圖顯示了自動配置地址的狀態,以及首選狀態和有效狀態生命周期的關系。

自動配置類型
有三種自動配置類型:
- Stateless(無狀態)
地址配置基於接收到的路由通告消息(Router Advertisement messages)。這些消息有可管理的地址配置(Managed Address Configuration)和其他的設置為0的狀態配置標志,
並且包括一個活多個前綴信息選項(Prefix Information option),每個選項設置自動標記為1。
- Stateful(有狀態)
配置基於使用有狀態的地址自動配置協議,例如DHCPv6,來獲取地址和其他配置選項。主機使用有狀態的地址自動配置,當它接收到路由通告消息沒有前綴信息選項,並且可管理
地址配置標志或其他有狀態配置標記設置為1。當本地鏈接中沒有其他路由的時候,主機也可以使用有狀態的地址自動配置。
- Both
配置基於收到包含前綴信息選項的路由通告消息,每個選項的自動標志設置為1,並且有可管理的地址配置,或者其他有狀態的配置標志設置為1。
對於所有自動配置類型,本地鏈接地址總是自動地配置的。