Locked History Actions

Session Traversal Utilities for NAT

Žodis angliškai:

Session Traversal Utilities for NAT

Santrumpa:

STUN

Žodis lietuviškai:

NAT‘ui skirta sesijų trasavimo priemonė

Apibrėžimas:

STUN (angl., Session Traversal Utilities for NAT, - NAT‘ui skirta sesijų trasavimo priemonė, anksčiau angl. Simple Traversal of UDP through NATs, - Paprastas UDP praėjimas pro NAT serverius) - tai tinklo sąsaja, leidžianti esančiam už adresų transliavimo serverio (arba už kelių tokių serverių) klientui nustatyti savo išorinį IP-adresą, adreso transliavimo būdą ir prievado, susieto su tam tikru vidinio prievado numeriu, numerį išoriniame tinkle. Gauta informacija yra naudojama UDP susijungimui inicijuoti tarp dviejų mazgų tuo atvejų, jei abu jie yra už NAT maršrutizatoriaus. Sąsajos, tokios kaip SIP, naudoja UDP paketus balsui, vaizdui ar tekstui perduoti IP-tinkluose. Deja, kai abi bendraujančios šalys lokalizuotos už NAT‘o - susijungimas negali būti įvykdytas paprastu būdu. Būtent tokiose situacijose gelbsti STUN sąsaja.

STUN - tai serverio-kliento sąsaja. VoIP-klientas gali turėti savyje STUN-kliento realizaciją, kuris siunčia užklausas STUN serveriui. Po to STUN serveris siunčia klientui atgal informaciją apie tai, koks yra NAT maršrutizatoriaus išorinis adresas, kokie prievadai jame yra atidaryti tam, kad priiminėti įeinančias užklausas atgal į vidinį tinklą. Atsakymas leidžia STUN-klientui nustatyti, koks transliacijos tipas yra naudojamas, nes skirtingi NAT maršrutizatorių tipai apdoroja UDP paketus įvairiai.

Pavyzdys:

NAT tipo nustatymas, naudojant STUN, daromas tokiu būdu. Tarkim klientas yra už NAT, kliento lokalus adresas 192.168.0.111, viešasis NAT adresas 1.2.3.4, STUN-serverio adresas - 11.22.33.1 ir 11.22.33.2, prievadų numeriai 3478. Vykdomi tokie veiksmai:

  • Klientas siunčia užklausą pagrindiniam serverio adresui (11.22.33.1), tuo pačiu užklausos paketo viduje nurodyti adresai ir prievadai: 192.168.0.111:1055 -> 11.22.33.1:3478. Tokie pat adresai ir prievadai yra ir užklausos IP-paketo antraštėje, bet po NAT praėjimo šaltinio adresas antraštėje pakeičiamas į 1.2.3.4, o prievado numeris, priklausomai nuo NAT realizacijos, gali pasikeisti, arba likti nepakeistas. Jeigu klientas negauna jokio atsakymo per taimauto periodą, daroma išvada, kad klientas yra už blokuojančios ugniasienės, ir jis baigia darbą.

  • Serveris atsako klientui iš savo adreso 11.22.33.1 pranešimu, kuriuo viduje taip pat yra nurodyti jo adresai ir prievadų numeriai: 11.22.33.1:3478 -> 1.2.3.4:1055. Jeigu adresas, iš kurio klientas siuntė savo pirmą pranešimą (192.168.0.111), ir adresas gautame nuo serverio pranešime sutaptų, klientas padarytų išvadą, kad paketų kelyje NAT maršrutizatorių nėra. Šiuo atveju klientas ir serveris dar apsikeistu pora užklausų-atsakymų, pagal kuriuos galima būtų nustatyti, ar nėra jų kelyje ugniasienių, blokuojančių įeinančius UDP paketus. Kai šie adresai nesutampa, akivaizdu, kad kelyje tarp kliento ir serverio yra NAT. Taipogi šiame atsakyme serveris informuoja klientą apie savo alternatyvų IP-adresą (11.22.33.2) ir prievado numerį (3478).

  • Po to klientas siunčia antrą zonduojantį pranešimą, kuriame nustatoma speciali vėliavėlė, nurodanti serveriui, kad klientas laukia atsakymo iš jo alternatyvaus IP-adreso (11.22.33.2) ir su kitu šaltinio prievado numeriu. Jeigu klientas gauna atsakymą tokiai užklausai, padaroma išvada, kad jų kelyje stovintis NAT yra Full Cone tipo.
  • Jeigu į paskutinę užklausa atsakymo gauta nebuvo, klientas siunčia savo pirmą zonduojančią užklausą į alternatyvųjį STUN-serverio adresą. Jeigu gautajame atsakyme adresas ir prievado numeris skiriasi nuo nurodytų pirmajame atsakyme, tai reiškia, kad nauja užklausa inicijavo naujo įrašo atsiradimą NAT lentelėje. Toks elgesys būdingas Symmetric NAT tipui.
  • Jeigu adreso ir prievado numeris gautajame atsakyme pasiliko tokie patys, kokie buvo esant pirmam atsakymui, tai reiškia kad NAT yra Restricted Cone tipo. Belieka tik išsiaiškinti, ar jis yra Adders Restricted, ar Port Restricted. Tam tikslui klientas siunčia ketvirtąją užklausą, kur pažymima vėliavėlė, nurodanti serveriui, kad jis turi atsakyti, panaudojus kitą šaltinio prievado numerį. Jeigu atsakymas buvo gautas - tai reiškia, kad NAT yra Address Restricted Cone tipo, jei ne - Port Restricted Cone.

