Pagine casuali di James Bottomley

Una delle recenti esperienze di Linux Plumbers Conference mi ha convinto che se vuoi far parte di una vera interazione peer-to-peer audio/video basata su WebRTC open source, hai bisogno di un indirizzo Internet che non sia dietro un NAT. In realtà, il protocollo funziona ancora finché puoi contattare un server stun per dirti qual è il tuo indirizzo esterno e possibilmente un server turn per proxy i pacchetti se entrambi gli endpoint sono nati, ma tutto questo cercare server esterni richiede tempo come quelli di voi che si sono lamentati del test echo trovato. La soluzione a tutto questo è connettersi su IPv6 che ha uno spazio di indirizzi abbastanza grande da supportare ogni dispositivo sul pianeta con il proprio indirizzo. Tutte le moderne distribuzioni Linux supportano IPv6 fuori dalla scatola, quindi è probabile che tu l’abbia usato accidentalmente senza mai accorgertene, che è una delle bellezze dell’autoconfigurazione IPv6 (dovrebbe funzionare solo).

Tuttavia, recentemente mi sono trasferito, e così ho perso la mia connessione Internet in fibra al cavo ma il cavo che è venuto con un indirizzo IPv6, quindi questa è la mia storia di far funzionare tutto. Se non ti interessa davvero le basi del protocollo, puoi saltare al come. Questa guida è anche focalizzata su una configurazione “dual stack” (uno che ha entrambi gli indirizzi IPv6 e IPv4). Sono possibili configurazioni IPv6 pure, ma poiché alcune parti di Internet sono ancora solo IPv4, non sono complete a meno che non si configuri un bridge incapsulante IPv4.

Le basi di IPv6

IPv6 è stato un protocollo maturo per molto tempo, quindi ho erroneamente pensato che ci sarebbe stato un carico di buoni HOWTO a riguardo. Tuttavia, dopo aver letto 20 diverse descrizioni di come funziona lo spazio degli indirizzi IPv6 a 128 bit e non molto altro, ho rinunciato alla disperazione e ho letto invece le RFC. Presumo che tu abbia letto almeno uno di questi HOWTO, quindi non devo andare in prefissi di indirizzi IPv6, suffissi, ID di interfaccia o sottoreti, quindi inizierò dove finisce la maggior parte degli HOWTO.

Come funziona IPv6?

In IPv4 c’è un protocollo chiamato dynamic host Configuration protocol (DHCP), quindi finché riesci a trovare un server DHCP puoi ottenere tutte le informazioni necessarie per connetterti (indirizzo locale, router, server DNS, time server, ecc.). Tuttavia, questo servizio deve essere impostato da qualcuno e IPv6 è progettato per configurare una rete senza di essa.

La prima ipotesi IPv6 StateLess Address AutoConfiguration (SLAAC) è che si trova su una sottorete /64 (quindi ogni sottorete in IPv6 contiene 1010 volte più indirizzi dell’intera Internet IPv4). Ciò significa che, poiché la maggior parte delle subnet reali contiene <100 sistemi, possono semplicemente scegliere un indirizzo casuale ed è molto improbabile che si scontrino con i sistemi esistenti. In effetti, ci sono tre modi attuali di scegliere un indirizzo nel /64:

  1. EUI-64 (RFC 4291) basato sull’indirizzo MAC che è fondamentalmente il MAC con un bit capovolto e ff:fe posizionato nel mezzo.
  2. Stable Private (RFC 7217) che genera da un hash basato su una chiave statica, un’interfaccia, un prefisso e un contatore (il contatore viene incrementato se c’è uno scontro). Questi sono preferiti a quelli EUI-64 che danno via qualsiasi configurazione associata all’indirizzo MAC (come il tipo di scheda di rete che hai)
  3. Indirizzi di estensione della privacy (RFC 4941) che sono molto simili agli indirizzi privati stabili tranne che cambiano nel tempo usando il meccanismo di deprecazione degli indirizzi IPv6 e sono per i sistemi client che vogliono preservare l’anonimato.

