IP-adress
ett nummer som anger vart nätet ska leverera ett paket

Foto: Liza / Pixabay 
Foto: Violinka / Pixabay
Använd begreppet i ett beslut
Använd ”Vad är en IP-adress?” i ett konkret beslut. Vi kan knyta begreppet till systemet du bygger eller köper. Wi-Fi, brandväggar och fjärråtkomst uppsatta så att personalen kan arbeta varifrån som helst och bara rätt personer kommer in.
Granska antagandena bakom ordet
Använd förklaringen och det länkade arbetet för att formulera frågor till projektet. Vi kan undersöka antagandena tillsammans innan ett verktyg väljs. Förvaltade 30 VPS‑instanser med Ubuntu Linux — 30 förvaltade Linux‑servrar, med en plan för återställning
Vad det är
En IP-adress är det nummer som internetprotokollet skriver in i varje paket för att ange vart det ska, bredvid en andra adress som anger var det kom ifrån. I vardagligt tal kallas den ofta IP-nummer. RFC 791, specifikationen av IP version 4 från 1981, kallar den en internetadress och drar gränsen i en enda mening: ”En adress anger var den är.” Ett namn, till exempel en domän, säger vad du letar efter och måste först översättas till en adress, och det sköter DNS. Rutten, vägen mellan de två adresserna, lämnas åt routrarna däremellan.
I IPv4 är adressen 32 bitar, fyra oktetter, skriven som fyra decimaltal från 0 till 255 åtskilda av punkter: 192.0.2.10. RFC 791 delade bitarna i ett nätnummer och en lokal del, och tre fasta klasser avgjorde var delningen hamnade. Klasserna passade de flesta organisationer illa: ett klass C-nät rymde högst 254 värdar, ett klass B upp till 65 534, så klass B-numren tog slut medan routningstabellerna växte. I september 1993 ersatte RFC 1519 klasserna med CIDR, som låter delningen hamna efter vilken bit som helst och skriver dess position efter ett snedstreck. 192.0.2.0/24 är blocket vars första 24 bitar ligger fast: 256 adresser.
IPv6 vidgar adressen till 128 bitar. Den skrivs som åtta grupper med upp till
fyra hexadecimala siffror åtskilda av kolon, och RFC 4291 låter en följd av
nollgrupper dras ihop till ::, så att 2001:db8:0:0:0:0:2:1 också kan skrivas
2001:db8::2:1. Eftersom samma adress då kunde stavas på många sätt fastställde
RFC 5952 senare en rekommenderad form: gemener, inga inledande nollor i en grupp
och :: för den längsta följden av nollgrupper.
En adress hör till ett nätverksgränssnitt, inte till en maskin. Redan RFC 791 sa
att en enskild värd måste kunna uppträda som flera, med flera internetadresser,
och att vissa värdar har flera fysiska gränssnitt. RFC 4291 kräver att varje
IPv6-gränssnitt har minst en länklokal adress, som bara gäller på det egna
nätsegmentet, oavsett vilka andra adresser det har. En värd på ett nät som kör
båda versionerna har därför flera adresser samtidigt, förutom de
loopbackadresser den använder för att nå sig själv: blocket 127.0.0.0/8 i IPv4
och ::1 i IPv6.
Alla adresser går inte att nå varifrån som helst. RFC 1918 avsätter tre IPv4-block för privata nät, 10.0.0.0/8, 172.16.0.0/12 och 192.168.0.0/16, och säger att routningsinformation om dem inte ska föras vidare mellan organisationer. En enhet med en sådan adress når därför internet bara genom något som träder in i dess ställe, till exempel NAT, som RFC 3022 beskriver som en översättning av den privata adressen till en publik på vägen ut. Tre andra block, 192.0.2.0/24, 198.51.100.0/24 och 203.0.113.0/24, är reserverade av RFC 5737 för dokumentation, och RFC 3849 gör detsamma för 2001:db8::/32 i IPv6. Alla exempeladresser i den här artikeln kommer från dessa dokumentationsblock.
Varför det spelar roll
Adressen är den enda uppgiften om en klient som en server alltid har, eftersom svaret annars inte skulle ha någonstans att ta vägen. Därför är den standardnyckeln för många beslut: regler i en brandvägg tillåter eller blockerar per adress, en hastighetsbegränsning räknar förfrågningar per adress, en åtkomstlogg skriver den på varje rad och en missbruksanmälan nämner den. Var och en av dem fungerar bara så bra som adressen identifierar det du tror att den identifierar.
Den identifierar mindre än det verkar. Bakom NAT kan alla enheter på ett kontor eller i ett hushåll nå internet från samma publika IPv4-adress, så en spärr eller en gräns riktad mot en av dem träffar alla. Bakom en proxy eller ett CDN ser servern proxyns adress på varje förfrågan, och klientens egen adress kommer, om den alls kommer, i ett huvudfält som någon annan har skrivit. En regel skriven mot en adress är en regel om en position i nätet, aldrig om en person.
Samtidigt avslöjar den mer än folk tror. RFC 7239, som standardiserade
huvudfältet Forwarded som proxyer använder för att föra klientens adress
vidare, påpekar i sitt avsnitt om integritet att en IP-adress kan identifiera en
klient unikt, visa vilken operatör den använder och ge en ungefärlig bild av var
den befinner sig. En logg full av adresser är därför ett ansvar lika mycket som
ett verktyg, och ett gott skäl att bestämma vad du sparar innan du börjar spara
det.
Och nu finns det två sorter. Allt som tolkar, lagrar eller jämför adresser måste ta emot IPv4 och IPv6 lika väl, eftersom en klient på ett nät som erbjuder båda kan komma över vilken som helst av dem. Kod skriven när varje adress fick plats i femton tecken av siffror och punkter går sönder vid den första besökaren med IPv6, oftast någonstans långt från där adressen lästes.
Så ser det ut i praktiken
Pythons standardbibliotek har modulen ipaddress, som tolkar båda versionerna
och sköter räknandet, så att du aldrig behöver dela upp strängar för hand. I en
interaktiv session:
>>> import ipaddress
>>> ipaddress.ip_address("203.0.113.57")
IPv4Address('203.0.113.57')
>>> ipaddress.ip_address("2001:0DB8:0000:0000:0000:0000:0002:0001")
IPv6Address('2001:db8::2:1')
>>> ipaddress.ip_network("203.0.113.57/24", strict=False)
IPv4Network('203.0.113.0/24')
>>> ipaddress.ip_network("2001:db8:42:7::5/48", strict=False)
IPv6Network('2001:db8:42::/48')Det andra anropet visar den normalisering som RFC 5952 efterfrågar: den långa
stavningen med versaler och den korta med gemener är samma adress, och modulen
skriver ut den kanoniska formen. En sträng som 192.0.2.300 avvisas med ett
ValueError, eftersom 300 inte ryms i en oktett. De två sista anropen gör om en
adress till nätet runt den. Utan strict=False skulle modulen avvisa även dem,
eftersom 203.0.113.57/24 har värdbitar satta; med det nollställs värddelen, och
kvar står nätet ensamt.
Just den nollställningen använder den här webbplatsen på besökarnas adresser. Integritetssidan säger att IP-adressen aldrig lagras i sin helhet: den kortas av i samma ögonblick som loggraden skrivs, och den sista delen ersätts med nollor innan något når disken, så det som sparas identifierar ett ungefärligt nätverk där ett helt kontor och en hel gata kan se likadana ut. Sidan tillägger att servern registrerar adressen under två namn och maskerar båda, och att den tar bort de huvudfält som kan bära en egen adress, de som en företagsproxy eller ett nätverk för innehållsleverans lägger framför besökaren, innan raden skrivs. Den säger inte hur många bitar som överlever; /24 och /48 ovan är den här artikelns illustration, inte webbplatsens inställningar. Poängen håller ändå. En adress som aldrig skrivs i sin helhet kan inte läcka i sin helhet, och när den kortas av på vägen in beror det inte på ett städjobb som en dag kan sluta köras.
Var det går fel
Att lita på ett huvudfält för klientens adress. X-Forwarded-For och
standardfältet Forwarded är vanliga huvudfält i förfrågan, och RFC 7239 varnar
för att varje nod på vägen till servern kan ändra Forwarded, klienten själv
inräknad. Kod som tar den första adressen i listan låter varje klient välja sin
egen adress, och därmed sin egen hastighetsbegränsning och sin egen plats på en
tillåtelselista. Använd adressen i TCP-anslutningen, om inte förfrågan kom genom
en proxy som du själv driver, och läs i så fall bara det som dina egna proxyer
har lagt till, räknat från höger.
Att behandla en adress som en person. Eftersom många användare kan dela en adress kan en avstängning av en adress låsa ute ett helt kontor, och en gräns avsedd för en person stryper en hel skola. Använd adresser för grova beslut, sätt gränser med delade adresser i åtanke och knyt allt personligt till ett inloggat konto i stället.
Att jämföra adresser som text. 2001:db8::2:1 och 2001:DB8:0:0:0:0:2:1 är en adress och två olika strängar, så en tillåtelselista som jämför text godtar den ena och avvisar den andra. Tolka båda sidor innan du jämför, eller lagra bara formen från RFC 5952.
Att tolka för enbart IPv4. Ett reguljärt uttryck för fyra tal med punkter, en kolumn avsedd för femton tecken eller kod som delar värd och port vid det sista kolonet fallerar alla på IPv6. Använd en riktig parser och en kolumntyp eller längd som passar båda versionerna. När en port skrivs bredvid en IPv6-adress rekommenderar RFC 5952 hakparenteser, som i [2001:db8::1]:443, eftersom den sista gruppen annars skulle kunna läsas som en del av adressen.
Att behålla fulla adresser längre än nödvändigt. Loggar, analystabeller och säkerhetskopior samlar adresser i åratal om inget stoppar dem. Bestäm vilken precision du behöver, korta adressen när den skrivs i stället för efteråt, och ge resten ett utgångsdatum.
Att använda riktiga adresser i exempel. En exempelkonfiguration, en uppsättning testdata eller en skärmbild med någon annans riktiga adress skickar kopierad trafik till en främling. RFC 5737 reserverar sina tre block just för att minska den sortens konflikter och förvirring; använd dem, och 2001:db8::/32 för IPv6.
Läs mer
- RFC 791: Internet Protocol — specifikationen av IPv4 från 1981, med dess adress på 32 bitar och skillnaden mellan namn, adresser och rutter.
- RFC 4291: IP Version 6 Addressing Architecture — adresstyperna i IPv6, deras textformer och kravet på en länklokal adress.
- RFC 5952: A Recommendation for IPv6 Address Text Representation — ett kanoniskt sätt att skriva en IPv6-adress, och problemen som fria stavningar ställer till med.
- RFC 7239: Forwarded HTTP Extension — hur proxyer för en klients adress vidare, varför du inte utan vidare kan lita på resultatet och vad det kostar i integritet.
- RFC 5737: IPv4 Address Blocks Reserved for Documentation — de tre block som är avsedda för exempel.
- ipaddress: IPv4/IPv6 manipulation library — Pythons standardmodul för att tolka, jämföra och gruppera adresser.

