# IP-adress

## 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](/sv/glossary/#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](/sv/glossary/#firewall) 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](/sv/glossary/#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:

```text
>>> 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](/sv/privacy/) 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](https://www.rfc-editor.org/rfc/rfc791.html) —
  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](https://www.rfc-editor.org/rfc/rfc4291.html)
  — adresstyperna i IPv6, deras textformer och kravet på en länklokal adress.
- [RFC 5952: A Recommendation for IPv6 Address Text Representation](https://www.rfc-editor.org/rfc/rfc5952.html)
  — ett kanoniskt sätt att skriva en IPv6-adress, och problemen som fria
  stavningar ställer till med.
- [RFC 7239: Forwarded HTTP Extension](https://www.rfc-editor.org/rfc/rfc7239.html)
  — 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](https://www.rfc-editor.org/rfc/rfc5737.html)
  — de tre block som är avsedda för exempel.
- [ipaddress: IPv4/IPv6 manipulation library](https://docs.python.org/3/library/ipaddress.html)
  — Pythons standardmodul för att tolka, jämföra och gruppera adresser.

<https://engineer.company/sv/glossary/ip-address/>
