9

Quando un nodo principale si guasta, il suo IP (IPv6) galleggia sul nodo standby. Il nodo standby dovrebbe fornire il servizio da quel momento in poi su quell'IP.IPv6: le operazioni IP dell'interfaccia vengono interrotte con IP mobile nel failover HA

Dato che entrambi questi nodi coesistono nella stessa LAN, spesso si vede che il nodo di standby diventa irraggiungibile. L'interfaccia è attiva e in esecuzione con l'indirizzo IPv6 assegnato, ma tutte le operazioni IP vengono interrotte.

Una possibilità è il rilevamento di indirizzi duplicati (DAD) che si avvia quando l'IP viene configurato in standby. La RFC dice che tutte le operazioni IP devono essere fermate.

La mia domanda riguarda le specifiche nell'implementazione IPv6 del kernel Linux. Precedentemente, dal codice del kernel, supponevo che la variabile sysctl "disable_ipv6" debba essere impostata. Ma il kernel non disabilita IPv6, si limita a interrompere tutte le operazioni IP su quell'interfaccia.

Qualcuno può spiegare cosa fa il kernel Linux IPv6 quando "disabilita queste operazioni IP" in caso di errore DAD? Può essere ripristinato alla normalità senza eseguire l'interfaccia DOWN & SU? Qualsiasi suggerimento nel codice sarà molto utile.

+0

Un bug OpenStack su linee simili: https://bugs.launchpad.net/nova/+bug/1011134 – user31986

+0

Questo è solo un delicato promemoria per far apparire il post: apprezzerei davvero se ci fossero delle intuizioni dalla community . Il BOUNTY termina tra 1 ora. Grazie! – user31986

+0

'dmesg' mostra il messaggio di indirizzo duplicato rilevato? – ssnobody

risposta

2

Questo articolo elabora le specifiche e il comportamento w.r.t. cosa sta realmente accadendo nel kernel w.r.t. Implementazione IPv6 e configurazione IP mobile. Si suggerisce anche una soluzione: http://criticalindirection.com/2015/06/30/ipv6_dad_floating_ips/

Si parla di "user-assegnato link-local", l'allocazione IPv6 si blocca in stato di tentativo, segnata dalla IFA_F_TENTATIVE nel kernel. Questo stato implica che il DAD è in corso e che l'IP non è ancora stato convalidato. Per "auto-assegnato link-local", se il DAD fallisce ripete accept_dad times (con il nuovo IP auto-generato ogni volta), e dopo di ciò disabilita IPv6 su quell'interfaccia.

La soluzione suggerita è: Disabilitare DAD prima di configurare l'IP mobile e riattivarlo quando è fuori dallo stato provvisorio.

Per ulteriori dettagli, fare riferimento al collegamento sopra.

+0

Questo articolo è una buona lettura! Penso che potresti migliorare il tuo interlocutore se ne prendi le parti rilevanti e le hai ripubblicate qui, ma io sto invitando comunque. Modificherei il tuo post da solo ma non so quale sia l'etichetta per quello. – ssnobody

+0

Grazie ssnobody, ho aggiornato la risposta con qualche dettaglio. Anche se, ho lasciato l'intero scenario a cui fare riferimento nell'articolo. – user31986

+0

Non ritiene che disabilitando le operazioni IP in caso di errore DAD, IPv6 impone deliberatamente una politica? Un valore di errore restituito all'utente avrebbe potuto essere migliore, in cui l'utente poteva quindi utilizzarlo per decidere ulteriori azioni se disabilitare le operazioni IP o consentire. Questo sicuramente rovina uno scenario valido come IP floating. Nel complesso, una buona ragione per la modifica RFC. – user31986

0

Questo è legato ad un bug in nova, bug #101134

Il documentation per accept_dad dice:

accept_dad - INTEGER Se accettare DAD (duplicate Indirizzo di rilevamento). 0: Disabilita DAD 1: Abilita DAD (predefinito) 2: Abilita DAD e disabilita l'operazione IPv6 se è stato trovato l'indirizzo locale di collegamento duplicato basato su MAC .

Quindi è possibile utilizzare sysctl -w net.ipv6.conf.default.accept_dad=0 per risolvere il problema e disabilitare DAD.

In alternativa, è possibile correggere questo errore implementando le patch proposte su nova/virt/libvirt/firewall.py da quello stesso bug report.

Se non è già presente nella classe NWFilterFirewall, aggiungere il seguente staticmethod:

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 

Quindi, aggiungere questo filtro per i vostri elenchi di filtri in _ensure_static_filters() aggiungendo:

self._define_filter(self.nova_no_nd_reflection_filter()) 

dopo filter_set è definito.

+0

Non è necessario che dad_transmit sia reso zero? – user31986

+0

Credo che disabilitare DAD sia ciò che vuoi ottenere. – ssnobody