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(a)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(a)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(a)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(a)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(a)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(a)lists.openser.org
http://lists.openser.org/cgi-bin/mailman/listinfo/users-es
--
Ronmel Jiron Sandres