ya revise mi scritp no encuentro el error. Ahora mi servidor Openser esta con IP privada igual que mi cliente SIP y manda siempre el mismo error:
U 192.168.1.121:5060 -> 192.168.1.120:5060 REGISTER sip:192.168.1.120 SIP/2.0. Via: SIP/2.0/UDP 192.168.1.121;branch=z9hG4bKb2035494949d9a35. From: "101" sip:101@192.168.1.120;user=phone;tag=3757aea6ad661399. To: sip:101@192.168.1.120;user=phone. Contact: sip:101@192.168.1.121;user=phone. Supported: replaces. Call-ID: a1379f16c9b2b889@192.168.1.121. CSeq: 101 REGISTER. Expires: 3600. User-Agent: Grandstream BT120 1.0.8.23. Max-Forwards: 70. Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE. Content-Length: 0. .
# U 192.168.1.120:5060 -> 192.168.1.121:5060 SIP/2.0 403 Forbidden. Via: SIP/2.0/UDP 192.168.1.121;branch=z9hG4bKb2035494949d9a35. From: "101" sip:101@192.168.1.120;user=phone;tag=3757aea6ad661399. To: sip:101@192.168.1.120;user=phone;tag=296e5534ec221f38aaeb93fb3aa63924.9c51. Call-ID: a1379f16c9b2b889@192.168.1.121. CSeq: 101 REGISTER. Server: OpenSER (1.2.2-notls (i386/linux)). Content-Length: 0.
Aqui esta mi scritp para que le hechen una ojeada y me sugieran algo:
debug=7 fork=no log_stderror=yes check_via=no alias="openser.org" listen=udp:192.168.1.120 port=5060 children=4 dns=no rev_dns=no log_facility = LOG_LOCAL7 log_stderror = no
mpath="/usr/local/lib/openser/modules/"
loadmodule "mysql.so" loadmodule "sl.so" loadmodule "tm.so" loadmodule "rr.so" loadmodule "maxfwd.so" loadmodule "usrloc.so" loadmodule "registrar.so" loadmodule "mi_fifo.so" loadmodule "textops.so" loadmodule "xlog.so" loadmodule "auth.so" loadmodule "auth_db.so" loadmodule "uri.so" loadmodule "uri_db.so" loadmodule "domain.so"
modparam("mi_fifo", "fifo_name", "/tmp/openser_fifo") modparam("auth_db|uri_db|usrloc", "db_url", "mysql://openser:openserrw@localhost/openser") modparam("auth_db", "calculate_ha1", no) modparam("auth_db", "password_column", "ha1") modparam("auth_db", "password_column_2", "ha1b")
modparam("usrloc", "db_mode", 2) modparam("rr", "enable_full_lr", 1)
## Tiempo para la llamada modparam("tm", "fr_inv_timer", 45)
modparam("domain", "db_url", "mysql://openser:openserrw@localhost/openser") modparam("domain", "db_mode", 1) ## Habilitamos la cache se la tabla domain
#----------------------------------------------------- # Main routing logic #----------------------------------------------------
route{ #---------------------------------------------- # LOG section #---------------------------------------------- # LOG del mensaje recibido
xlog("L_INFO","\n\n$Cbg[ $mi -- $rm -- $ua ($si:$sp) -- FROM: $fu -- TO: $tU -- ]$Cxx\n");
#---------------------------------------------- # Sanity Check Section #--------------------------------------------- # Comprobamos que el mensaje no sea demasiado largo ni halla superado max_forwards
if (!mf_process_maxfwd_header("10")) { sl_send_reply("483","Too Many Hops"); xlog("L_ERROR","\n\n$CwrToo Many Hops$Cxx\n"); exit; }; if(msg:len > max_len) { sl_send_reply("513","Message Overflow"); xlog("L_ERROR","\n\n$CwrMessage Overflow$Cxx\n"); exit; }
#---------------------------------------------------- # Record Route Section #---------------------------------------------------- # Nos ponemos en medio, poniendo una cabecera RecordRoute, # para que los mensajes pasen por nosotros. # Pero si es REGISTER no se debe hacer.
if (method=="REGISTER") { record_route(); };
#----------------------------------------------- # Loose Route Section #---------------------------------------------------
# Los mensajes pertenecientes a un mismo dialogo deben tomar el camino indicado por RecordRoute
if (loose_route()) { xlog("L_INFO","\n\n *** Estamos en loose_route() ***\n\n"); route(1); exit; };
#-------------------------------------------------------------- # Call Type Processing Section #-------------------------------------------------------------
# Mensajes con destino distinto de nuestro servidor, hacemos relay, pero Ruta de salientes if (!is_uri_host_local()) { if (is_from_local()) { route(4); } else { sl_send_reply("403", "Forbidden"); }; exit; }
# Mensajes con destino nuestro servidor (por ejemplo llamadas a usuarios registrados aqui # Tenemos que tratar explicitamente el ACK
if (method=="ACK") { xlog("L_INFO","$Cbx---Procesando un ACK *not within a dialog*$Cxx\n"); route(1); exit; }
## CANCEL messages can be safely processed with a simple call to t_relay() ##because SER will automatically match the CANCEL message to the original ##INVITE message (stateful).
## Para los CANCEL, con la ruta por defecto vale. else if (method=="CANCEL") { route(1); exit; } ## Los REGISTER los tratamos a parte (en la ruta 2) else if (method=="REGISTER") { route(2); exit; } ## Los INVITEs a la ruta 3 (autenticacion,...) else if (method=="INVITE") { route(3); exit; } ## Resto de casos (OPTIONS, REFER, BYE...) else { # Puede que venga a nosotros pero tengamos definido un alias a fuera. # lookup("aliases") nos da la nueva URI que puede sea !=myself. lookup("aliases"); if (!is_uri_host_local()) { xlog("L_INFO","$CrxNot my URI after the alias lookup$Cxx\n"); ## A las salientes route(4); exit; };
## Miramos si existe el destino en nuestra tabla "location". if (!lookup("location")) { xlog("L_INFO","$Crx404 User Not Found$Cxx\n"); sl_send_reply("404", "Not Found"); exit; };
## Si hemos llegado hasta aqu enrutamos el mensaje al destino por la ruta por defecto. route(1); exit; }; }
#------------------------------------------------------------ #Default message handler #-----------------------------------------------------------
route[1] { ## Indicamos que las respuestas que se originen aqui vayan a la ruta onreply_route[1] # asi sabemos lo que pasa t_on_reply("1"); if(!t_relay()) { sl_reply_error(); }; xlog("L_INFO","$CbxMessage is relayed; now exiting$Cxx\n"); exit; }
#------------------------------------------------------------------ #REGISTER message handler #------------------------------------------------------------------ route[2] { sl_send_reply("100", "Trying"); if (!www_authorize("","subscriber")) { xlog("L_INFO","$CbxSe necesita autenticacion para el REGISTER$Cxx\n"); www_challenge("","0"); exit; } else if (!check_to()) { ## Validate the supplied To: header against the previously ##validated digest credentials. If they do not match then we must ##reject the REGISTER. xlog("L_INFO","$Crx*** check_to() = NO!! ***$Cxx\n"); sl_send_reply("401", "Unauthorized"); exit; }; xlog("L_INFO","$Cbx*** REGISTER correcto ***$Cxx\n");
## Eliminamos las cabeceras relativas a la autenticacion, porque ya no son ##necesarias y no vamos a ir mandandolas por ahi... consume_credentials();
## Informo si es un UNREGISTER (RFC3261 10.2.2) if ($hdr(contact)=~";expires=0") || ($hdr(expires)=="0") { xlog("L_INFO","$Cbx*** UNREGISTER ***$Cxx\n"); }
## Guardamos la localizacio en la tabla "location". if (!save("location")) { sl_reply_error(); }; }
#------------------------------------------------------------- # INVITE Message Handler #------------------------------------------------------------
route[3] {
## Es necesario autenticarse para poder llamar if (!proxy_authorize("","subscriber")) { xlog("L_INFO","$CbxSe necesita autenticacion para el INVITE$Cxx\n"); proxy_challenge("","0"); exit; } if(uri=~"^sip:[29][0-9]{6}@.*") { xlog("L_INFO","$Cbx--- LLAMADA A FIJO O MOVIL ---$Cxx\n"); route(5); }
## Tienen que coincidir el nombre de usuario con el de la cabecera FROM else if (!check_from()) { xlog("L_INFO","$Crx*** check_from() = NO!! ***$Cxx\n"); sl_send_reply("403", "Use From=ID"); exit; }; xlog("L_INFO","$Cbx*** INVITE correcto ***$Cxx\n"); consume_credentials(); # Puede que venga a nosotros pero tengamos definido un alias a fuera. #lookup("aliases") nos da la nueva URI que puede sea !=myself. lookup("aliases"); if (!is_uri_host_local()) { ## A las salientes route(4); exit; }; if (!lookup("location")) { xlog("L_INFO","$Crx404 User Not Found$Cxx\n"); sl_send_reply("404", "User Not Found"); exit; };
## El usuario se ha autenticado y a quien llama existe en "location" asi que lo rutamos. route(1); }
#-------------------------------------------------------------------- #Outgoing #-------------------------------------------------------------------
route[4] { xlog("L_INFO","$Cbx*** Llamada saliente ***$Cxx\n"); route(1); exit; }
#------------------------------------------------------------------------------------ #onreply_route[1] Para ver las respuestas a los INVITE. #----------------------------------------------------------------------------
# Si un usuario hace un INVITE las respuestas del llamado (Trying, Ringing, OK...) pasan por aqui onreply_route[1] { xlog("L_INFO","\n\n$Cbc[Respuesta][ $rs ($rr) desde $si:$sp -- Peticion: ($rm) ] $Cxx\n"); }
El 25/01/08, Iñaki Baz Castillo ibc@aliax.net escribió:
El Viernes, 25 de Enero de 2008, Ronmel Jiron escribió:
hola,, tengo la siguiente estructura: Dos cliente SIP en una red privada los cuales se salen a trave de un Router IP, mi servidor OpenSER tiene IP publica. Cuando quiero registrar uno de mis clientes IP, sucede los siguiente:
U 200.30.xxx.xxxx:60049 -> 200.30.xxx.xxxx:5060 ##### Mi Router a mi Openser REGISTER sip:200.30.xxx.xxx SIP/2.0. ### Mi openser Via: SIP/2.0/UDP 192.168.1.31;branch=z9hG4bK5bbd0e954febb14c. ### mi cliente SIP From: "102" sip:102@200.30.xxx.xxx;user=phone;tag=5e474aa6e3664e89. #### mi openser To: sip:102@200.30.177.115;user=phone. #### mi openser Contact: sip:102@192.168.1.31;user=phone. ### cliente SIP Supported: replaces. Call-ID: 2ef635e380d63096@192.168.1.31. CSeq: 100 REGISTER. Expires: 3600. User-Agent: Grandstream BT120 1.0.8.23. Max-Forwards: 70. Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,INFO,SUBSCRIBE. Content-Length: 0.
U 200.30.177.115:5060 -> 200.30.177.124:5060 ### mi openser a mi Router SIP/2.0 403 Forbidden. Via: SIP/2.0/UDP 192.168.1.31;branch=z9hG4bK5bbd0e954febb14c;received=200.30.xxx.xxx. ### Router From: "102" sip:102@200.30.xxx.xxx;user=phone;tag=5e474aa6e3664e89. #### mi openser To: sip:102@200.30.xxx.xxx;user=phone;tag=c13c52eb7bdc65672ab688ebbd724ddf.4c 20. ### mi openser Call-ID: 2ef635e380d63096@192.168.1.31. ### cliente SIP CSeq: 100 REGISTER. Server: OpenSER (1.2.2-notls (i386/linux)). Content-Length: 0.
Que hay de malo en todo esto... ayuda por favor
El proxy está respondiendo con un "403 Forbidden" lo cual es incorrecto, debe ser "401 Unauthorized" (sólo usar 401 en los REGISTER, en el resto como INVITE, MESSAGE, etc usar "407 Unauthorized").
Así que tu proxy debería responder con "401" y mostrar la cabecera "WWW-Authenticate" en dicho "401".
Revisa esa parte del scritp y compárala con cualquier script (el que viene por defecto en OpenSer te sirve para corregirlo).
-- Iñaki Baz Castillo
Users-es mailing list Users-es@lists.openser.org http://lists.openser.org/cgi-bin/mailman/listinfo/users-es