• 一个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。

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

     
     
     
     
     
  • 相关阅读:
    Snmpwalk
    本地使用PostMan测试接口没有问题,但是线上直接进不了接口
    redis使用注意事项
    线程笔记
    springboot笔记
    springboot中多个地址指向同一个方法
    开发过程中遇到的注解
    使用maven时用到的一些问题
    遇到线程安全问题的案例
    mongodb
  • 原文地址:https://www.cnblogs.com/smith9527/p/IPv6.html
Copyright © 2020-2023  润新知