James Bottomley’ s random Pages

een van de recente ervaringen van Linux Plumbers Conference overtuigde me dat als je deel wilt uitmaken van een echte open source WebRTC gebaseerde peer to peer audio/video-Interactie, je een internetadres nodig hebt dat niet achter een NAT staat. In werkelijkheid werkt het protocol nog steeds zolang u contact kunt opnemen met een stun-server om u te vertellen wat uw externe adres is en mogelijk een turn-server om de pakketten te proxy als beide eindpunten zijn NATed, maar al dit zoeken naar externe servers kost tijd als degenen onder u die klaagden over de echo-test gevonden. De oplossing voor dit alles is om verbinding te maken via IPv6 die een adresruimte heeft die groot genoeg is om elk apparaat op de planeet te ondersteunen met zijn eigen adres. Alle moderne Linux distributies ondersteunen IPv6 out of the box, dus de kans is groot dat je het per ongeluk hebt gebruikt zonder het ooit te merken, wat een van de schoonheden is van IPv6 autoconfiguratie (het zou gewoon moeten werken).

echter, Ik ben onlangs verhuisd, en dus verloor ik mijn glasvezel internet verbinding met kabel, maar kabel die wel met een IPv6-adres, dus dit is mijn verhaal van het krijgen van het allemaal om te werken. Als je niet echt de zorg over het protocol basisprincipes, kunt u overslaan naar de hoe. Deze handleiding is ook gericht op een” dual stack ” configuratie (een die zowel IPv6 als IPv4 adressen heeft). Pure IPv6 configuraties zijn mogelijk, maar omdat sommige delen van het internet nog steeds alleen IPv4 zijn, zijn ze niet compleet tenzij u een IPv4 encapsulating bridge instelt.

de basis van IPv6

IPv6 is al lange tijd een volwassen protocol, dus ik nam ten onrechte aan dat er veel goede HOWTO ‘ s over zouden zijn. Echter, na het lezen van 20 verschillende beschrijvingen van hoe de IPv6 128 bit adres ruimte werkt en niet veel anders, Ik gaf in wanhoop en lees de RFCs in plaats daarvan. Ik neem aan dat je minstens één van deze HOWTO ’s hebt gelezen, dus ik hoef niet in IPv6-adresvoorvoegsels, achtervoegsels, interface-ID’ s of subnetten te gaan, dus ik begin waar de meeste HOWTO ‘ s eindigen.

Hoe werkt IPv6?

in IPv4 is er een protocol genaamd dynamic host configuration protocol (DHCP), dus zolang u een DHCP-server kunt vinden, kunt u alle informatie krijgen die u nodig hebt om verbinding te maken (lokaal adres, router, DNS-server, tijdserver, enz.). Deze service moet echter door iemand worden ingesteld en IPv6 is ontworpen om een netwerk zonder te configureren.

de eerste veronderstelling die IPv6 StateLess Address AutoConfiguration (SLAAC) maakt is dat het zich op een /64 subnet bevindt (dus elk subnet in IPv6 bevat 1010 keer zoveel adressen als het hele IPv4-internet). Dit betekent dat, aangezien de meeste echte subnetten <100 systemen bevatten, ze gewoon een willekeurig adres kunnen kiezen en zeer waarschijnlijk niet zullen botsen met de bestaande systemen. In feite zijn er drie huidige manieren om een adres te kiezen in de /64:

  1. EUI-64 (RFC 4291) gebaseerd op het MAC-adres dat in principe de MAC is met een beetje omgedraaid en ff:fe in het midden geplaatst.
  2. Stable Private (RFC 7217) die genereren van een hash gebaseerd op een statische sleutel, interface, prefix en een teller (de teller wordt verhoogd als er een clash is). Deze hebben de voorkeur boven de EUI-64 die elke configuratie weggeven die geassocieerd is met het MAC-adres (zoals het type netwerkkaart dat je hebt)
  3. Privacy Extension Addresses (RFC 4941) die zeer vergelijkbaar zijn met stabiele privéadressen, behalve dat ze in de loop van de tijd veranderen met behulp van het IPv6-adresafwijkingsmechanisme en zijn voor clientsystemen die anonimiteit willen behouden.

