Instalando OpenSIPS

OpenSIPS es una proxy SIP, registra y establece llamadas entre clientes SIP a continuación se mostrara la forma de instalarlo y configurarlo poco a poco, todo esto basándome en un libro recién publicado que trata sobre este tema el cual es Building Telephony Systems with OpenSIPS 1.6 de Flavio E. Goncalves.
Mas que nada es como un ejercicio para no olvidar los pasos y procedimientos.

El equipo a utilizar es mi propia portátil con Debian Lenny. Antes que nada necesitamos los siguientes paquetes:

# aptitude install gcc bison flex make openssl libmysqlclient-dev libradiusclient-ng2 libradiusclient-ng-dev mysql-server libxmlrpc-c3-dev

Descargamos, compilamos e instalamos con los módulos correspondientes.

$ wget http://opensips.org/pub/opensips/1.6.1/src/opensips-1.6.1-tls_src.tar.gz
$ tar xfz opensips-1.6.1-tls_src.tar.gz
$ cd opensips-1.6.1-tls
$ make all include_modules=”db_mysql aaa_radius”
$ make install include_modules=”db_mysql aaa_radius”

Los módulos y archivos de configuración se encuentran en /usr/local/lib/opensips/modules/ y /usr/local/etc/opensips/ respectivamente.

Con el archivo por defecto (/usr/local/etc/opensips/opensips.cfg) ya podemos iniciar un simple registro y realizar una llamada entre dos agentes SIP, sin embargo vamos a eliminar del archivo todo el código comentado e innecesario para así poder tener un archivo base mas claro el cual nombraremos simbólicamente opensips.cfg.0 el cual se muestra a continuación:

####### Global Parameters #########
debug=3
log_stderror=no
log_facility=LOG_LOCAL0

fork=yes
children=4

port=5060

#listen=udp:192.168.1.161:5060

####### Modules Section ########

#set module path
mpath="/usr/local/lib/opensips/modules/"

/* uncomment next line for MySQL DB support */
#loadmodule "db_mysql.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "textops.so"
loadmodule "mi_fifo.so"
loadmodule "uri.so"
loadmodule "xlog.so"
loadmodule "acc.so"

# ----- mi_fifo params -----
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")
modparam("rr", "enable_full_lr", 1)
modparam("rr", "append_fromtag", 0)

# ----- usrloc params -----
modparam("usrloc", "db_mode",   0)
# ----- uri params -----
modparam("uri", "use_uri_table", 0)
# ----- acc params -----
/* what sepcial events should be accounted ? */
modparam("acc", "early_media", 1)
modparam("acc", "report_ack", 1)
modparam("acc", "report_cancels", 1)
modparam("acc", "detect_direction", 0)
modparam("acc", "failed_transaction_flag", 3)
modparam("acc", "log_flag", 1)
modparam("acc", "log_missed_flag", 2)
modparam("acc", "db_flag", 1)
modparam("acc", "db_missed_flag", 2)

route{

	if (!mf_process_maxfwd_header("10")) {
		sl_send_reply("483","Too Many Hops");
		exit;
	}

	if (has_totag()) {
		if (loose_route()) {
			if (is_method("BYE")) {
				setflag(1); # do accounting ...
				setflag(3); # ... even if the transaction fails
			} else if (is_method("INVITE")) {
				record_route();
			}
			route(1);
		} else {
			if ( is_method("ACK") ) {
				if ( t_check_trans() ) {
					t_relay();
					exit;
				} else {
					exit;
				}
			}
			sl_send_reply("404","Not here");
		}
		exit;
	}

	if (is_method("CANCEL"))
	{
		if (t_check_trans())
			t_relay();
		exit;
	}

	t_check_trans();

	if (loose_route()) {
		xlog("L_ERR",
		"Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]");
		if (!is_method("ACK"))
			sl_send_reply("403","Preload Route denied");
		exit;
	}

	# record routing
	if (!is_method("REGISTER|MESSAGE"))
		record_route();

	# account only INVITEs
	if (is_method("INVITE")) {
		setflag(1); # do accounting
	}
	if (!uri==myself)
	{
		append_hf("P-hint: outboundrn");
		route(1);
	}

	if (is_method("PUBLISH"))
	{
		sl_send_reply("503", "Service Unavailable");
		exit;
	}

	if (is_method("REGISTER"))
	{
		if (!save("location"))
			sl_reply_error();

		exit;
	}

	if ($rU==NULL) {
		# request with no Username in RURI
		sl_send_reply("484","Address Incomplete");
		exit;
	}

	# do lookup with method filtering
	if (!lookup("location","m")) {
		switch ($retcode) {
			case -1:
			case -3:
				t_newtran();
				t_reply("404", "Not Found");
				exit;
			case -2:
				sl_send_reply("405", "Method Not Allowed");
				exit;
		}
	}
	# when routing via usrloc, log the missed calls also
	setflag(2);
	route(1);
}

