oriolrius.cat

Des del 2000 compartiendo sobre…

Tag: turn

NAT traversal: Com funciona ICE?

Reading time: 5 – 8 minutes

Per tal d’entendre com funciona ICE el millor és explicar-lo conjuntament amb un altre protocol; ja que com es va comentar a la introducció del NAT traversal el protol ICE usa una combinació del protocol TURN i STUN en funció del cas, això és molt senzill d’entendre si parlem d’un cas pràctic d’ús. O sigui, quan s’intenta que per exmple, SIP travessi un firewall/gateway/router per fer arribar una trucada a un telefon IP.

Què són els candidats?

El Caller envia un missatge de SIP INVITE amb informació SDP que descriu per quina IP i per quins PORTS l’aplicació pot rebre audio i/o video. Aquestes adreces i ports es coneixen com candidates. Aquests candidates s’obtenen del servidor ICE (sovint es troba dins el firewall/router/gateway).

Podriem descriure un candidate com una IP i un port a través dels quals un peer pot rebre dades d’un altre peer. Hi ha tres tipus de candidates:

  • Local candidate: IP local del client.
  • Reflexive or STUN candidates: una adreça IP pública del servidor NAT.
  • Relay o TURN candidate: una adreça o un relay server que ha estat reservat pel client.

El tràfic sempre es podrà enviar amb èxit a través dels relay candidates, a menys que un firewall bloquegi l’enllaç, aleshores no hi ha tècnica possible de NAT traversal a aplicar. El problema d’usar relay candidates és que requereix usar recursos d’un servidor, això fa que el tràfic que arriba al peer tingui retards, perdues i problemes de jitter.

Procés d’establiment d’una trucada SIP via ICE

1. Caller aconsegueix els seus candidates

En el següent gràfic es pot veure com el Caller determinada els reflexive i relay candidates per una connexió. El client envia una petició d’ALLOCATE al servidor, llavors el servidor localitza un parell IP/port (el relay candidate). Aquesta informació s’envia altre cop al Caller (reflexive candidate), aquest missatge conté la IP pública que usarà el Caller quan emeti un missatge a internet, sovint això és la IP a través de la qual s’aplicarà el NAT.

stun_turn_candidates

2. Caller envia un SIP INVINTE

El Caller construeix un missatge SIP INVITE usant la informació dels candidates que ha obtingut del seu servidor ICE, després l’envia al seu destí.

3. Callee aconsegueix els candidates

Quan es rep el missatge SIP INVITE, el Callee aconsegueix els candidates de la mateixa manera que ho ha fet el Caller en el punt (1).

4. El Callee envia una resposta 1xx

Seguint amb el protocol SIP, el Callee ha de generar un missatge de resposta al SIP INVITE, per exemple, un SIP 183 (Session Progress). Quan es construeixi aquest missatge dins de l’informació SDP el Callee també hi encapsularà els seus candidates. Fins que aquest missatge no s’hagi rebut i confirmat per part del Caller (200 OK) no es considerarà exitosa la negociació.

5. ICE connectivity checks

Arribats en aquest punt tan el Caller com el Calle saben mutuament els candidates que tenen cadascún i és el moment d’usar el que s’anomena ICE connectivity checks. Això es fa enviant un missatge STUN des del local candidate cap al remote candidate, això es pot fer per tants candidates com hi hagin des del que té més prioritat fins al que en té menys. Això ho faran ambdós costats de l’enllaç si és que tots dos es troven darrera un gateway amb ICE. Quan s’hagi determinat quin dels candidates és el millor per establir cada un dels canals llavors s’escollirà aquest candidate per començar a enviar i rebre media a través seu.

A continuació es poden veure tres exemples de com es fan aquestes proves dels candidates. El primer esquema seria el cas en que ambdós hosts són enrutables directament perquè, per exmple, estan a la mateixa LAN. El segon esquema s’aconseguiria l’enllaç via la metologia STUN i en el tercer via la metodologia TURN.

ICE_connection_check

6. Callee envia SIP 180 (ringing)

En aquest punt el Callee envia el missatge SIP 180 (ringing) al Caller per informar-lo de que el teléfon del Callee esta sonant. Al haver negociat previament el canal de dades a través d’ICE quan el Callee despengi el teléfon ja podrà parlar sense retards, si això es negocies després hi hauria un efecte de retard desagradable pels peers.

7. Accepta la trucada i parlen

Així doncs, quan el Callee despengi s’enviarà un missatge 200 OK i via RTP (per exemple) i usant els canals negociats via ICE el fluxe de dades multimedia (en aquest cas audio) començarà travessant de forma transparent els dos gateways que donen accés a internet als dos peers.

Unes notes per aclarir el tema

En aquest exemple es preten demostrar que podem establir un enllaç RTP a través de dos peers que es troben darrera de NAT gràcies al protocol ICE. Com a protocol per controlar la sessió RTP s’usa SIP, això fa que ambdós peers necessitin una redirecció DNAT al seu gateway cap als ports TCP/UPD 5060. En cas de voler evitar això el que s’hauria d’usar és un altre protocol de senyalització diferent de SIP. Per exemple, si no volem/podem redirigir cap port al gateway es podria usar XMPP.

