Como se vio en la Parte 1 de este artículo, el protocolo STUN permite que una entidad SIP corriendo detrás de NAT descubra su dirección IP pública y el tipo de NAT detrás del cual se encuentra. También permite que la entidad SIP descubra qué puerto externo pueden utilizar otras entidades SIP para conectarse desde el exterior de la red. Dado que SIP utiliza UDP como protocolo de transporte, y que UDP no es un protocolo orientado a la conexión, una conexión entre 2 entidades SIP no puede ser establecida con facilidad basándose en las garantías que brinda el protocolo de transporte, y es por eso que STUN es ampliamente utilizado en entornos VoIP basados en SIP. Abajo analizaremos algunas capturas de mensajes correspondientes a un teléfono VoIP basado en SIP intentando registrarse a una IP PBX que se encuentra fuera de su red, y lo que sucede si el teléfono SIP utiliza el protocolo STUN o no.

Enviando un mensaje SIP sin utilizar el protocolo STUN

Debajo se encuentra una captura de un mensaje SIP “Register”; un teléfono VoIP basado en SIP corriendo detrás de NAT intenta registrarse como la extensión 101 en una IP PBX (escuchando en la dirección voipproducts.org), la cual se encuentra corriendo fuera de su red. El mensaje es enviado sin utilizar el protocolo STUN.

REGISTER sip:voipproducts.org SIP/2.0

Via: SIP/2.0/UDP 192.168.2.14:7214;branch=z9hG4bK-d8754z;rport

Max-Forwards: 70

Contact: : <sip:[email protected]:7214;rinstance=0639bae5043c66ac>

To: “account1″ <sip:[email protected]>

From: “account1″<sip:[email protected]>;tag=0a75d76e

Call-ID: OTcxMDU5MGNhNTAxNzgzYjZkODVkY2I3MmE3NDhlNzQ.

CSeq: 1 REGISTER

Expires: 3600

Content-Length: 0

From the above we can see that:

Contact: <sip:[email protected]:7214;rinstance=0639bae5043c66ac>

En el campo “Contact” podemos observar que el teléfono VoIP basado en SIP está especificando una dirección IP válida dentro de su red LAN (192.168.2.14) y el puerto 7214. De este modo está solicitando a la IP PBX remota, que se encuentra fuera de la red LAN, que intente establecer una conexión enviando mensajes SIP a la dirección IP 192.168.2.14 y puerto 7214. En este caso, la IP PBX intentará establecer la conexión, pero dado que la dirección IP corresponde a la red LAN, no es alcanzable desde internet y por lo tanto la respuesta que la IP PBX intente enviar no llegará a destino. De este modo la conexión no puede ser establecida.

Explicación de la resolución STUN

Si un teléfono VoIP basado en SIP tiene la resolución STUN habilitada y un servidor STUN especificado, el teléfono enviará un pedido de resolución STUN al servidor STUN y esperará por una respuesta. Este pedido es típicamente realizado en el arranque del teléfono, o antes de intentar comunicarse con una entidad SIP externa. Abajo se encuentra una captura de una respuesta típica de un servidor STUN:

Message Type: Binding Response(0×0101)

Message Length: 0×0044

Message Transaction ID: E753D76EA857A24DA38A229F7576E18E

Attribute: MAPPED-ADDRESS

Attribute Type: MAPPED-ADDRESS(0×0001)

Attribute Length: 8

Protocol Family: IPv4 (0×0001)

Port: 6023

IP: 78.158.143.115 (78.158.143.115)

Attribute: SOURCE-ADDRESS

Attribute Type: SOURCE-ADDRESS(0×0004)

Attribute Length: 8

Protocol Family: IPv4 (0×0001)

Port: 3478

IP: 10.252.131.113 (10.252.131.113)

Attribute: CHANGED-ADDRESS

Attribute Type: CHANGED-ADDRESS(0×0005)

Attribute Length: 8

Protocol Family: IPv4 (0×0001)

Port: 3479

IP: 75.101.138.128 (75.101.138.128)

En este mensaje puede observarse lo siguiente:

Message Type: Binding Response(0×0101)

Message Length: 0×0044

Message Transaction ID: E753D76EA857A24DA38A229F7576E18E

Message type: Este campo especifica el tipo de mensaje; en el ejemplo de arriba podemos ver que se trata de un “Binding response” para el “Binding request” enviado por el teléfono al servidor STUN.