STUN veikimo iliustravimui pažiūrėsim į šitą paveikslą:

stun.gif

STUN sąsajos paketo struktūra:

Klientas ir serveris sąveikauja, siunčiant vienas kitam tokio tipo UDP paketus:

1.jpg

Kiekvienas pranešimas turi dvi dalis - antraštę ir atributus. Antraštė yra būtina kiekvienam pranešimui, skirtingai kaip atributai, nes sąsaja leidžia siusti pranešimus, susidedančius tik tai iš antraščių, be atributų.

Paketo antraštė

STUN-paketo antraštė (Message Header) yra tokio formato:

2.jpg

Kur pirmieji du antraštės bitai turi būti nenuliniai;
STUN Message Type – pranešimo tipas;
Message Length – paketo ilgis, neįskaitant antraštės;
Magic Cookie – užrezervuota vertė, pagal kurią galima nustatyti, kad turimas paketas yra STUN-pranešimų kategorijos;
Transaction ID – transakcijos identifikatorius.
Išsamiau išnagrinėsime galimas laukų vertes.

Message Type

Dabartinėje sąsajos versijoje egzistuoja keturi pranešimų tipai, po du klientui ir serveriui. Kliento generuojamų pranešimų tipai:
Binding Request – Užklausa išoriniam adresui gauti, lygi 0x0001.
Indication – Tarnybinis paketas, išoriniam adresui užlaikyti, lygus 0x0010.
Serverio generuojamų pranešimų tipai:
Success Response – Atsakymas su kliento išorinio adreso duomenimis, lygus 0x0101.
Error Response – Atsakymas su pranešimu apie klaidą, esančią kliento užsakyme, lygus 0x0111.

Message Length parodo viso paketo ilgį baitais, neįskaitant antraštės. T.y. pranešimams be atributų Message Length bus lygus nuliui.
Magic Cookie visada turi būti lygus 0x2112A442;
Transaction ID – tai 96-ių bitų identifikatorius, reikalingas transakcijos unikaliam nustatymui. Užklausos/atsakymo transakcijų tipui
identifikatoriaus vertė nustatoma, STUN klientui darant užklausą, ir kartojama, serveriui siunčiant atsakymą.

Egzistuoja du pagrindiniai paketų tipai, kuriuos klientas gali siusti į serverį. Tai Binding Request - užklausa informacijai apie išorinį IP-adresą gauti, ir Indication - tarnybinis paketas, kurio tikslas - išsaugoti sau priskirtą išorinį adresą NAT transliatoriuje. Indication paketas nereikalauja atsakymo. Serveris nedaro jokių veiksmų, gavus tokio tipo paketą.

Atributai

Visi atributai yra tokio pavidalo:

3.jpg

Kur Type – atributo tipas,
Length – atributo ilgis baitas, neįskaitant pirmuosius keturis bitus, kurie saugoja atributo tipą ir ilgį,
Value – Atributo vertė, lauko ilgis turi dalintis iš keturių baitų (trūkstami baitai gali turėti bet kokią vertę).
Toliau išnagrinėsime pagrindinius atributus.

