Een tijdje geleden werd ik door mijn provider benaderd met de vraag of ik deel wilde nemen aan een IPv6 pilot. Dat wilde ik natuurlijk wel. Aanvankelijk dacht ik het redelijk vlot aan de praat te hebben. Maar dat bleek tegen te vallen…

Met IPv6 werkt het allemaal net even anders als je gewend bent. Daar komt bij dat de beschikbare documentatie nog minimaal is, aangezien IPv6 relatief jong is en het met de uitrol niet echt storm loopt. En dan heb je ook nog te maken met het probleem dat de implementatie van IPv6 op je favoriete OS nog wel eens wil veranderen. Want ook daar staat het in de kinderschoenen. Dus als je dan eindelijk goede documentatie vindt, dan blijkt die inmiddels al niet meer te kloppen. Maar uiteindelijk is het toch gelukt. En als je eenmaal weet hoe het moet, dan valt het eigenlijk best mee. Met dit artikel heb je alvast een handvat, voor als het bij jouw provider ook zover is.

IPv6

Eerst een stukje achtergrond. Want hoe zit het nu precies met subnets? In tegenstelling tot IPv4 bepaal je die namelijk niet zelf. Dat was eigenlijk de eerste vraag die bij me opkwam. IPv6 is niet 32-bits, maar 128-bits. IPv6 maakt ook geen gebruik meer van subnet masks. Het gebruikt een dubbelepunt als scheiding tussen de blokken. En het gebruik heximale getallen.

Een IPv6-adres adres bestaat eigenlijk uit twee delen. De eerste 64-bits (4 blokken) vormen het net-adres. Dat bepaalt bij welk netwerk (lees: provider) het hoort. Het tweede gedeelte van 64-bits is het hostgedeelte en bepaalt om welke host het gaat. Dan bestaat het eerste gedeelte van 64-bits eigenlijk ook weer uit twee delen. De eerste 48-bits (3 blokken) vormen het eerder genoemde net-adres. De resterende 16-bits vervullen een speciale rol. Daarmee worden de subnets aangegeven.

 In feite worden de eerste 48-bits altijd door de provider bepaald. Dat zou betekenen dat je een volledig subnet-blok van 16-bits tot je beschikking zou hebben. Goed voor 216 = 65536 subnets. Zoveel subnets gebruikt niemand. Daarom hebben de meeste providers besloten om een prefix van 56-bits te geven. Dan is dus alleen de tweede helft van het subnet-blok beschikbaar voor de gebruiker. Goed voor 28 = 256 subnets. Voor vrijwel iedereen ruim voldoende.

 Fritzbox

Dan nu de praktijk. Zodra IPv6 werd aangezet, bleek dat eigenlijk direct goed te werken. Dat wil zeggen, als ik een doorsnee huis-tuin-en-keuken gebruiker zou zijn. Dat was bij mij echter niet het geval. En vermoedelijk bij de meeste lezers van Linux Magazine ook niet.

De door mijn provider geleverde router, een Fritzbox 7360, is bij mij niet veel meer dan een doorgeefluik. Al het inkomende verkeer wordt direct doorgestuurd naar een exposed host. Mijn server. En die server neemt de echte routing en firewalling voor zijn rekening.

Het eerste probleem waar ik tegen aan liep, was dat mijn Fritzbox netjes een IPv6-adres kreeg. En alle apparaten die direct waren aangesloten op de Fritzbox ook. In mijn geval was dat dus mijn server. Maar daarna hield het op. Alle apparaten die om mijn LAN (achter die server) zaten, kregen geen IPv6-adres.

De oplossing was simpel. De Fritzbox volledig verwijderen. Aangezien ik hem niet voor VoIP gebruikte, vervulde die eigenlijk toch al een overbodige rol.

FreeBSD

Nu moet ik iets opbiechten. Op mijn server thuis draait geen Linux, maar FreeBSD. En dat is dan ook waar ik het verder over ga hebben. Maar de basis blijft redelijk hetzelfde, want: UNIX. Dus ook voor Linux kan dit artikel waardevolle informatie bieden.

 Dus, Fritzbox weg en mijn glasvezelverbinding is rechtstreeks in mijn server. Voor IPv4 werkte dat verrassend goed. Mijn externe nic kreeg mijn vertrouwde IP-adres via dhcp toegewezen en werkte direct!

 IPv6 bleek iets lastiger. Daar zijn 2 stukjes software voor nodig, die op je juiste manier geconfigureerd moeten worden. Dan zijn rtadvd en dhcp6c.

 DHCP6c en rtadvd