route[1] {
	# for INVITEs enable some additional helper routes
	if (is_method("INVITE")) {
		t_on_branch("2");
		t_on_reply("2");
		t_on_failure("1");
	}

	if (!t_relay()) {
		sl_reply_error();
	};
	exit;
}

branch_route[2] {
	xlog("new branch at $run");
}


onreply_route[2] {
	xlog("incoming replyn");
}


failure_route[1] {
	if (t_was_cancelled()) {
		exit;
	}
}

Iniciamos OpenSIPS.

# opensipsctl start

INFO: Starting OpenSIPS :
INFO: started (pid: 6359)

Registramos el usuario 1000 contraseña 1000 y usuario 1001 contraseña 1001 a la IP de nuestro equipo corriendo el proxy, en estos momentos aun no introducimos la autenticación de usuarios, por lo tanto debemos registrarnos sin problemas.

Aquí mostramos la traza SIP al registrar el primer usuario con un ATA de Linksys, vemos el register que realiza y el ok enviado por el servidor, esto lo capturamos con ngrep. (ngrep –p –q –W byline port 5060 > register1000C.txt)

U 192.168.1.162:5061 -> 192.168.1.161:5060
REGISTER sip:192.168.1.161 SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.162:5061;branch=z9hG4bK-37cd1d0c.
From: Bozada ;tag=711253242c005ba6o1.
To: Bozada .
Call-ID: 3746d82e-460188b6@192.168.1.162.
CSeq: 20974 REGISTER.
Max-Forwards: 70.
Contact: Bozada ;expires=3600.
User-Agent: Linksys/SPA2102-3.3.6.
Content-Length: 0.
Allow: ACK, BYE, CANCEL, INFO, INVITE, NOTIFY, OPTIONS, REFER.
Supported: x-sipura.
.
U 192.168.1.161:5060 -> 192.168.1.162:5061
SIP/2.0 200 OK.
Via: SIP/2.0/UDP 192.168.1.162:5061;branch=z9hG4bK-37cd1d0c.
From: Bozada ;tag=711253242c005ba6o1.
To: Bozada ;tag=c97b4d1cb1f3d0da549e06a8d482ef63.3318.
Call-ID: 3746d82e-460188b6@192.168.1.162.
CSeq: 20974 REGISTER.
Contact: ;expires=3600.
Server: OpenSIPS (1.6.1-notls (i386/linux)).
Content-Length: 0.

Registrados los dos usuarios realizamos una simple llamada desde el usuario 1000 al 1001, y aquí mostramos lo que pasa mediante SIP para establecer la llamada, entre el ultimo ACK y el primer BYE esta el flujo RTP. (capturado con Wireshark)

| 192.168.1.162     			| 192.168.1.161 (proxy)			| 192.168.1.163
|         INVITE SDP ( telephone-event)	|          				|
|(5061)   ------------------>  (5060)   |                   			|
|         100 Giving a try              |                   			|
|(5061)     (5060)   |
|                   			|         180 Ringing                   |
|                   			|(5060)   <------------------  (5060)   |
|         180 Ringing                   |                   			|
|(5061)   <------------------  (5060)   |                   			|
|                   			|         200 OK SDP ( 97)              |
|                   			|(5060)   <------------------  (5060)   |
|         200 OK SDP ( 97)              |                   			|
|(5061)     (5060)   |                   			|
|                   			|         ACK                           |
|                   			|(5060)   ------------------>  (5060)   |
|         BYE       			|                                       |
|(5061)   ------------------>  (5060)   |                   			|
|                   			|         BYE                           |
|                   			|(5060)   ------------------>  (5060)   |
|                   			|         200 OK                        |
|                   			|(5060)   <------------------  (5060)   |
|         200 OK    			|                                       |
|(5061)   <------------------  (5060)   |                   			|

Por el momento es todo.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: