引子
双栈环境中,其中一个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(无效的)
该地址不能再用于发送和接收单播报文。在有效生命时间超时后,地址进入到无效的状态。
下图显示了自动配置地址的状态,以及首选状态和有效状态生命周期的关系。