het volgende probleem in Linux is wie de interface configureert? De kernel IPv6 stack is eigenlijk ontworpen om het te doen, en zal het doen, tenzij verteld niet te doen, maar de meeste van de moderne netwerk controllers (zoals NetworkManager) zijn control freaks en zet de automatische configuratie van de kernel uit, zodat ze het zelf kunnen doen. Ze standaard ook naar stabiele private adressering met behulp van een statisch geheim onderhouden in het bestandssysteem (/var/lib/NetworkManager/secret_key).

het volgende wat je moet begrijpen over IPv6-adressen is dat ze zijn onderverdeeld in scopes, het belangrijkste zijn link lokale (niet-routebare) adressen die conventioneel altijd het voorvoegsel fe80::/64 hebben. Het lokale adres van de link wordt eerst geconfigureerd met behulp van een van de bovenstaande methoden en vervolgens gebruikt om het netwerk te doorzoeken.

Multicast en Neighbour Discovery

in tegenstelling tot IPv4 heeft IPv6 geen broadcast-mogelijkheid, dus alle discovery wordt gedaan door multicast. Nodes die op het netwerk verschijnen, abonneren zich op bepaalde multicast-adressen, via speciale pakketten die door de switch worden onderschept, en ontvangen geen multicast waarop ze niet zijn geabonneerd. Normaal gesproken hebben alle lokale multicast-adressen van koppelingen het voorvoegsel ff02:: / 64 (voor andere typen multicast-adressen zie RFC 4291). Alle knooppunten abonneren zich op het multicast-adres” alle knooppunten ” ff02:: 1 en moeten zich ook abonneren op hun eigen aangevraagde multicast-adres op ff02:: 1:ffXX: XXXX, waarbij de laatste 24 bits overeenkomen met de laagste 24 bits van het IPv6-adres van het knooppunt. Dit laatste is om de verstoring te voorkomen die zich vroeger voordeed in IPv4 van ARP-uitzendingen, omdat u nu een specifieke subset van knooppunten kunt richten voor adresresolutie.

het IPV6 address resolution protocol heet Neighbour Solicitation (NS), beschreven in RFC 4861 en het is gebruik met SLAAC beschreven in RFC 4862, en wordt gedaan door het verzenden van een multicast naar het neighbour solicitation adres van het knooppunt dat u wilt ontdekken met het volledige IPv6 adres dat u wilt weten, een knooppunt met het overeenkomende adres antwoordt met zijn link layer (MAC) adres in een Neighbour Advertising (NA) pakket.

zodra een knooppunt het lokale adres van de link heeft gekozen, stuurt het eerst een NS-pakket naar het gekozen adres om te zien of iemand antwoordt en als niemand het doet, gaat het ervan uit dat het OK is om het te behouden, anders volgt het het botsingsvermijdingsprotocol dat geassocieerd is met zijn specifieke vorm van adres. Zodra het een uniek adres heeft gevonden, configureert het knooppunt dit lokale adres van de link en zoekt het naar een router. Merk op dat als een IPv6-netwerk niet aanwezig is, discovery hier stopt, dat is waarom de meeste netwerkinterfaces altijd een link lokaal IPv6-adres tonen.

Router Discovery

zodra het knooppunt zijn eigen unieke link-lokaal adres heeft, gebruikt het dit om Rs-pakketten (Router Solicitation) te verzenden naar het multicast-adres “alle routers” ff02::2. Elke router op het netwerk reageert met een Router advertentie (Ra) pakket dat (onder andere) de levensduur van de router beschrijft, de netwerk MTU, een set van een of meer voorvoegsels waar de router verantwoordelijk voor is, het linkadres van de router en een set optievlaggen inclusief de M (Managed) en O (Other Configuration) vlag en eventueel een set DNS servers.