Il prossimo problema in Linux è chi configura l’interfaccia? Lo stack IPv6 del kernel è in realtà progettato per farlo, e lo farà a meno che non venga detto di non farlo, ma la maggior parte dei moderni controller di rete (come NetworkManager) sono maniaci del controllo e disabilitano la configurazione automatica del kernel in modo che possano farlo da soli. Hanno anche predefinito l’indirizzamento privato stabile utilizzando un segreto statico mantenuto nel filesystem (/var/lib/NetworkManager / secret_key).

La prossima cosa da capire sugli indirizzi IPv6 è che sono divisi in ambiti, il più importante è il collegamento di indirizzi locali (non instradabili) che convenzionalmente hanno sempre il prefisso fe80::/64. L’indirizzo locale di collegamento viene configurato prima utilizzando uno dei metodi precedenti e quindi utilizzato per sondare la rete.

Multicast e Neighbour Discovery

A differenza di IPv4, IPv6 non ha alcuna capacità di trasmissione, quindi tutta la scoperta viene eseguita da multicast. I nodi in arrivo sulla rete si abbonano a particolari indirizzi multicast, tramite pacchetti speciali intercettati dallo switch, e non riceveranno alcun multicast a cui non sono iscritti. Convenzionalmente, tutti gli indirizzi multicast locali di collegamento hanno il prefisso ff02:: / 64 (per altri tipi di indirizzo multicast vedere RFC 4291). Tutti i nodi sottoscrivono l’indirizzo multicast “tutti i nodi” ff02:: 1 e devono anche sottoscrivere il proprio indirizzo multicast del nodo sollecitato a ff02::1:ffXX:XXXX dove gli ultimi 24 bit corrispondono ai 24 bit più bassi dell’indirizzo IPv6 del nodo. Quest’ultimo è quello di evitare l’interruzione che si verificava in IPv4 dalle trasmissioni ARP perché ora è possibile indirizzare un sottoinsieme specifico di nodi per la risoluzione degli indirizzi.

IPV6 address resolution protocol è chiamato Prossimo Sollecitazione (NS), descritto nella RFC 4861 ed è in uso con SLAAC descritto in RFC 4862, ed è fatto con l’invio di un multicast per il prossimo sollecitazione indirizzo del nodo che si desidera scoprire con l’indirizzo IPv6 volete sapere, un nodo, con l’indirizzo corrispondente risponde con il suo strato di collegamento (MAC) l’indirizzo di in un Prossimo Annuncio (NA) pacchetto.

Una volta che un nodo ha scelto il suo indirizzo locale di collegamento, invia prima un pacchetto NS al suo indirizzo scelto per vedere se qualcuno risponde e se nessuno lo fa presuppone che sia OK mantenerlo altrimenti segue il protocollo di prevenzione delle collisioni associato alla sua particolare forma di indirizzo. Una volta trovato un indirizzo univoco, il nodo configura questo indirizzo locale di collegamento e cerca un router. Si noti che se una rete IPv6 non è presente, la scoperta si ferma qui, motivo per cui la maggior parte delle interfacce di rete mostra sempre un indirizzo IPv6 locale di collegamento.

Scoperta del router

Una volta che il nodo ha il proprio indirizzo locale di collegamento univoco, lo utilizza per inviare pacchetti di sollecitazione del router (RS) all’indirizzo multicast “tutti i router” ff02::2. Ogni router sulla rete risponde con un pacchetto Router Advertisement (RA) che descrive (tra le altre cose) la durata del router, l’MTU di rete, un insieme di uno o più prefissi di cui il router è responsabile, l’indirizzo di collegamento del router e una serie di flag di opzioni tra cui il flag M (Gestito) e O (Altra configurazione) e possibilmente un set di server DNS.

Ogni prefisso pubblicizzato contiene il prefisso e la lunghezza del prefisso, un set di flag tra cui A (configurazione autonoma) e L (collegamento locale) e un set di vite. I prefissi locali di collegamento ti dicono quali prefissi globali gli utenti della rete locale (potrebbero esserci più di uno) e se ti è permesso fare SLAAC sul prefisso globale (se il flag A è chiaro, devi chiedere al router un indirizzo usando DHCPv6). Se il router ha una durata diversa da zero, si può supporre che sia un router predefinito per la sottorete.

