Skip to content

Telmex troncal SIP con Asterisk11

Telmex troncal SIP con Asterisk11 published on 11 Comments on Telmex troncal SIP con Asterisk11

Contrate una línea Telmex y me instalaron un gateway Thomson TG712, la línea telefónica que sale del teléfono ya no se conecta a la pared, se conecta a un puerto FXS en el módem.
Al parecer ya no instalan teléfonos analógicos, y de hecho Telmex empezó a ofrecer paquetes de solo Internet.

Lo primero que hice fue obtener los datos de la cuenta voip, esto lo hice en la pagina de configuración de voz del módem.

https://192.168.1.254/cgi/b/_voip_/cfg/?be=0&l0=4&l1=2

Le di editar y obtuve el Usuario, Contraseña y SIP URI (En el caso de la contraseña se puede obtener del codigo fuente de la pagina, o con un plugin para mostrar passwords en el navegador)

[email protected]   y una contraseña numérica 12345678901234

Buscando en internet lpi.telmex.com encontré este proxy 201.116.100.193

Probé los datos con un cliente zoipper y en un instante se conecto pude hacer y recibir llamadas de mi línea Telmex.

Configure una troncal en mi asterisk de la siguiente manera:

[[email protected]]
type=peer
insecure=invite,register
host=lpi.telmex.com
outboundproxy=201.116.100.193
[email protected]
secret=12345678901234
authdomain=lpi.telmex.com
[email protected]
fromuser=555XXXXXXX
fromdomain=lpi.telmex.com
context=from-trunk-sip-lpi.telmex.com

[lpi.telmex.com]
type=peer
host=lpi.telmex.com
outboundproxy=201.116.100.193
[email protected]
secret=122076218223
authdomain=lpi.telmex.com
fromuser=4496880517
fromdomain=lpi.telmex.com
[email protected]
context=from-trunk-sip-lpi.telmex.com

register=4496880517:[email protected]/4496880517

No tengo mucha experiencia en conmutadores y trate de configurarlo utilizando las instrucciones pero por más que intente no se conectaba.

Capture y compare los paquetes de el zoipper con lo que mandaba el asterisk encontré 3 diferencias en la parte de Authorization:

 

  1. El campo de username= zoiper y thomson mandan username=”[email protected]”, Asterisk manda username=”555XXXXXXX” (sin el dominio, manda únicamente el numero
  2. El campo de uri= zoiper y thomson mandan uri=”sip:lpi.telmex.com”
  3. El campo de cnonce= zoiper y thomson mandan un hash cnonce=”fbe4225b8d4a9aXX8f320d12ad6aX72X”, Asterisk manda solo unos cuantos caracteres cnonce=”478ce5d6″

Autenticación digest como lo envía asterisk

12:17:48.691772 IP (tos 0x60, ttl 64, id 1157, offset 0, flags [none], proto UDP (17), length 678)
127.0.0.1.sip > lpi.telmex.com.sip: SIP, length: 650
REGISTER sip:lpi.telmex.com SIP/2.0
Via: SIP/2.0/UDP 127.0.0.1:5060;branch=z9hG4bK5c8ebb6c
Max-Forwards: 70
From: ;tag=as7b5837f5
To:
Call-ID: 36d16558757888ef679d138e4[email protected]
CSeq: 103 REGISTER
User-Agent: FPBX-2.11.0beta2(11.1.0)
Authorization: Digest username=”555XXXXXXX”, realm=”ims.telmex.com”, algorithm=MD5, uri=”sip:sip:[email protected]”, nonce=”27902ec82235618e07f9a134c9599455″, response=”d43dee94422d68b246c1433748ed07ce”, qop=auth, cnonce=”478ce5d6″, nc=00000001
Expires: 120
Contact:
Content-Length: 0

La parte que no cuadra es esta:

Authorization: Digest username=”555XXXXXXX”, realm=”ims.telmex.com”, algorithm=MD5, uri=”sip:sip:[email protected]”, nonce=”27902ec82235618e07f9a134c9599455″, response=”d43dee94422d68b246c1433748ed07ce”, qop=auth, cnonce=”478ce5d6″, nc=00000001

Revisando el modulo chan_sip.c note que asterisk no calculaba los hashes para cnonce y el usuario le quitaba la parte despues del @.

Asi que modifique el modulo, la única función que se necesita modificar es la de build_reply_digest Justo en la parte que tiene el comentario /* Calculate SIP digest response */

Ahí justo despues del comentario agregue el siguiente bloque de código para cuando la uri contenga Telmex cumpla con los requisitos del servidor:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  if(telmex){
                char cnonce_hash[256];
                ast_md5_hash(cnonce_hash, cnonce);
                snprintf(a1, sizeof(a1), "%[email protected]:%s:%s", username, p->realm, secret);
                snprintf(a2, sizeof(a2), "%s:sip:lpi.telmex.com", sip_methods[method].text);
                if (!ast_strlen_zero(md5secret))
                        ast_copy_string(a1_hash, md5secret, sizeof(a1_hash));
                else
                        ast_md5_hash(a1_hash, a1);
                ast_md5_hash(a2_hash, a2);
 
                p->noncecount++;
                if (!ast_strlen_zero(p->qop))
                        snprintf(resp, sizeof(resp), "%s:%s:%08x:%s:%s:%s", a1_hash, p->nonce, p->noncecount, cnonce_hash, "auth", a2_hash);
                else
                        snprintf(resp, sizeof(resp), "%s:%s:%s", a1_hash, p->nonce, a2_hash);
                ast_md5_hash(resp_hash, resp);
 
                /* only include the opaque string if it's set */
                if (!ast_strlen_zero(p->opaque)) {
                        snprintf(opaque, sizeof(opaque), ", opaque="%s"", p->opaque);
                }
 
                /* XXX We hard code our qop to "auth" for now.  XXX */
                if (!ast_strlen_zero(p->qop))
                        snprintf(digest, digest_len, "Digest username="%[email protected]telmex.com", realm="%s", algorithm=MD5, uri="sip:lpi.telmex.com", nonce="%s", response="%s"%s, qop=auth, cnonce="%s", nc=%08x", username, p->realm, p->nonce, resp_hash, opaque, cnonce_hash, p->noncecount);
                else
                                        snprintf(digest, digest_len, "Digest username="%[email protected]telmex.com", realm="%s", algorithm=MD5, uri="sip:lpi.telmex.com", nonce="%s", response="%s"%s", username, p->realm, p->nonce, resp_hash, opaque);
 
                append_history(p, "AuthResp", "Auth response sent for %s in realm %s - nc %d", username, p->realm, p->noncecount);
 
                if (credentials) {
                        ao2_t_ref(credentials, -1, "Unref auth for digest");
                }
                return 0;
        }