Glosari

  • Caller: qui fa la trucada
  • Calee: qui rep la trucada
  • SDP: Session Description Protocol
  • SIP: Session Initiation Protocol
  • Peer: un extrem de la connexió

Referències


NAT traversal: Com funciona STUN?

Reading time: 2 – 3 minutes

El servidor STUN ha de publicar la seva IP (3478TCP/UPD o 5349TLS) a un gateway que tingui una IP interna i una externa (privada i pública). La comuniació comença quan el client que esta a la xarxa enmascarada llença una serie de requests contra la IP pública del servidor STUN. El servidor STUN contestarà al client informant dels parells de ports usats a l’exterior del NAT, amb això el client aprent de quin tipus de NAT disposa i quin és el TTL dels bindings que es fan a l’exterior per re-enviar les seves peticions.

Una aplicació client per tal de saber qui és el seu servidor STUN el que fa és buscar al seu domini DNS la resolució del nom _stun_.domini_exemple.com o _stun._udp.domini_exemple.com pels tipus de registre SRV. Després de saber qui és el seu servidor STUN el que fa l’aplicació és buscar l’adreça pública del servidor STUN. Per tal de descobrir quin haurà de ser l’origen dels seus paquets a internet. Així quan construeixi els paquets amb les dades d’aplicació podrà advertir quina és l’adreça pública del seu servidor STUN.

Arribats a aquest punt sovint en tenim prou com per començar la comunicació amb el destí final del nostre enllaç, ja que aquest l’únic que haurà de fer és contestar els paquets pels mateixos ports que el gateway esta fent binding en aquell moment. Aquí és on el STUN server fa la seva feina mantenint els ports oberts. Un dels problemes amb els que ens podem trobar és que el node destí no pugui atacar aquells ports per alguna restricció del seu firewall o similar. Cosa que complica la possibilitat de fer l’enllaç. Si els dos hosts que volem comunicar estan tots dos darrera del NAT-masquerade la cosa és fa molt difícil i sovint fa falta un proxy entre els dos servidors STUN per tal de que la cosa funcioni, o sigui, que es complica moltíssim.

Diagrama de fluxe del protocol:

Esquema NAT
Click for (+) Zoom

NAT traversal: Introducció

Reading time: 3 – 5 minutes

Avui en dia és molt usual tenir xarxes darrera de gateways (routers, firewalls, etc) que a través de NAT donen accés a internet als hosts, sovint anomenem masquerading a aquesta funcionalitat que no deixa de ser un subconjunt de funcions del propi NAT. La majoria de problemes associats a l’accés a internet via masquerading estan solucionats. Però quan el problema que tenim és l’invers, o sigui, que volem accedir, via TCP o UDP, a un host  que esta dintre una xarxa amb un gateway que fa NAT la cosa es complica.

De fet, si el que volem és redirigir un port de la IP pública amb la que s’accedeix a internet a un host intern tampoc no té massa misteri, gràcies al DNAT. Però si aquestes redireccions han de ser a més d’un host sovint hem de començar a usar ports no massa estàndards per oferir serveis que hi ha dins la xarxa i que volem publicar a internet. O sigui, que l’únic que podem fer a priori és mapejar estàticament ports de la IP pública cap a certs ports de les IPs privades.

Per tal de poder rebre connexions en un host que esta darrera un gateway que fa NAT hi ha una serie de tècniques més o menys (des)conegudes.

  • TURN (Traversal Using Relay NAT): la idea és tenir un pool d’IPs públiques de forma que les aplicacions que necessitin ser publicades a internet agafin una IP disponible de forma temporal o permanen per publicar aquell servei en aquella IP que mapejarà els seus ports. O sigui, que es basa en una idea similar al DNAT però li afegeix la capacitat de poder usar pools d’IPs de forma dinàmica.
  • STUN (Session Traversal Utilities for NAT): Esta orientat a aplicacions de VoIP, missatgeria, videoconferència, etc. Sovint quan les connexions per les que s’usa STUN són via UDP, malgrat també hi poden haver servidors que STUN que funcionin amb TCP o fins hi tot TCP/TLS.  El protol STUN és un protocol client-servidor molt lleuger.
  • ICE (Interactive Connectivity Establishment): finalment la idea d’ICE és buscar la millor ruta entre dos hosts que volen comunicar-se. Si ambdós estan dintre la mateixa LAN o en LANs diferents però tenen IPs públiques o NATs estàtics (1a1), llavors enruta les connexions i llestos. Però si els hosts estan darrera de NAT que fan enmascarament dinàmic llavors usa combinacions de les tènciques d’STUN i TURN.

Per tal d’entendre millor aquests problemes cal tenir clar els tipus de NAT que existeixen:

  • Full Cone NAT
  • Esquema NAT
    Click for (+) Zoom

  • Port Restricted Cone NAT
  • Esquema NAT
    Click for (+) Zoom

  • Restricted Cone NAT
  • Esquema NAT
    Click for (+) Zoom

  • Symetric NAT
  • Esquema NAT
    Click for (+) Zoom

    En els propers articles desenvoluparé més a fons els protocols citats i referenciaré algunes llibreries que els implementen.

    La major part de la bibliografia l’he extret de la wikipedia, dels estàndards IETF i de les següents fonts:

    • PDF de NAT types de la web: http://www.crfreenet.org/~martin/referaty/stun/naty.pdf (local)