elk geadverteerd voorvoegsel bevat het voorvoegsel en de lengte van het voorvoegsel, een reeks vlaggen waaronder de A (autonome configuratie) en L (link local) en een reeks levens. De lokale voorvoegsels van de Link vertellen u welke globale voorvoegsels de lokale netwerkgebruikers (er kunnen meer dan één zijn) en of u SLAAC mag gebruiken op het globale voorvoegsel (als de A-vlag duidelijk is, moet u de router om een adres vragen met behulp van DHCPv6). Als de router een niet-nul levensduur heeft, kunt u aannemen dat het een standaard router voor het subnet is.

nu het knooppunt een of meer routers heeft ontdekt, kan het zijn eigen globale adres configureren (merk op dat elke IPv6 routeable knooppunt ten minste twee adressen heeft: een lokale en een globale link). Hoe het dit doet hangt af van de router en prefix flags

globale adresconfiguratie

het eerste wat een knooppunt moet weten is of SLAAC gebruikt moet worden voor het globale adres of DHCPv6. Dit wordt volledig bepaald door de A vlag van elke link lokale prefix in het RA pakket. Als A is ingesteld, dan mag het knooppunt SLAAC gebruiken en als A duidelijk is dan moet het knooppunt DHCPv6 gebruiken om een adres te verkrijgen. Als A is ingesteld en ook de vlag m (Managed) dan kan het knooppunt SLAAC of DHCPv6 (of beide) gebruiken om een adres te verkrijgen en als de vlag M duidelijk is, maar de vlag O (Other Config) aanwezig is dan moet het knooppunt SLAAC gebruiken, maar kan DHCPv6 gebruiken om andere informatie over het netwerk te verkrijgen (meestal DNS).

zodra het knooppunt een globaal adres heeft, heeft het nu een standaardroute nodig. Het vormt de standaard route lijst van de RA pakketten die een niet-nul Router levensduur hebben. Al deze zijn geconfigureerd als standaard routes naar hun link lokale adres met de RA opgegeven hop aantal. Tot slot kan het knooppunt specifieke prefix routes toevoegen van Ra pakketten met nul router levensduur maar niet link lokale prefixen.

DHCPv6 is een vrij complex configuratieprotocol (zie RFC 8415) maar het kan geen prefix lengte specificeren (wat betekent dat alle verkregen adressen zijn geconfigureerd als /128) of routes (deze moeten worden verkregen van Ra-pakketten). Dit leidt tot een subtiliteit van uitgaande adresselectie in die zin dat de meest specifieke altijd de voorkeur heeft, dus als je zowel door SLAAC als DHCPv6 configureert, zal het SLAAC-adres worden toegevoegd als /64 en het DHCPv6-adres als /128 wat betekent dat je uitgaande IP-adres altijd het DHCPv6-adres zal zijn (hoewel als een externe entiteit je SLAAC-adres kent, zullen ze je er nog steeds op kunnen bereiken).

Het Hoe: Het configureren van uw eigen Router voor thuis

een van de dingen die u zou denken uit het bovenstaande is dat IPv6 altijd automatisch configureert en, hoewel het waar is dat als u gewoon uw laptop aansluit op de ethernet-poort van een kabelmodem het gewoon automatisch configureert, de meeste mensen hebben een complexere thuisinstelling met een router, die wat speciale coaxing nodig heeft voordat het zal werken. Dat betekent dat u extra functies van uw ISP moet verkrijgen met behulp van speciale DHCPv6-Verzoeken.

dit gedeelte is geschreven vanuit mijn eigen standpunt: Ik heb een vrij complex IPv4-netwerk met een volledig open maar bandbreedte beperkt (tot niet-vertrouwde clients) wifi-netwerk, en verschillende beveiligde interne netwerken (een voor mijn lab, een voor mijn telefoons en een voor de huishoudelijke videocamera ‘ s), dus ik heb ten minste 4 subnetten nodig om elk apparaat in mijn huis een IPv6-adres te geven. Ik gebruik ook OpenWRT als mijn router distributie, dus alle IPv6 configuratie informatie is zeer specifiek voor het (hoewel het moet worden opgemerkt dat dingen als NetworkManager kan ook dit alles doen als je bereid bent om te graven in de documentatie).

Prefix delegatie

