[OpenSER-Users-ES] ayuda con Register

Ronmel Jiron ronmeljiron at gmail.com
Wed Jan 30 16:42:42 CET 2008


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 at 192.168.1.120;user=phone>;tag=3757aea6ad661399.
To: <sip:101 at 192.168.1.120;user=phone>.
Contact: <sip:101 at 192.168.1.121;user=phone>.
Supported: replaces.
Call-ID: a1379f16c9b2b889 at 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 at 192.168.1.120;user=phone>;tag=3757aea6ad661399.
To: <sip:101 at 192.168.1.120;user=phone>;tag=296e5534ec221f38aaeb93fb3aa63924.9c51.
Call-ID: a1379f16c9b2b889 at 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 at 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 at 200.30.xxx.xxx;user=phone>;tag=5e474aa6e3664e89.
> > #### mi openser
> > To: <sip:102 at 200.30.177.115;user=phone>. #### mi openser
> > Contact: <sip:102 at 192.168.1.31;user=phone>. ### cliente SIP
> > Supported: replaces.
> > Call-ID: 2ef635e380d63096 at 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 at 200.30.xxx.xxx;user=phone>;tag=5e474aa6e3664e89.
> > #### mi openser
> > To:
> > <sip:102 at 200.30.xxx.xxx;user=phone>;tag=c13c52eb7bdc65672ab688ebbd724ddf.4c
> >20. ### mi openser
> > Call-ID: 2ef635e380d63096 at 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 at lists.openser.org
> http://lists.openser.org/cgi-bin/mailman/listinfo/users-es
>


-- 
Ronmel Jiron Sandres




More information about the Users-es mailing list