Kirjoittaja Aihe: Ihmettelen IP-osoitejuttua  (Luettu 2536 kertaa)

USakari

  • Käyttäjä
  • Viestejä: 224
    • Profiili
Ihmettelen IP-osoitejuttua
« : 25.01.21 - klo:22.57 »
Tämä on tällainen Internet-osoite-juttu, jota joskus aina ihmettelen. (Tässä ei siis ole mitään viasta kysymys. Päinvastoin, homma toimii hyvin - haluaisin vain ymmärtää, miten se toimii.)

Meillä on kotona sisäverkko, jossa laitteet (tietokoneet/tabletit/puhelimet) ovat kiinni valokuitupäätelaitteen hoitelemassa WLANissa. Sisäverkon IP-osoitteet ovat kaikki tyyppiä 192.168.10.xxx. Ulospäin IP-osoite on kuitenkin kaikilla sama, minkä voi todeta esimerkiksi ottamalla selaimella yhteyden osoitteeseen fast.com.

No. Tarkistanpa tällä tavalla nettiyhteyden nopeuden laitteella A (sisäinen osoite 192.168.10.106), ja saan vastauksen fast.comista laitteelle A. Hyvä.

Myöhemmin teen saman homman laitteella B (sisäinen osoite 192.168.10.111) ja saan vastauksen laitteelle B. Taas hyvä.

Mutta fast.com ilmoittaa kummassakin tapauksessa osoitteekseni yllämainitun ulkoisen osoitteen, eli se on sama sekä laitteella A että laitteella B. Miten fast.comin vastaus ohjautuu kuitenkin oikealle laitteelle? Viitsisikö joku selittää? Kiitos jo etukäteen!



Ganymedes

  • Käyttäjä
  • Viestejä: 3915
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #1 : 25.01.21 - klo:23.26 »
Tuosta heti alusta löytyy tietyn tasoinen selitys asialle - tuo mitä kuvasit on NATin idea. Loppudokumentti on sitten täydellisempää selitystä - tosin osin Cisco specifistä :)

https://www.cisco.com/c/en/us/support/docs/ip/network-address-translation-nat/26704-nat-faq-00.html

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #2 : 26.01.21 - klo:08.17 »
Enkku wikissäkin ihan hyvä artikkeli NAT toiminnasta:

https://en.wikipedia.org/wiki/Network_address_translation


USakari

  • Käyttäjä
  • Viestejä: 224
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #3 : 26.01.21 - klo:09.29 »
Tuosta heti alusta löytyy tietyn tasoinen selitys asialle - tuo mitä kuvasit on NATin idea. Loppudokumentti on sitten täydellisempää selitystä - tosin osin Cisco specifistä :)

https://www.cisco.com/c/en/us/support/docs/ip/network-address-translation-nat/26704-nat-faq-00.html
Kiitos, mutta oma tasoni on mainitsemasi "tietyn tason" alapuolella. Selvästi.

USakari

  • Käyttäjä
  • Viestejä: 224
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #4 : 26.01.21 - klo:10.08 »
Enkku wikissäkin ihan hyvä artikkeli NAT toiminnasta:

https://en.wikipedia.org/wiki/Network_address_translation
Kiitos, ja on siellä hyvän näköinen kuvakin.  8)

Näytti siltä, että NAT käyttää IP-osoitteen lisäksi porttia jonkinlaisena tarkennusosoitteena.  Eli jos sisäverkon laitteelta tulee nettihaku (sisäinen osoite A, portti P) ulkoiseen osoitteeseen U ja toiselta laitteelta samanlainen haku (sisäinen osoite B, portti P) samaan osoitteeseen U, niin NAT vaihtaa A:n hakuun portiksi Q:n ja B:n hakuun portiksi R, ja molempiin tulee osoitteeksi tulee päätelaitteen C .

Kun sitten nettihaun vastaus tulee osoitteesta U ja portista Q tai R, niin portin perusteella tiedetään, ohjataanko se A:lle vai B:lle, ja osoite vaihdetaan vastaavasti – niin, ja myös portti vaihdetaan.