aangezien DHCPv6 alleen een /128-adres uitdeelt, is dit niet voldoende omdat het het IP-adres van de router zelf is. Om een router te worden, moet u delegatie van een deel van de IPv6-adresruimte aanvragen via de Identity Association for Prefix Delection (IA_PD) optie van DHCPv6. Zodra dit is gedaan zal het IP-adres van de router door de ISP worden aangenomen als de route voor alle gedelegeerde voorvoegsels. De subtiliteit hier is dat als je meer dan één subnet wilt, je er specifiek om moet vragen (de client moet de exacte prefix lengte specificeren waar het naar op zoek is) en omdat het een prefix lengte is, en je standaard subnet moet /64 zijn, heb je als je een prefix lengte van 64 aanvraagt slechts één subnet. Als je 63 vraagt, Heb je er 2 enzovoort. Het probleem is hoe weet je hoeveel subnetten de ISP bereid is om u te geven? Helaas is er geen manier om dit te vinden (ik moest een internet zoekopdracht doen om te ontdekken dat mijn ISP, Comcast, was bereid om een prefix lengte van 60 delegeren, wat betekent 16 subnetten). Als Zoeken je niet vertelt hoeveel je ISP bereid is om te delegeren, kun je proberen om te beginnen bij 48 en je weg te werken naar 64 in stappen van 1 om te zien wat de grootste delegatie is waarmee je weg kunt komen (er zijn meldingen van ISP ‘ s die je vergrendelen bij je eerste gedelegeerde voorvoegsel lengte, dus begin niet bij 64). De laatste subtiliteit is dat het voorvoegsel dat je hebt Gedelegeerd misschien niet hetzelfde voorvoegsel is als het adres dat je router heeft verkregen (mijn huidige comcast configuratie heeft mijn router op 2001:558:600a:… maar mijn gedelegeerde voorvoegsel is 2601:600:8280:66d0:/60). Opmerking U kunt odhcp6c handmatig uitvoeren met de-P optie als u uw ISP moet onderzoeken om uit te vinden welke grootte van prefix u kunt krijgen.

de Router configureren voor Prefix delegatie

in OpenWRT-termen wordt de WAN DHCP(V6) configuratie van de router gecontroleerd door /etc/default/network. Je hebt al een WAN-interface (waarschijnlijk genaamd ‘wan’) voor DHCPv4, dus je voegt gewoon een extra ‘wan6’ – interface toe om een extra IPv6 te krijgen en dual stack te worden. In mijn configuratie ziet dit eruit als

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

de kleine eigenaardigheid is de ifname: @wan vertelt de config om dezelfde ifname te gebruiken als de’ wan ‘ interface. Het zo noemen is essentieel als je wan een brug is, maar het is toch een goede oefening. De andere optie ‘reqprefix’ vertelt DHCPv6 om een /60 prefix delegatie aan te vragen.

het uitdelen van gedelegeerde voorvoegsels

blijkt opmerkelijk eenvoudig. Eerst moet je een gedelegeerd voorvoegsel toewijzen aan elk van je andere interfaces op de router, maar je kunt dit doen zonder een nieuwe OpenWRT interface toe te voegen voor elk van hen. Mijn interne IPv4 netwerk heeft alle statische adressen, dus voeg je drie richtlijnen toe aan elk van de interfaces:

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

ip6assign ‘ N ‘betekent dat je een a /n netwerk bent (dus dit is altijd /64 voor mij) en ip6hint’ N ‘betekent gebruik N als je subnet id en ip6ifaceid’ S ‘ betekent gebruik S als het IPv6 achtervoegsel (dit is standaard ::1 dus als je dat goed vindt, laat dan deze richtlijn weg). Dus gegeven dat ik een 2601:600:8280:66d0::/60 prefix heb, zal het globale adres van deze interface 2601:600:8280:66d1::ff zijn. Nu de acid test, als je dit goed hebt, moet dit globale adres overal op het IPv6 internet pingbaar zijn (als het niet zo is, is het waarschijnlijk een firewall probleem, zie hieronder).

adverteren als een Router

