一个IPv6地址绑定失败的问题

Posted supersmith

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个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。

 

    对于所有自动配置类型,本地链接地址总是自动地配置的。

 
 
 
 
 

以上是关于一个IPv6地址绑定失败的问题的主要内容,如果未能解决你的问题,请参考以下文章

有关Linux ipv6模块加载失败的问题

Win8 localhost绑定的ipv6,无法改绑ip4地址?

尝试将python套接字绑定到IPv6地址时参数无效

ipset如何支持ipv6?

苹果过审ipv6问题

如何通过路由器部署ipv6环境