Atributas MAPPED-ADDRESS

Šio tipo atributo vertė lygi 0x0001.
Šis atributas buvo naudojamas prieš tai esančioje sąsajos versijoje, aprašytoje rfc3489. Bet ir šiuo metų daug STUN-serverių vis naudoją šitą atributą, todėl yra prasmė jį išnagrinėti. MAPPED-ADDRESS saugoja išorinį kliento adresą ir aprašomas tokiu būdu:

4.jpg

Pirmieji 8 bitai turi būti lygus nuliui ir ignoruojami priimamos pusės.
Family gali turėti vertes:
0x01 tuo atveju, jeigu naudojama IPv4 sąsaja.
0x02 tuo atveju, jeigu naudojama IPv6 sąsaja.
Port - išorinis kliento prievadas.
Address – išorinis kliento IP-adresas, gali būti 32-bitų, kai naudojamas IPv4, arba 128-bitų, kai naudojamas IPv6.

Atributas XOR-MAPPED-ADDRESS

Šio tipo atributo vertė lygi 0x0020.
XOR-MAPPED-ADDRESS atributas identiškas MAPPED-ADDRESS, skirtumas tik tas, kad šito adreso vertė praleidžiama pro XOR funkciją. Taip daroma dėl to, kad kai kurie NAT-transliatorių tipai seka paketų turinį ir ieško tokių sekų, kurios lygios NAT-transliatoriaus IP-adresui. Tokios sekos gali būti NAT-transliatoriaus pakeistos. Šios problemos sprendimas - duomenų su IP-adresais kodavimas, pavyzdžiui, su XOR funkcijos pagalba.
XOR-MAPPED-ADDRESS atributo formatas analogiškas MAPPED-ADDRESS:

5.jpg

X-Port skaičiuojamas, kaip išorinio prievado vertės ir Magic Cookie vyresniųjų 16-os bitų vertės XOR funkcijos rezultatas.
X-Address ,esant IPv4 - tai išorinio IP-adreso ir Magic Coocie XOR funkcijos vertė. IPv6 atveju vietoj Magic Coocie imama Magic Coocie seka ir 96-ių bitų Transaction ID.

Atributas ERROR-CODE

Šio tipo atributo vertė lygi 0x0009.
Atributas saugoja informaciją apie klaidą, įvykusią serveryje apdorojant kliento užklausą, jo formatas:

6.jpg

Laukai Class ir Number sudaro klaidos kodą. Štai yra sąsajos aprašyti kodai:

300 Try Alternate – reikia kreiptis į kitą serverį.
400 Bad Request – Klaida užklausoje. Klientas turi pakeisti savo užklausą.
401 Unauthorized – autorizacijos klaida.
420 Unknown Attribute – nežinomas atributas. Paprastai serveris įdeda jo pavadinimą į atributą UNKNOWN-ATTRIBUTE.
500 Server Error – Serverio klaida. Reikia pakartoti užklausą veliau.

Kliento ir serverio sąveika.

Esant pagrindinių atributų, naudojamų STUN sąsajoje, aprašymui, pabandykime aprašyti paprasčiausią sąveikos procesą.

1. STUN-klientas turi iš anksto žinoti STUN-serverio interneto adresą ir prievadą, kurio jis klauso.
2. Klientas formuoja paketą su Binding Request tipu, be jokių atributų.
3. Serveris gauna kliento užklausą ir formuoja atsakymą:

  1. Kopijuoja Transaction ID iš užklausos

  2. Jeigu nėra klaidų:

    • Pranešimo tipas – Success Response

    • Formuoja atributą XOR-MAPPED-ADDRESS

  3. Jeigu yra klaidų:

    • Pranešimo tipas – Error Response

    • Formuoja atributą ERROR-CODE

  4. Siunčia atsakymą klientui:

4. Klientas gauną serverio atsakymą ir apdoroja jį.
5. Esant teigiamas atsakymui, klientas pradeda su užduotu periodiškumų siusti Indication-paketus serveriui.
6. Esant klaidai, klientas analizuoja priežastį ir, jeigu reikia, formuoja naują užklausą.

Naudota literatūra:

http://svitter.ru/?p=442

http://sergetk.livejournal.com/28193.html

http://www.cyberguru.ru/networks/network-security/nat-details-page2.html