Osoitteenmuunnos

Osoitteenmuunnos on Internet-tekniikka, jossa julkisesti liikennöityjä IP-osoitteita piilotetaan tai säästetään. Osoitteenmuunnos kehitettiin alun perin, kun huomattiin, että tulevaisuudessa IP-osoitteita ei riittäisi joka koneelle omaansa.
Useimmiten osoitteenmuunnosta käytetään, kun Internet-yhteydellä ei ole kuin yksi IP-osoite, mutta useamman koneen tulisi päästä Internetiin. Kaikessa Internetiin lähetetyssä liikenteessä pitää olla julkinen, uniikki IP-osoite, jolloin tässä tapauksessa usean koneen pitää jakaa yksi osoite. Tämä onnistuu erilaisia osoitteenmuunnostekniikoita käyttäen.
Osoitteenmuunnoksen suorittava laite on useimmiten reititin tai palomuuri.
Osoitteenmuutoksesta käytetään ainakin englanninkielisiä termejä network address translation (NAT), network address port translation (NAPT), port/address translation (PAT) ja dynamic network address / port translation (DNAPT). Nämä termit ovat enemmän tai vähemmän laitevalmistajien ristiriitaisesti käyttämiä termejä omien tuotteidensa ominaisuuksille.

Ongelmia

Osoitemuunnos ja porttimuunnos aiheuttavat valtavasti ongelmia erilaisten kaksisuuntaisten sovellusten vuoksi. Monet käyttäjäsovellukset vaikuttaisivat toimivan ainoastaan käyttäjältä palvelimelle päin, mutta tosiasiassa myös palvelin ottaa yhteyksiä käyttäjälle päin.
Klassinen esimerkki on FTP. Kun käyttäjä vaikkapa pyytää FTP-yhteydellä tiedostoa, ei palvelin käytä yhteyttä sen lähettämiseen vaan avaa erillisen, uuden yhteyden asiakkaalle ja lähettää tiedoston sitä pitkin. Julkisilla IP-osoitteilla tämä tietysti onnistuu hyvin (mikäli välissä ei ole palomuuria), mutta porttimuunnoksessa FTP-palvelin ottaa yhteyttä porttimuunnosta suorittavaan reitittimeen eli ulkoverkon osoitteeseen, josta se uskoo yhteyden tulevan. Muita porttimuunnoksen ja/tai osoitemuunnoksen rikkomia sovelluksia ovat puhelinpalvelut, jotkut verkkopelit ja IPsec. Puhelinpalveluiden kohdalla ongelma tulee esille, kun kaksi tietokonetta ovat kumpikin osoitteenmuunnoksen takana ja kumpikaan ei tiedä julkista IP-osoitettaan eikä siten pysty kertomaan toiselle minne ottaa yhteyttä. Tämä koskee niin H.323- kuin SIP- ja RTP-pohjaisia puhelinpalveluita. Suosittu Skype-ohjelmisto välttää tämän ongelman kierrättämällä liikenteen kolmannen, julkisella IP-osoitteella tavoitettavan, Skype-käyttäjän tietokoneen kautta.
IPsec-protokollaan on kehitetty valmistajakohtaisia muutoksia, jolla se saadaan ujutettua osoitemuunnoksesta huolimatta läpi. FTP:ssä puolestaan on passiivinen tila, jolla yhteydenavaus muodostetaan päinvastaiseen suuntaan.
Yleisesti ottaen tuki osoitemuunnoksen muuten rikkomille protokollille on useimmiten osoitemuunnosta tekevissä laitteissa toteutettu erillisinä lisäominaisuuksina. Reititin voi esimerkiksi erityisesti tarkkailla FTP-yhteyttä ja uuden yhteyden havaitessaan lennossa muuttaa osoitemuunnosta tekevän laitteen taulukoita niin, että yhteys ohjataan sen oikealle vastaanottajalle.

Avoimet yhteydet

Toimiakseen osoitemuuntavan laitteen pitää siis tuntea Internetiin auki olevat yhteydet. Normaalisti laitteet tekevät tämän pitämällä muistissaan listaa aukiolevista yhteyksistä ja niillä käytetyistä osoitteista. Kun uusi yhteys avataan, listaan lisätään rivi, ja yhteyden päättyessä se poistetaan.
Laitteen kannalta ongelmaksi muodostuukin esimerkiksi yhteyksien katkeaminen. Jos vaikkapa käyttäjän työasema kaatuu ja sillä on auki 10 yhteyttä, ne jäävät kummittelemaan NAT-laitteen muistiin.
Tämän takia NAT-laitteilla onkin tapana siivota yhteyksien listasta vanhoja yhteyksiä, jotka näyttävät olevan auki, mutta joissa ei ole tapahtunut liikennöintiä vähään aikaan. Aika, jonka jälkeen yhteydet joissa ei ole liikennöity katkaistaan, on säädettävissä NAT-laitteissa.
Mikäli käyttäjä pitää yhteyttä auki pitkään eikä tee mitään, NAT-laite siis ennemmin tai myöhemmin katkaisee yhteyden. Käyttäjä huomaa tämän luultavasti vasta yrittäessään käyttää sovellusta pitkän ajan kuluttua.
NAT-laitteiden ajastimia ja niiden aiheuttamia ongelmia voi kiertää myös sovelluksissa. Sovellukset voivat liikennöidä satunnaisesti jonkinlaisia keep alive -viestejä, jotka nimensä mukaisesti pitävät yhteyden hengissä. Vaikkei langalla periaatteessa tavaraa liikukaan, lähettelevät asiakkaat ja palvelimet toisilleen tyhjiä paketteja jotka uskottelevat NAT-laitteelle yhteyden olevan yhä auki. Ainakin SSH:ssa ja Terminal Servicesissä on tuki tällaisille keep alive -viesteille.

Muut protokollat

TCP:n lisäksi on olemassa myös UDP, joka on paljon monimutkaisempi osoitteenmuunnoksen kannalta. UDP-protokollan yhteydettömän luonteen vuoksi NAT-laite ei voi tietää milloin yhteys päättyy. UDP:n kanssa käytetään pelkästään ajastinta, joka poistaa vanhoja yhteyksiä. UDP-yhteyksillä siis NAT-laite laskee jokaisesta paketista aikaa, ja kun vaikkapa 5 minuuttiin ei ole näkynyt yhtään pakettia, pyyhkii NAT-laite yhteyden tiedot muististaan ja olettaa yhteyden päättyneen.
ICMP:n kohdalla monilla viesteillä on kysymys/vastausmuoto, kuten echo request ja echo reply tai subnet request ja subnet reply. Tällaisille viesteille sovelletaan samaa logiikkaa kuin UDP-paketeille. Näissä ICMP-paketeissa ei ole porttinumeroita, jolloin porttimuunnos ei ole mahdollista. Muita ICMP-paketteja (mm. destination unreachable) ei yleensä päästetä porttimuunnoksesta läpi.
Monet NAT-laitteet tekevätkin porttimuunnosta TCP/UDP-yhteyksille ja yksinkertaista dynaamista osoitteenmuunnosta ICMP-paketeille. Jos siis NAT-laitteella ei ole kuin yksi julkinen osoite, ei sen takaa voi pingata tiettyä etäkonetta kuin yksi kone kerrallaan.