Mutta entä sitten, jos sisäisellä laitteella (vaikkapa Ubuntu-tietokoneella) on kaksi käyttäjää, jotka molemmat tekevät nettihakuja, vieläpä samalla ohjelmalla, jolloin hakujen lähtöosoitteet ovat samat ja portitkin ovat samat?


nm

  • Käyttäjä
  • Viestejä: 16429
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #5 : 26.01.21 - klo:11.44 »
Näytti siltä, että NAT käyttää IP-osoitteen lisäksi porttia jonkinlaisena tarkennusosoitteena.  Eli jos sisäverkon laitteelta tulee nettihaku (sisäinen osoite A, portti P) ulkoiseen osoitteeseen U ja toiselta laitteelta samanlainen haku (sisäinen osoite B, portti P) samaan osoitteeseen U, niin NAT vaihtaa A:n hakuun portiksi Q:n ja B:n hakuun portiksi R, ja molempiin tulee osoitteeksi tulee päätelaitteen C .

Kun sitten nettihaun vastaus tulee osoitteesta U ja portista Q tai R, niin portin perusteella tiedetään, ohjataanko se A:lle vai B:lle, ja osoite vaihdetaan vastaavasti – niin, ja myös portti vaihdetaan.

Jep, noinhan se menee. Ehdin kirjoitella hieman pidemmän selvityksen, joten laitan sen vielä tähän:


Kun avaat kotikoneesi nettiselaimella sivun https://fast.com, selain selvittää ensin palvelimen IP-osoitteen DNS:n avulla. Olkoon se vaikka 23.13.33.111 (kyseessä on Akamain kautta hajautettu palvelu, joten eri selvityskerrat palauttavat eri osoitteen). Sitten selain lähettää HTTP-protokollan mukaisen GET-pyynnön TLS-salattuna osoitteen 23.13.33.111 porttiin 443, joka on siis standardi HTTPS:n TCP/IP-porttinumero. Salaamaton HTTP-pyyntö lähetettäisiin porttiin 80. Palvelin vastaa kyselyyn lähettämällä takaisin index.html-sivun sisällön.

Pykälää matalammalla tasolla viestinvälitys perustuu TCP/IP-protokollalla muodostettavaan yhteyteen, jossa viestejä kulkee itse asiassa molempiin suuntiin ennen kuin päästään edes itse asiaan, koska käyttöjärjestelmäsi TCP/IP-protokollapino kättelee palvelimen kanssa. Sitä seuraa vielä TLS-salauksen vaatima kättely ja sertifikaattien varmistus. TCP/IP-yhteyttä pidetään kättelyn jälkeen auki ainakin niin kauan, että korkeamman tason HTTP-pyyntö saadaan toimitettua perille, ja vastaus toimitettua takaisin selaimelle. Käytännössä saman yhteyden yli ladataan myös sivun oheissisältöä, kuten kuvia ja skriptejä.

Osapuolten välinen viestiliikenne on pilkkoutuu TCP/IP-paketteihin, joiden otsakkeissa on tietoina kohdeosoite ja portti sekä lähdeosoite ja portti. Viestinvälitystä varten kotikoneesi käyttöjärjestelmä varaa satunnaisesti valitun vapaan TCP-porttinumeron (Linuxissa väliltä 32768 to 60999), esim. 48765, ja laittaa itselleen muistiin, että kyseisellä porttinumerolla lähetetyt ja vastaanotetut paketit kuuluvat tähän tiettyyn yhteyteen. Siten käyttöjärjestelmä osaa toimittaa vastaanottamiensa, porttinumerolla 48765 varustettujen pakettien sisällön oikeaan paikkaan (socketiin), ja selain saa pyyntöönsä vastauksen. Kaikki järjestelmän avoimet yhteydet voi listata komennolla netstat tai ss.