Ora che il nodo ha scoperto uno o più router può configurare il proprio indirizzo globale (si noti che ogni nodo instradabile IPv6 ha almeno due indirizzi: un collegamento locale e uno globale). Il modo in cui lo fa dipende dai flag del router e del prefisso

Configurazione dell’indirizzo globale

La prima cosa che un nodo deve sapere è se usare SLAAC per l’indirizzo globale o DHCPv6. Questo è interamente determinato dal flag A di qualsiasi prefisso locale di collegamento nel pacchetto RA. Se A è impostato, il nodo può utilizzare SLAAC e se A è chiaro, il nodo deve utilizzare DHCPv6 per ottenere un indirizzo. Se A è impostato e anche il flag M (Gestito), il nodo può utilizzare SLAAC o DHCPv6 (o entrambi) per ottenere un indirizzo e se il flag M è chiaro, ma il flag O (Altra configurazione) è presente, il nodo deve utilizzare SLAAC ma può utilizzare DHCPv6 per ottenere altre informazioni sulla rete (di solito DNS).

Una volta che il nodo ha un indirizzo globale ora ha bisogno di un percorso predefinito. Forma l’elenco di route predefinito dai pacchetti RA che hanno una durata del router diversa da zero. Tutti questi sono configurati come percorsi predefiniti per il loro indirizzo locale di collegamento con il conteggio hop specificato RA. Infine, il nodo può aggiungere percorsi prefissi specifici da pacchetti RA con zero durate del router ma prefissi locali non collegati.

DHCPv6 è un protocollo di configurazione abbastanza complesso (vedi RFC 8415) ma non può specificare né la lunghezza del prefisso (ovvero tutti gli indirizzi ottenuti sono configurati come /128) né le rotte (queste devono essere ottenute dai pacchetti RA). Ciò porta ad una sottigliezza nella selezione degli indirizzi in uscita in quanto il più specifico è sempre preferito, quindi se configuri sia da SLAAC che da DHCPv6, l’indirizzo SLAAC verrà aggiunto come /64 e l’indirizzo DHCPv6 come /128, il che significa che il tuo indirizzo IP in uscita sarà sempre quello DHCPv6 (anche se un’entità esterna conosce il tuo indirizzo SLAAC, sarà comunque in grado di raggiungerti su di esso).

Il Come: Configurare il proprio router domestico

Una delle cose che si potrebbe pensare da quanto sopra è che IPv6 si configura sempre automaticamente e, mentre è vero che se si collega semplicemente il laptop alla porta ethernet di un modem via cavo, si configurerà automaticamente, la maggior parte delle persone ha una configurazione domestica più complessa che coinvolge un router, che ha bisogno di qualche persuasione speciale prima che funzioni. Ciò significa che è necessario ottenere funzionalità aggiuntive dal proprio ISP utilizzando richieste DHCPv6 speciali.

Questa sezione è scritta dal mio punto di vista: Ho una rete IPv4 piuttosto complessa che ha una rete wifi completamente aperta ma limitata alla larghezza di banda (a client non attendibili) e diverse reti interne protette (una per il mio laboratorio, una per i miei telefoni e una per le videocamere domestiche), quindi ho bisogno di almeno 4 sottoreti per dare ad ogni dispositivo della mia casa un indirizzo IPv6. Uso anche OpenWrt come distribuzione del mio router, quindi tutte le informazioni di configurazione IPv6 sono altamente specifiche (anche se va notato che cose come NetworkManager possono anche fare tutto questo se sei pronto a scavare nella documentazione).

Prefix Delegation

Poiché DHCPv6 distribuisce solo un indirizzo /128, questo non è sufficiente perché è l’indirizzo IP del router stesso. Per diventare un router, è necessario richiedere la delega di parte dello spazio indirizzi IPv6 tramite l’opzione IA_PD (Identity Association for Prefix Delection) di DHCPv6. Una volta fatto questo, l’indirizzo IP del router verrà assunto dall’ISP come il percorso per tutti i prefissi delegati. La sottigliezza qui è che se vuoi più di una sottorete, devi chiederla in modo specifico (il client deve specificare la lunghezza esatta del prefisso che sta cercando) e poiché è una lunghezza del prefisso e la tua sottorete predefinita dovrebbe essere /64, se richiedi una lunghezza del prefisso di 64 hai solo una sottorete. Se si richiede 63 si dispone di 2 e così via. Il problema è come fai a sapere quante sottoreti l’ISP è disposto a darti? Sfortunatamente non c’è modo di trovarlo (ho dovuto fare una ricerca su Internet per scoprire che il mio ISP, Comcast, era disposto a delegare una lunghezza del prefisso di 60, ovvero 16 sottoreti). Se la ricerca non ti dice quanto il tuo ISP è disposto a delegare, potresti provare a partire da 48 e lavorare fino a 64 con incrementi di 1 per vedere quale sia la più grande delegazione che puoi ottenere (ci sono state segnalazioni di ISP che ti bloccano alla prima lunghezza del prefisso delegato, quindi non iniziare da 64). La sottigliezza finale è che il prefisso che stai delegato potrebbe non essere lo stesso prefisso dell’indirizzo ottenuto dal tuo router (la mia attuale configurazione di comcast ha il mio router a 2001:558:600a: but ma il mio prefisso delegato è 2601:600:8280:66d0:/60). Nota puoi eseguire odhcp6c manualmente con l’opzione-P se devi sondare il tuo ISP per scoprire quale dimensione del prefisso puoi ottenere.

Configurazione del router per la delega del prefisso

In termini OpenWrt, la configurazione del router WAN DHCP(v6) è controllata da /etc/default/network. Avrai già un’interfaccia WAN (probabilmente chiamata ‘wan’) per DHCPv4, quindi aggiungi semplicemente un’interfaccia aggiuntiva’ wan6 ‘ per ottenere un IPv6 aggiuntivo e diventare dual stack. Nella mia configurazione questo sembra

config interface 'wan6' option ifname '@wan' option proto 'dhcpv6' option reqprefix 60

La leggera stranezza è il nome if: @wan dice semplicemente alla configurazione di utilizzare lo stesso ifname dell’interfaccia ‘wan’. Nominarlo in questo modo è essenziale se la tua wan è un bridge, ma è comunque una buona pratica. L’altra opzione ‘reqprefix’ indica a DHCPv6 di richiedere una delega di prefisso /60.

Distribuire prefissi delegati

Questo risulta essere straordinariamente semplice. In primo luogo è necessario assegnare un prefisso delegato a ciascuna delle altre interfacce sul router, ma è possibile farlo senza aggiungere una nuova interfaccia OpenWrt per ciascuna di esse. La mia rete IPv4 interna ha tutti gli indirizzi statici, quindi aggiungi tre direttive a ciascuna delle interfacce:

config interface 'lan' ... interface designation (bridge for me) option proto 'static' ... ipv4 addresses option ip6assign '64' option ip6hint '1' option ip6ifaceid '::ff'

ip6assign ‘ N ‘ significa che sei una rete /N (quindi questo è sempre / 64 per me) e ip6hint ‘N’ significa usare N come ID della sottorete e ip6ifaceid ‘S’ significa usare S come suffisso IPv6 (Questo valore predefinito è ::1 quindi se stai bene, ometti questa direttiva). Quindi, dato che ho un prefisso 2601:600:8280:66d0::/60, l’indirizzo globale di questa interfaccia sarà 2601:600:8280:66d1::ff. Ora l’acid test, se hai capito bene, questo indirizzo globale dovrebbe essere ping da qualsiasi punto su Internet IPv6 (se non lo è, è probabile un problema di firewall, vedi sotto).

Pubblicità come router

Semplicemente ottenere delegato un prefisso delegato su un’interfaccia router locale è insufficiente . Ora è necessario ottenere il router per rispondere alle sollecitazioni del router su ff02:: 2 e opzionalmente fare DHCPv6. Sfortunatamente, OpenWrt ha due meccanismi per farlo, di solito entrambi installati: odhcpd e dnsmasq. Quello che ho trovato è che nessuna delle mie direttive in /etc/config/dhcp avrebbe avuto effetto fino a quando non ho disabilitato completamente odhcpd

