9.7. Privénetwerken en NAT¶
IPv4 werd ontworpen met vier miljard adressen, wat destijds genoeg leek. Dat is het niet. Elk met het internet verbonden huis, kantoor en fabriek heeft zijn eigen blok adressen nodig voor zijn interne apparaten, en als je daar alle camera’s, telefoons en apparaten ter wereld bij optelt, blijven er geen vier miljard over.
De oplossing waar het internet voor koos zijn privénetwerken: de meeste apparaten op een lokaal netwerk gebruiken adressen die niet wereldwijd uniek zijn maar alleen binnen dat netwerk, en één apparaat aan de rand vertaalt tussen de twee werelden. De camera bevindt zich vrijwel altijd op een van deze privénetwerken.
9.7.1. De privéadresbereiken¶
Drie IPv4-bereiken zijn gereserveerd als niet routeerbaar op het openbare internet. Elk lokaal netwerk mag vrij adressen uit deze bereiken gebruiken zonder dat met iemand af te stemmen, omdat geen enkele router buiten het lokale netwerk ooit zal proberen er iets aan af te leveren:
10.0.0.0–10.255.255.255(16 miljoen adressen; gangbaar in grotere bedrijfsnetwerken).172.16.0.0–172.31.255.255(ongeveer een miljoen adressen; minder vaak in het wild aangetroffen).192.168.0.0–192.168.255.255(65 duizend adressen; de standaard voor vrijwel elke thuisrouter).
Op een typisch thuisnetwerk hebben zowel de camera als de laptop die ermee praat allebei een 192.168.x.x-adres, omdat dat het bereik is dat de thuisrouter kiest voor het netwerk dat hij host.
9.7.1.1. Hoe het netmasker wordt gebruikt¶
De pagina IP-adressen introduceerde de /24-notatie. De reden dat dit hier van belang is, is dat het netmasker bepaalt wat elk apparaat gebruikt om te beslissen waar een pakket vervolgens heen moet. Elke keer dat de camera een pakket verstuurt, past hij zijn eigen netmasker toe op het bestemmingsadres en kijkt hij naar het resultaat:
Als de bestemming de netwerkbits deelt met het eigen adres van de camera, bevindt de bestemming zich op het zelfde lokale netwerk. De camera stuurt het pakket er rechtstreeks naartoe.
Als de bestemming de netwerkbits niet deelt, moet hij zich op een ander netwerk bevinden. De camera stuurt het pakket naar zijn default gateway (de router die automatisch bij het tot stand komen van de verbinding is geconfigureerd) en laat de gateway de rest afhandelen.
Die ene test – “delen we netwerkbits?” – is waar het netmasker voor dient. Het is ook de reden dat thuisnetwerken standaard /24 gebruiken: een limiet van 254 apparaten past comfortabel binnen een huishouden en houdt het netwerk eenvoudig.
9.7.2. Network Address Translation¶
Een camera op 192.168.1.50 kan niet zomaar een pakket naar een server op het openbare internet sturen – het openbare internet routeert niet naar 192.168.x.x. De thuisrouter lost dit op met Network Address Translation, oftewel NAT, en doet dat transparant.
NAT herschrijft het bronadres van uitgaande pakketten naar het openbare adres van de router, en keert de herschrijving om bij binnenkomende antwoorden, zodat privéapparaten lijken één openbaar adres te delen.¶
De router heeft twee adressen: een privéadres op het lokale netwerk (vaak 192.168.1.1) en een openbaar adres dat door de internetprovider is toegewezen. Wanneer de camera een pakket naar een openbaar adres stuurt, doet de router het volgende
hij registreert het privéadres + de poort van de camera en koppelt dat aan een tijdelijke eigen uitgaande poort;
hij herschrijft het bronadres op het pakket naar zijn eigen openbare adres (en de bronpoort naar de gekozen uitgaande poort);
hij stuurt het herschreven pakket via de openbare zijde naar buiten.
Wanneer het antwoord terugkomt, geadresseerd aan het openbare adres + de poort van de router, zoekt de router de koppeling op, herschrijft de bestemming terug naar het privéadres + de poort van de camera, en levert het af op de lokale zijde. De camera merkt nooit dat de herschrijving heeft plaatsgevonden; de server weet nooit wat de oorspronkelijke bron was.
NAT is wat thuisnetwerken praktisch maakt. Het heeft ook twee gevolgen die het waard zijn om te kennen.
9.7.3. Wat NAT verandert¶
Uitgaand is eenvoudig. Een camera op een privénetwerk kan vrij naar buiten praten. Telkens wanneer hij een TCP-verbinding opent of een UDP-pakket naar een externe server stuurt, zet NAT automatisch de koppeling op. De meeste cameratoepassingen werken in deze richting: een afbeelding vastleggen, deze naar een server ergens pushen, het antwoord ontvangen.
Inkomend is lastig. Een apparaat op het openbare internet kan niet rechtstreeks verbinding maken met een camera op een privénetwerk. Er is geen koppeling die de router kan opzoeken wanneer een ongevraagd pakket op zijn openbare adres aankomt, dus het pakket heeft nergens heen te gaan. De router laat het ofwel vallen of geeft het door aan een service die op de router zelf draait.
Voor het inkomende geval zijn drie tijdelijke oplossingen gangbaar, ongeveer in oplopende volgorde van praktische bruikbaarheid:
Port forwarding. Configureer de router om alle inkomende pakketten op een gekozen openbare poort naar een specifiek privéapparaat te leiden. Vereist beheerderstoegang tot de router; broos wanneer het openbare adres van de router verandert.
VPN. Voer een virtueel privénetwerk uit dat de camera op hetzelfde logische netwerk plaatst als degene die hem moet bereiken. Zwaar; valt buiten het bestek van de meeste camera-implementaties.
Uitgaand geïnitieerde verbinding. De camera maakt verbinding naar buiten met een bekende server ergens op het openbare internet en houdt die verbinding open; de server gebruikt de bestaande verbinding om berichten terug te pushen. Zo werken pushmeldingen en de meeste protocollen voor cloudverbonden apparaten, en het is het patroon dat de meeste cameratoepassingen uiteindelijk gebruiken.
NAT is onzichtbaar voor de Python-code op de camera. Het script praat gewoon met de bestemming die het nodig heeft; de router handelt de vertaling achter de schermen af. Maar de richting van de verbinding is wél van belang, en NAT is de reden waarom “de camera reikt uit naar een cloudserver” een veel eenvoudiger vorm is dan “een cloudserver reikt in naar de camera”.