Selaimesi ja käyttöjärjestelmäsi, sekä vastapuolen palvelin ovat kuitenkin autuaan tietämättömiä siitä, että välissä on kotiverkon reititin, joka tekee osoitteenmuunnoksen ja porttimuunnoksen (PAT, NAPT). Tällöin kotikoneeltasi lähtevät TCP/IP-paketit, joiden lähetysportiksi ja osoitteeksi on merkitty 192.168.1.106:48765 välittyvät reitittimelle, joka vaihtaakin lähettäjän osoitteeksi internetiin näkyvän ulkoisen IP:n 91.66.77.88 ja portiksi satunnaisesti valitsemansa 59876. Reititin merkitsee samalla itselleen muistiin, että ulkoisen IP-osoitteen porttiin 59876 tulevat paketit välitetään toistaiseksi sisäverkon koneelle 192.168.1.106 porttiin 48765. fast.com-palvelimen osoite ja portti 23.13.33.111:443 pysyvät TCP/IP-paketeissa muuttumattomina. Sitten, kun reititin saa internetistä tulevan TCP/IP-paketin, jossa on kohteeksi on merkitty 91.66.77.88:59876, se vaihtaa osoitteeksi ja portiksi 192.168.1.106:48765 ja välittää paketin sisäverkkoon tietokoneellesi. Tietokoneesi ja käyttöjärjestelmäsi ei huomaa tapahtunutta osoitteenvaihdosta mitenkään. Fast.com puolestaan näkee, että yhteys on avattu osoitteesta 91.66.77.88, ja ilmoittaa sen tekstinä lähettämänsä HTML-sivun sisällössä.


Tässä kuvilla varustettu, kohtalaisen selkeä artikkeli aiheesta: https://www.practicalnetworking.net/series/nat/dynamic-pat/


Mutta entä sitten, jos sisäisellä laitteella (vaikkapa Ubuntu-tietokoneella) on kaksi käyttäjää, jotka molemmat tekevät nettihakuja, vieläpä samalla ohjelmalla, jolloin hakujen lähtöosoitteet ovat samat ja portitkin ovat samat?

Käyttöjärjestelmän sisällä homma toimii pistokkeilla eli socketeilla. Selain pyytää jokaista avaamaansa yhteyttä varten käyttöjärjestelmän TCP/IP-pinolta socketin, jonka kautta viestit lähetetään ja otetaan vastaan. Selain ei välitä, minkä portin käyttöjärjestelmä varaa liikennettä varten, eikä selain näe TCP/IP-paketteja.

Käytännössä siis jokaisella selaimeen avaamallasi välilehdellä on varattuna yksi tai useampia erillisiä socketeja, joille käyttöjärjestelmä on varannut erilliset porttinsa. Kannattaa tosiaan vilkaista ss:n ja netstatin listauksia samalla, kun selaimessa on auki sivustoja eri välilehdillä. Ne listaavat avoimet socketit riveittäin. Sarakkaissa on mm. molempien osapuolten osoitteet ja portit sekä socketin avanneen prosessin tiedot (PID, komento).

Koodia: [Valitse]
ss -p -r
Koodia: [Valitse]
netstat -t -p
« Viimeksi muokattu: 26.01.21 - klo:14.19 kirjoittanut nm »

Ganymedes

  • Käyttäjä
  • Viestejä: 3915
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #6 : 26.01.21 - klo:11.46 »
Hyvä kysymys, ehkä tuon kappaleen alla Wikipediassa on vastaus:

Type of NAT and NAT traversal, role of port preservation for TCP.

Se, että kaksi käyttäjää tekee samaa asiaa samanaikaisesti, ei ole tavallinen tilanne Ubuntu käytössä. Se on kuitenkin saavutettavissa jonkinlaisella päätekäytöllä tai taustalla pyörivillä palveluilla, joita ajetaan jonkun käyttäjän alla. Myös ajamalla kahta virtuaalikonetta samaan aikaan, mikä on sinänsä helppoa yhdeltäkin SSD-levyltä, NAT-verkossa, saa tämän aikaiseksi.

nm

  • Käyttäjä
  • Viestejä: 16429
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #7 : 26.01.21 - klo:12.09 »
Hyvä kysymys, ehkä tuon kappaleen alla Wikipediassa on vastaus:

Type of NAT and NAT traversal, role of port preservation for TCP.