/etc/init.d/odhcpd stop/etc/init.d/odhcpd disable

e dal momento che uso dnsmasq ampiamente altrove (DNS diviso per reti interne/esterne), mi andava bene. Descriverò in primo luogo quali opzioni hai bisogno in dnsmasq e in secondo luogo come puoi ottenerlo usando le voci nel file OpenWrt /etc/config/dhcp (lo trovo utile perché è sempre saggio controllare cosa OpenWrt ha messo in /var/etc/dnsmasq.file conf).

La prima opzione dnsmasq è necessario ‘enable-ra’, che è un parametro globale istruire dnsmasq per gestire annunci router. Il parametro successivo è necessario è il per-interfaccia ‘ra-param’ che specifica i parametri globali router pubblicità e deve apparire una volta per ogni interfaccia che si desidera pubblicizzare su. Infine l’opzione ‘dhcp-range’ consente una configurazione più dettagliata del tipo di flag RA e DHCPV6 opzionale.

SLAAC o DHCPv6 (o entrambi)

In molti modi questa è una questione di scelta personale. Se permetti a SLAAC, gli host che vogliono utilizzare gli indirizzi di estensione della privacy (come i telefoni Android) possono farlo, il che è una buona cosa. Se permetti anche la selezione degli indirizzi DHCPv6, avrai un elenco di indirizzi assegnati agli host e dnsmasq eseguirà la risoluzione DNS per loro (anche se può fare DNS per gli indirizzi SLAAC a condizione che venga detto su di loro). Esiste un tag speciale ‘constructor’ per l’opzione ‘dhcp-range’ che gli dice di costruire l’indirizzo fornito (per RA o DHCPv6) dal prefisso globale IPv6 dell’interfaccia specificata, che è il modo in cui si distribuiscono i nostri indirizzi di prefisso delegati. Le modalità per ‘ dhcp-range ‘sono’ ra-only ‘per disabilitare interamente DHCPv6,’ slaac ‘per consentire la selezione dell’indirizzo DHCPv6 e’ ra-stateless ‘ per disabilitare la selezione dell’indirizzo DHCPv6 ma consentire altre informazioni di configurazione DHCPv6.

Basato su tentativi ed errori (e infine esaminando lo scripting in / etc / init.d / dnsmasq) le opzioni OpenWrt necessarie per ottenere le opzioni dnsmasq di cui sopra sono

config dhcp lan option interface lan option start 100 option limit 150 option leasetime 1h option dhcpv6 'server' option ra_management '1' option ra 'server'

con ‘ ra_management ‘come opzione chiave con’ 0 ‘che significa SLAAC con opzioni DHCPv6,’ 1 ‘che significa SLAAC con DHCPv6 completo,’ 2 ‘che significa solo DHCPv6 e’ 3 ‘ che significa solo SLAAC. Un’altra stranezza di OpenWrt è che non sembra esserci un modo per impostare l’intervallo di lease: il valore predefinito è sempre static only o ::1000 to ::ffff.

Configurazione firewall

Una delle cose che fa impazzire le persone è il fatto che Linux ha due firewall completamente separati: uno per IPv4 e uno per IPv6. Se hai mai scritto regole personalizzate per loro, è probabile che tu l’abbia fatto in OpenWrt /etc/firewall.file utente e hai usato il comando iptables, il che significa che hai aggiunto solo le regole al firewall IPv4. Per aggiungere la stessa regola per IPv6 è necessario duplicarla utilizzando il comando ip6tables. Un altro problema significativo, se si utilizza un tracciamento della connessione per il rilevamento del knock della porta come lo sono io, è che il tracciamento della connessione Linux ha difficoltà con il multicast IPv6, quindi i pacchetti che escono in un multicast ma tornano come unicast (come la maggior parte dei protocolli di scoperta) ottengono lo stato conntrack sbagliato. Per risolvere questo problema, alla fine ho dovuto avere una regola di INPUT che accettava solo tutti ICMPv6 e DHCPv6 (porte udp 546 e 547 ). Le altre considerazioni sul firewall sono che ora ognuno ha il proprio indirizzo IP, non c’è bisogno di NAT (OpenWrt può essere persuaso a occuparsene automaticamente, ma se stai duplicando manualmente le regole IPv4, non duplicare le regole NAT). Quello finale è probabilmente più applicabile a me: la mia interfaccia wifi è progettata per essere un’estensione di Internet locale e tutte le macchine che si connettono ad esso dovrebbero essere in grado di proteggersi dal momento che migreranno in ambienti ostili come il wifi dell’aeroporto, quindi eseguo l’esposizione completa dei dispositivi connessi wifi a Internet generale per tutte le porte, comprese le sonde delle porte. Per i miei dispositivi interni, ho una regola CORRELATA e STABILITA per assicurarmi che non vengano rilevati poiché non sono progettati per migrare dalla rete interna.