het is onvoldoende om een gedelegeerd prefix op een lokale routerinterface te krijgen . Nu moet je je router laten reageren op Routerverzoeken op ff02:: 2 en optioneel DHCPv6 doen. Helaas heeft OpenWRT twee mechanismen om dit te doen, meestal beide geà nstalleerd: odhcpd en dnsmasq. Wat ik ontdekte was dat geen van mijn richtlijnen in /etc/config/dhcp van kracht zou worden totdat ik odhcpd volledig

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

uitschakelde en aangezien ik dnsmasq uitgebreid elders gebruik (split DNS voor interne/externe netwerken), paste dat mij prima. Ik zal ten eerste beschrijven welke opties je nodig hebt in dnsmasq en ten tweede hoe je dit kunt bereiken met behulp van regels in het OpenWRT /etc/config/dhcp bestand (Ik vind dit nuttig omdat het altijd verstandig is om te controleren wat OpenWRT in de /var/etc/dnsmasq heeft gezet.conf bestand).

de eerste dnsmasq-optie die u nodig hebt is ‘enable-ra’, een algemene parameter die dnsmasq instrueert om routeradvertenties af te handelen. De volgende parameter die u nodig hebt is de per-interface ‘ra-param’ die de Globale router advertentie parameters specificeert en moet eenmaal verschijnen voor elke interface die u wilt adverteren op. Tot slot staat de optie ‘dhcp-range’ meer gedetailleerde configuratie toe van het type RA flags en optionele DHCPv6.

SLAAC of DHCPv6 (of beide)

in veel opzichten is dit een kwestie van persoonlijke keuze. Als u SLAAC toestaat, kunnen hosts die privacy extension adressen willen gebruiken (zoals Android-telefoons) dit doen, wat een goede zaak is. Als je ook DHCPv6 adresselectie toestaat heb je een lijst met adressen toegewezen aan hosts en dnsmasq zal DNS-resolutie voor hen doen (hoewel het DNS kan doen voor SLAAC-adressen op voorwaarde dat het over hen wordt verteld). Een speciale tag ‘ constructor ‘bestaat voor de’ dhcp-range ‘ optie die het vertelt om het opgegeven adres te construeren (voor RA of DHCPv6) van het IPv6 globale prefix van de opgegeven interface, dat is hoe je onze gedelegeerde prefix adressen deelt. De modi voor ‘dhcp-range ‘zijn’ alleen RA ‘om DHCPv6 volledig te verbieden,’ slaac ‘om DHCPv6-adresselectie toe te staan en’ Ra-stateless ‘ om DHCPv6-adresselectie toe te staan, maar om andere DHCPv6-configuratie-informatie toe te staan.

gebaseerd op trial and error (en tenslotte het onderzoeken van de scripting in /etc/init.d / dnsmasq) de OpenWRT opties die nodig zijn om de bovenstaande dnsmasq opties te bereiken zijn

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'

met ‘ra_management’ als de sleutel optie met ‘0’ betekent SLAAC met DHCPv6 opties, ‘1’ betekent SLAAC met volledige DHCPv6, ‘2’ betekent alleen DHCPv6 en ‘3’ betekent alleen SLAAC. Een andere OpenWRT eigenaardigheid is dat er geen manier lijkt te zijn om de lease range in te stellen: het is altijd standaard static only of ::1000 naar ::ffff.

Firewall configuratie