Tuo Wikipedian artikkelin kappale käsittelee tilannetta, jossa ulkopuolelta yritetään avata uusi yhteys natin takana olevalle sisäverkon palvelimelle. Tämä ratkaistaan kotiverkkojen reitittimissä porttiohjauksella. Käyttäjä on silloin itse määrittänyt reitittimen asetuksissa vaikkapa säännön, että ulkoisen osoitteen porttiin 2233 tuleva liikenne ohjataan aina sisäverkon koneelle 192.168.1.101 SSH-porttiin 22, jossa OpenSSH-palvelin kuuntelee yhteydenottoja.

Se, että kaksi käyttäjää tekee samaa asiaa samanaikaisesti, ei ole tavallinen tilanne Ubuntu käytössä. Se on kuitenkin saavutettavissa jonkinlaisella päätekäytöllä tai taustalla pyörivillä palveluilla, joita ajetaan jonkun käyttäjän alla. Myös ajamalla kahta virtuaalikonetta samaan aikaan, mikä on sinänsä helppoa yhdeltäkin SSD-levyltä, NAT-verkossa, saa tämän aikaiseksi.

Olennaista on, että yksikin käyttäjä ja yksi selainprosessi avaa lukuisia erillisiä yhteyksiä. Käyttöjärjestelmän TCP/IP-pinon ja socketien toiminnan kannalta ei ole väliä, minkä käyttäjätunnuksen oikeuksin sovellus toimii.

Ganymedes

  • Käyttäjä
  • Viestejä: 3915
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #8 : 26.01.21 - klo:12.44 »

Se, että kaksi käyttäjää tekee samaa asiaa samanaikaisesti, ei ole tavallinen tilanne Ubuntu käytössä. Se on kuitenkin saavutettavissa jonkinlaisella päätekäytöllä tai taustalla pyörivillä palveluilla, joita ajetaan jonkun käyttäjän alla. Myös ajamalla kahta virtuaalikonetta samaan aikaan, mikä on sinänsä helppoa yhdeltäkin SSD-levyltä, NAT-verkossa, saa tämän aikaiseksi.

Olennaista on, että yksikin käyttäjä ja yksi selainprosessi avaa lukuisia erillisiä yhteyksiä. Käyttöjärjestelmän TCP/IP-pinon ja socketien toiminnan kannalta ei ole väliä, minkä käyttäjätunnuksen oikeuksin sovellus toimii.

Kiitokset tarkennuksesta, edelläkin.

Postimies

  • Käyttäjä
  • Viestejä: 2644
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #9 : 28.01.21 - klo:22.20 »
Miten nat toimii tuli selväksi. Miten tuo reititin arpoo osoitteita eri laitteille? Itse tykkäisin jos ne pysyisivät samoina.

raimo

  • Käyttäjä
  • Viestejä: 4269
  • openSUSE Tumbleweed
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #10 : 28.01.21 - klo:22.54 »
Miten nat toimii tuli selväksi. Miten tuo reititin arpoo osoitteita eri laitteille? Itse tykkäisin jos ne pysyisivät samoina.

IP:t saa asetettu pysyviksi reitittimen asetuksissa kunkin laitteen MAC-osoitteen mukaan.
Tietä käyden tien on vanki. Vapaa on vain umpihanki.
Aaro Hellaakoski

Ganymedes

  • Käyttäjä
  • Viestejä: 3915
    • Profiili
Vs: Ihmettelen IP-osoitejuttua
« Vastaus #11 : 28.01.21 - klo:23.11 »
Miten nat toimii tuli selväksi. Miten tuo reititin arpoo osoitteita eri laitteille? Itse tykkäisin jos ne pysyisivät samoina.

IP:t saa asetettu pysyviksi reitittimen asetuksissa kunkin laitteen MAC-osoitteen mukaan.

... ja voi myös koneelle antaa kiinteän osoitteen reitittimen, tai oikeastaan DHCP-serverin, toiminta-alueen ulkopuolelta. Se on usein .100-200 tai .128-200 ... kannattaisi tarkistaa reitittimeltä. Ennenkuin lähtee muuttamaan kannattaa katsoa mitkä asetukset ovat nyt, jotta ne saa oikein. (Esim. Connection Information -valinnalla ylänauhasta tai Windowsissa "ipconfig /all" komennolla).