Message Length: Este campo indica la longitud del mensaje medida en bytes.

Message Transaction: Este es un identificador único utilizado para cada sesión de STUN “binding request / binding response“. Para cada nueva transacción, un nuevo identificador único es creado.

Attribute: MAPPED-ADDRESS

Attribute Type: MAPPED-ADDRESS(0×0001)

Attribute Length: 8

Protocol Family: IPv4 (0×0001)

Port: 6023

IP: 78.158.143.115 (78.158.143.115)

El atributo de arriba es llamado “MAPPED-ADDRESS”; se utiliza para indicar la dirección IP de origen (en el ejemplo anterior; 78.158.143.115) y el puerto de origen (en el ejemplo anterior; 6023) que el servidor STUN vio en el “Binding request” enviado por el teléfono.

Attribute: SOURCE-ADDRESS

Attribute Type: SOURCE-ADDRESS(0×0004)

Attribute Length: 8

Protocol Family: IPv4 (0×0001)

Port: 3478

IP: 10.252.131.113 (10.252.131.113)

El atributo de arriba es llamado “SOURCE-ADDRESS”; se utiliza para indicar si se están utilizando configuraciones de NAT dobles. En el ejemplo anterior podemos observar que se están utilizando configuraciones de NAT dobles dado que la dirección IP del teléfono es 192.168.2.14, la dirección IP pública desde la que fue recibido el “Binding request” es 78.158.143.115 y la dirección IP del último punto que contactó al servidor STUN es 10.252.131.113.

Attribute Type: CHANGED-ADDRESS(0×0005)

Attribute Length: 8

Protocol Family: IPv4 (0×0001)

Port: 3479

IP: 75.101.138.128 (75.101.138.128)

El atributo de arriba es llamado “CHANGED-ADDRESS”; se utiliza para indicar la dirección IP y el puerto desde la que la respuesta habría sido enviada si el cliente solicita un cambio de IP y cambio de puerto en un atributo “CHANGE-REQUEST”.

Enviando un mensaje SIP utilizando el protocolo STUN

Debajo se encuentra una captura de un mensaje SIP “Register”; un teléfono VoIP basado en SIP corriendo detrás de NAT intenta registrarse como la extensión 101 en una IP PBX (escuchando en la dirección voipproducts.org), la cual se encuentra corriendo fuera de su red. El mensaje es enviado utilizando el protocolo STUN.

REGISTER sip:voipproducts.org SIP/2.0

Via: SIP/2.0/UDP 192.168.2.14:7214;branch=z9hG4bK-d8754z;rport

Max-Forwards: 70

Contact: <sip:[email protected]:8676;rinstance=c82d2f5b1918e5cf>

To: “account1″<sip:[email protected]>

From: “account1″<sip:[email protected]>;tag=484b4e36

Call-ID: YWI3Y2I3ODIzOWIxYWI5NDQwMzA5ZTYxMTAzOTM4Y2I.

CSeq: 1 REGISTER

Expires: 3600

Content-Length: 0

En este mensaje puede observarse que:

Via: SIP/2.0/UDP 192.168.2.14:7214

El cliente VoIP aún se encuentra escuchando en la misma dirección IP interna (192.168.2.14) y el mismo puerto (7214).

Contact: <sip:[email protected]:8676;rinstance=c82d2f5b1918e5cf>

En el campo “Contact” del mensaje SIP “Register” el teléfono VoIP reemplaza su dirección IP de red LAN (192.168.1.14) con la dirección IP externa (78.158.143.115) y puerto externo (8676) descubiertos mediante una resolución STUN antes de intentar registrarse con la IP PBX externa. Gracias a la resolución STUN, ahora la IP PBX puede establecer una conexión con el teléfono VoIP enviando las respuestas SIP a la dirección IP 78.158.143.115 y puerto 8676 el cual se encuentra mapeado a la dirección IP interna 192.168.2.14 y puerto 7214 en el dispositivo NAT.

Como se observa, dado que la mayoría de los protocolos utilizados en llamadas VoIP basadas en SIP utilizan UDP como protocolo de transporte, que es un protocolo sin conexión, STUN juega un rol muy importante en ayudar a las entidades SIP corriendo detrás de NATs a establecer llamadas VoIP basadas en SIP.