Domanda

In IPv6 rete, viene utilizzato il flag IPV6_V6ONLY per assicurare che una presa utilizza solo IPv6, ed in particolare quella IPv4 a IPv6 mappatura non sarà utilizzato per tale presa. Su molti OS, l'IPV6_V6ONLY non è impostato di default, ma su alcune di sistema operativo (ad esempio Windows 7), si è impostato di default.

La mia domanda è: Qual è stata la motivazione per l'introduzione di questa bandiera? C'è qualcosa di mapping IPv4 a IPv6 che stava causando problemi, e quindi la gente aveva bisogno di un modo per disattivarlo? Sembrerebbe a me che se qualcuno non voleva usare la mappatura IPv4 a IPv6, potrebbero semplicemente non specificare un indirizzo IPv6 IPv4-mapped. Che cosa mi manca qui?

È stato utile?

Soluzione

Non so il motivo per cui sarebbe di default; ma è il tipo di bandiere che avrei sempre messo esplicita, non importa quale sia il valore predefinito è.

A proposito perché esiste in primo luogo, credo che consente di mantenere solo IPv4 server esistenti, e basta eseguire nuovi sulla stessa porta, ma solo per le connessioni IPv6. O forse il nuovo server può client semplicemente tramite proxy a quello vecchio, rendendo la funzionalità IPv6 facile e indolore per aggiungere ai vecchi servizi.

Altri suggerimenti

Non tutte le piattaforme in grado Supporto IPv6 prese dualstack così la questione diventa come fanno le applicazioni che necessitano di maximimize compatibilità IPv6 sia conoscere dualstack è supportato o si legano separatamente quando il suo no? La risposta unica universale è IPV6_V6ONLY.

Una domanda ignorando IPV6_V6ONLY o scritto prima dualstack stack IP capaci esistevano possono trovare vincolante separatamente a V4 non riesce in un ambiente dualstack come IPv6 dualstack presa legano a IPv4 prevenire IPv4 presa vincolante. L'applicazione potrebbe non essere in attesa IPv4 su IPv6 a causa di protocollo o livello applicativo affrontare le preoccupazioni o controlli di accesso IP.

Questa o simili situazioni molto probabilmente indotto MS et al per difetto a 1 anche tho RFC3493 dichiara 0 di essere di default. 1 massimizza teoricamente compatibilità all'indietro. In particolare Windows XP / 2003 non supporta dualstack prese.

Ci sono anche non mancano le applicazioni che purtroppo hanno bisogno di passare più bassa informazioni strato di funzionare correttamente e quindi questa opzione può essere molto utile per pianificare una strategia di compatibilità IPv4 / IPv6 che meglio si adatta alle esigenze e basi di codice esistenti.

La ragione più spesso citato è il caso in cui il server ha una qualche forma di ACL (Access Control List). Per esempio, immaginate un server con regole come:

Allow 192.0.2.4
Deny all

Funziona su IPv4. Ora, qualcuno corre su una macchina con IPv6 e, a seconda di alcuni parametri, le richieste di IPv4 sono accettate sul socket IPv6, mappata come :: 192.0.2.4 e quindi non più di pari passo con la prima ACL. Improvvisamente, l'accesso sarebbe negato.

Essere esplicito nell'applicazione (utilizzando IPV6_V6ONLY) risolverebbe il problema, qualunque sia il sistema operativo di default è.

Per Linux, quando si scrive un servizio che ascolti su entrambe le prese IPv4 e IPv6 sulla stesso porta di servizio, ad esempio porta 2001, è necessario chiamare setsockopt (s, SOL_IPV6, IPV6_V6ONLY, e uno, sizeof (uno)); sul socket IPv6. Se non lo fai, l'operazione bind () per la presa IPv4 non riesce con "Indirizzo già in uso".

Ci sono modi plausibili in cui il (mal di nome) "IPv4-mappato" indirizzi possono essere utilizzati per eludere i sistemi mal configurati, o pile cattivo, o anche in un sistema ben configurato potrebbe anche richiedere quantità onerose di bugproofing. Uno sviluppatore potrebbe voler utilizzare questo flag per rendere la loro applicazione più sicuro non utilizzando questa parte della API.

See: http: // ipv6samurais.com/ipv6samurais/openbsd-audit/draft-cmetz-v6ops-v4mapped-api-harmful-01.txt

Immaginate un protocollo che include nella conversazione un indirizzo di rete, ad esempio, il canale dati per FTP. Quando si utilizza IPv6 si sta per inviare l'indirizzo IPv6, se il destinatario sembra essere un indirizzo IPv4 mappato non avrà alcun modo di collegare a tale indirizzo.

C'è un esempio molto comune in cui la dualità di comportamento è un problema. La chiamata getaddrinfo() serie con offerte AI_PASSIVE bandiera la possibilità di passare un nome nodo parametro e restituisce un elenco di indirizzi per l'ascolto su. Un valore speciale in forma di una stringa di NULL è accettato per nome nodo e implica l'ascolto su indirizzi jolly.

Su alcuni sistemi 0.0.0.0 e :: vengono restituiti in questo ordine. Quando presa dual-stack è abilitato di default e non si impostare la IPV6_V6ONLY presa, il collega di server a 0.0.0.0 e quindi non riesce a connettersi al dual-stack :: e quindi (1) funziona solo su IPv4 e (2) i rapporti di errore.

vorrei prendere in considerazione il torto ordine come si prevede di IPv6 da preferire. Ma anche quando si tenta primo dual-stack :: e poi solo IPv4 0.0.0.0, il server segnala ancora un errore per la seconda chiamata.

ritengo personalmente l'intera idea di un socket dual-stack un errore. Nel mio progetto avrei preferito sempre impostare in modo esplicito IPV6_V6ONLY di evitarlo. Alcune persone apparentemente visto come una buona idea, ma in quel caso avrei probabilmente esplicitamente IPV6_V6ONLY e tradurre NULL direttamente al 0.0.0.0 bypassando il meccanismo di getaddrinfo() disinserito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top