IPv6:接口 IP 操作在 HA 故障转移中使用浮动 IP 停止

IPv6: Interface IP operations are stopped with floating IP in HA failover

当主节点发生故障时,其IP(IPv6)浮动到备用节点。备用节点今后应该在该 IP 上提供服务。

鉴于这两个节点共存于同一个局域网中,经常会出现备用节点无法访问的情况。接口已打开,运行 已分配 IPv6 地址,但所有 IP 操作均已停止。

一种可能是重复地址检测 (DAD) 在待机配置 IP 时启动。 RFC 表示必须停止所有 IP 操作。

我的问题是关于 Linux 内核 IPv6 实现的细节。以前,从内核代码来看,我认为必须设置 sysctl 变量 "disable_ipv6"。但是内核并没有禁用 IPv6,它只是停止了该接口上的所有 IP 操作。

谁能解释 Linux 内核 IPv6 在 "disables these IP operations" DAD 失败时做了什么?这可以在不执行界面 DOWN & UP 的情况下重置为正常吗?代码中的任何指针都会非常有帮助。

本文详细阐述了规范和行为 w.r.t。内核中真正发生了什么 w.r.t。 IPv6 实现和浮动 IP 配置。它还提出了一个解决方案: http://criticalindirection.com/2015/06/30/ipv6_dad_floating_ips/

它提到 "user-assigned link-local",IPv6 分配卡在暂定状态,在内核中标记为 IFA_F_TENTATIVE。此状态表示 DAD 正在进行中且 IP 尚未验证。对于 "auto-assigned link-local",如果 DAD 失败,它会重试 accept_dad 次(每次使用新的自动生成的 IP),然后在该接口上禁用 IPv6。

它建议的解决方法是:在配置浮动IP前关闭DAD,当它不处于暂定状态时重新启用。

有关详细信息,请参阅上文 link。

这与 nova 中的一个错误有关,bug #101134

accept_daddocumentation 说:

accept_dad - INTEGER Whether to accept DAD (Duplicate Address Detection). 0: Disable DAD 1: Enable DAD (default) 2: Enable DAD, and disable IPv6 operation if MAC-based duplicate link-local address has been found.

因此您可以使用 sysctl -w net.ipv6.conf.default.accept_dad=0 解决该错误并禁用 DAD。

或者,您可以通过实施同一错误报告中 nova/virt/libvirt/firewall.py 的建议补丁来修复此错误。

如果 NWFilterFirewall class 中不存在,请添加以下静态方法:

def nova_no_nd_reflection_filter(self):
    """This filter protects false positives on IPv6 Duplicate Address
    Detection(DAD).
    """
    uuid = self._get_filter_uuid('nova-no-nd-reflection')
    return '''<filter name='nova-no-nd-reflection' chain='ipv6'>
              <!-- no nd reflection -->
              <!-- drop if destination mac is v6 mcast mac addr and
                   we sent it. -->
              <uuid>%s</uuid>
              <rule action='drop' direction='in'>
                  <mac dstmacaddr='33:33:00:00:00:00'
                       dstmacmask='ff:ff:00:00:00:00' srcmacaddr='$MAC'/>
              </rule>
              </filter>''' % uuid

然后,通过添加以下内容将此过滤器添加到 _ensure_static_filters() 中的过滤器列表:

self._define_filter(self.nova_no_nd_reflection_filter())

定义filter_set后。