een van de dingen die mensen tript is het feit dat Linux twee volledig gescheiden firewalls heeft: een voor IPv4 en een voor IPv6. Als je ooit aangepaste regels voor hen hebt geschreven, is de kans groot dat je het deed in de OpenWRT /etc/firewall.gebruikersbestand en je hebt het iptables commando gebruikt, wat betekent dat je alleen de regels hebt toegevoegd aan de IPv4 firewall. Om dezelfde regel voor IPv6 toe te voegen moet je deze dupliceren met het commando ip6tables. Een ander belangrijk probleem, als je een verbinding tracking voor poort knock detectie gebruikt zoals ik, is dat Linux verbinding tracking problemen heeft met IPv6 multicast, dus pakketten die naar een multicast gaan maar terugkomen als unicast (zoals de meeste van de discovery protocollen doen) krijgen de verkeerde conntrack staat. Om dit op te lossen, moest ik uiteindelijk een invoerregel hebben die alle ICMPv6 en DHCPv6 (udp poorten 546 en 547) accepteert. De andere firewall overwegingen zijn dat nu iedereen zijn eigen IP adres heeft, er geen noodzaak is om NAT (OpenWRT kan worden overgehaald om dit automatisch te regelen, maar als je de IPv4 regels handmatig dupliceert, dupliceer dan de NAT regels niet). De laatste is waarschijnlijk meer van toepassing op mij: mijn WIFI-interface is ontworpen om een uitbreiding van het lokale internet en alle machines aansluiten op het worden verwacht in staat zijn om zichzelf te beschermen, omdat ze zullen migreren naar dergelijke vijandige omgevingen als Luchthaven wifi, dus ik doe volledige blootstelling van Wifi Aangesloten apparaten op het algemene internet voor alle poorten, met inbegrip van poort probes. Voor mijn interne apparaten, Ik heb een verwante, gevestigde regel om ervoor te zorgen dat ze niet getest omdat ze niet zijn ontworpen om te migreren van het interne netwerk.

nu de problemen met OpenWRT: omdat u wilt dat NAT op IPv4, maar niet op IPv6 heb je twee aparte wan-zones voor hen: als u probeert om ze te combineren (zoals ik eerst deed), dan OpenWRT zal het toevoegen van een IPv6 –ctstate ONGELDIGE regel die zal voorkomen dat de Naaste Ontdekking van werken door de conntrack problemen met IPv6 multicast, dus mijn wan-zones zijn (goed, dit is een leugen, want mijn firewall is nu met de hand vervaardigd, maar dit is wat ik gecontroleerd werkte voordat ik de hand vervaardigd firewall in plaats):

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

En de routing regels voor de lan-zone (volledig toegankelijk) zijn

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

Putting it Together: De Clients IPv6 verbinden

nu uw router geconfigureerd is, zou alles gewoon moeten werken. Als dat zo is, moet de WIFI-interface van uw laptop nu een globaal IPv6-adres

ip -6 address show dev wlan0

hebben als dat leeg is, moet u IPv6 op uw distributie inschakelen. Als er alleen een link lokaal (fe80:: prefix) adres, IPv6 is ingeschakeld, maar uw router is geen reclame (verdachte firewall problemen met discovery pakketten of dnsmasq misconfiguratie). Als je een wereldwijd adres ziet, ben je klaar. Nu moet je naar https://testv6.com kunnen gaan en een 10/10 score kunnen behalen.

het laatste stukje van de puzzel geeft de voorkeur aan uw nieuwe IPv6-verbinding wanneer DNS een keuze uit IPv4-of IPv6-adressen biedt. Alle moderne Linux clients zouden de voorkeur moeten geven aan IPv6 indien beschikbaar indien verbonden met een dual stack netwerk, dus probeer … als je ping, zeg, www.google.com en zie een IPv6-adres dat je klaar bent. Zo niet, dan moet je in de duistere wereld van IPv6-adresetikettering (RFC 6724) en gai komen.conf.

conclusie

IPv6 toevoegen aan en bestaande IPv4-instellingen is momenteel geen eenvoudige plug in and go-operatie. Echter, als je een handvol verschillen tussen de twee protocollen begrijpt, is het ook geen onoverkomelijk probleem. Ik heb ook verdoezeld over veel van de problemen die u zou kunnen tegenkomen met uw ISP. Sommige mensen hebben gemeld dat hun ISP ‘ s slechts één IPv6 adres uitdelen zonder prefix delegatie, in welk geval ik denk dat het vinden van een nieuwe ISP het verstandigste zou zijn. Anderen melden dat de ISP slechts één /64 prefix zal delegeren, dus je keuze hier is om slechts één subnet te draaien (waarschijnlijk voldoende voor veel thuisnetwerken), of een subnet groter dan /64 en slaap te verbieden, wat zeker geen aanbevolen configuratie is. Echter, op voorwaarde dat uw ISP redelijk is, moet deze blogpost op zijn minst helpen om u op weg.

Write a Comment

Het e-mailadres wordt niet gepubliceerd.