Ora i problemi con OpenWrt: poiché si desidera che il NAT su IPv4, ma non su IPv6 si hanno due wan zone per loro: se si tenta di combinare la loro (come ho fatto), poi OpenWRT aggiungerà un IPv6 –ctstate INVALID regola che impedisce il Prossimo Scoperta dal lavoro a causa di conntrack problemi con IPv6 multicast, quindi il mio wan zone sono (beh, questa è una bugia, perché il mio firewall è ora realizzata a mano, ma questo è ciò che ho controllato lavorato prima di mettere mano firewall):

config zone option name 'wan' option network 'wan' option masq '1' ...config zone option name 'wan6' option network 'wan6' ...

E le regole di routing per la rete lan zona (completamente accessibile) sono

config forwarding option src 'lan' option dest 'wan'config forwarding option src 'lan' option dest 'wan6'config forwarding option src 'wan6' option dest 'lan'

Mettere Insieme: Ottenere i client IPv6 connessi

Ora che hai configurato il tuo router, tutto dovrebbe funzionare. Se lo ha fatto, l’interfaccia wifi del tuo laptop dovrebbe ora avere un indirizzo IPv6 globale

ip -6 address show dev wlan0

Se questo torna vuoto, devi abilitare IPv6 sulla tua distribuzione. Se ha solo un indirizzo link local (fe80:: prefix), IPv6 è abilitato ma il router non è pubblicitario (problemi di firewall sospetti con pacchetti di rilevamento o configurazione errata di dnsmasq). Se vedi un indirizzo globale, il gioco è fatto. Ora dovresti essere in grado di andare a https://testv6.com e ottenere un punteggio 10/10.

L’ultimo pezzo del puzzle è preferire la tua nuova connessione IPv6 quando DNS offre una scelta di indirizzi IPv4 o IPv6. Tutti i moderni client Linux dovrebbero preferire IPv6 quando disponibile se connesso a una rete dual stack, quindi prova if se esegui il ping, ad esempio, www.google.com e vedere un indirizzo IPv6 il gioco è fatto. In caso contrario, è necessario entrare nel torbido mondo dell’etichettatura degli indirizzi IPv6 (RFC 6724) e gai.conf.

Conclusione

L’aggiunta di IPv6 alla configurazione IPv4 esistente non è al momento una semplice operazione plug-in and go. Tuttavia, a condizione di comprendere una manciata di differenze tra i due protocolli, non è nemmeno un problema insormontabile. Ho anche sorvolato molti dei problemi che potresti incontrare con il tuo ISP. Alcune persone hanno riferito che i loro ISP distribuiscono solo un indirizzo IPv6 senza delega prefisso, nel qual caso penso che trovare un nuovo ISP sarebbe più saggio. Altri riferiscono che l’ISP delegherà solo un prefisso /64, quindi la tua scelta qui è eseguire solo una sottorete (probabilmente sufficiente per molte reti domestiche), o una sottorete maggiore di /64 e proibire SLAAC, che non è sicuramente una configurazione raccomandata. Tuttavia, a condizione che il tuo ISP sia ragionevole, questo post sul blog dovrebbe almeno aiutarti a iniziare.

Write a Comment

Il tuo indirizzo email non sarà pubblicato.