Een provider zal een dhcp6-server draaien. Daarom moet je op je externe nic een dhcp6-client draaien. DHCP6c doet een verzoek (solicit, daarin lees je het woord solliciteren) om IPv6 adressen. De dhcp-server reageert daarop door adressen toe te wijzen.

Op de interne nic draait rtadvd. Dat is feitelijk een soort versimpelde dhcp6-server, speciaal bedacht voor het IPv6 protocol. Deze reageert op de solicits van de hosts in je LAN en wijst ze IPv6 prefixes toe. Welke prefixes dat moeten zijn, vraagt rtadvd aan dhcp6c.

DHCP6c vraagt dus aan de provider om een 56-bits prefix voor de externe nic. Dat is het eerste subnet. Vervolgens zal rtadvd een verzoek doen om een prefix en krijgt dan van dhcp6c een 64-bits prefix toegewezen. Voor elke NIC wordt een andere prefix gebruikt. Zodra een host de toegewezen 64-bits prefix van rtadvd heeft ontvangen, dan zal die zelf het resterende host-gedeelte generen.

 NIC-1: Eerste subnet: 2001:1000:2000:3000:xxxx:xxxx:xxxx:xxxx

NIC-2: Tweede subnet: 2001:1000:2000:3001:xxxx:xxxx:xxxx:xxxx

NIC-3: Derde subnet: 2001:1000:2000:3002:xxxx:xxxx:xxxx:xxxx

 dhcp6c.conf

De configuratie van dhcp6c er als volgt uit (zie afbeelding 2):

 

 

 

 

 

 

Afbeelding 2

• Regel 1 geeft aan dat dhcp6c op em0 (de externe nic) verzoeken naar de provider moet sturen.

• Regel 2 geeft aan dat er zgn Identity Association for Prefix Delegations verstuurd moeten worden naar ia-pd 1, die op regel 7 gedefinieerd wordt.

• Regel-10 en 11 bepalen het eerste subnet, die rtadvd op msk0 zal broadcasten. • Regel 15-18 bepalen een subnet voor een eventuele tweede nic. Let daarbij op regel 15 en 16.

rtadvd.conf

Hoe de configuratie van rtadvd eruit ziet is verder weinig interessant en doet wat het moet doen.

 rc.conf

Dan moet FreeBSD zelf nog ingesteld worden op IPv6. Dat gebeurt in /etc/rc.conf. Hoe die eruit ziet, zie je in afbeelding 4.

 

 

 

 

Afbeelding 4

• Regel 1 geeft aan dat FreeBSD als router moet fungeren voor het IPv6 verkeer tussen de verschillende nics.

• Regel 2 geeft aan wat de WAN interface is. De optie in regel-1 schakelt alle solicits namelijk uit, waardoor dhcp6c geen verzoeken meer kan versturen naar de provider. Deze optie zet dat weer expliciet aan voor de externe interface.

• Regel 3 stelt handmatig een IPv6-adres in voor de externe interface. Die bleek hij namelijk niet automatisch te krijgen. Van mijn provider kreeg ik te horen dat ik eenvoudig zelf een adres in kon stellen, uit het eerste beschikbare subnet. En dat de Fritzbox in feite precies hetzelfde doet.

• Regel 4 stelt de interne interface in op dhcp6. De optie -accept_rtadv is nodig op rtadvd op deze interface te laten broadcasten.

• Regel 5 en 6 laten dhcp6c op em0 draaien.

• Regel 7 en 8 laten rtadvd op msk0 draaien.

 Firewall

Tot slot is het natuurlijk belangrijk om je firewall op IPv6 aan te passen. Al je apparaten zijn niet beschermd door NAT en rechtstreeks vanaf het internet te benaderen. Hoe je dit precies doet, hangt van je eigen unieke situatie af en welke firewall je gebruikt. Het gaat dan ook te ver om daar in dit artikel op in te gaan.

 Wat wel erg belangrijk is, is dat je verkeer op UDP-poort 546 binnenlaat. En wel op het link-local adres van je externe nic. Doe je dat niet, dan krijgt dhcp6c geen antwoord op zijn verzoeken en dus ook geen lease.