Mudanças entre as edições de "OpenSIPs e Asterisk"

De opensipsbrasil - wiki
Ir para navegação Ir para pesquisar
Linha 863: Linha 863:
  
  
Agora vamos abrir o arquivo '''conf/dialplan/public.xml''' e configurar nosso dialplan.
+
Agora vamos abrir o arquivo '''conf/dialplan/default.xml''' e configurar nosso dialplan.
  
No fim do arquivo antes de fechar a opção '''</context>''', acrescente as seguintes configurações.
+
No fim do arquivo antes de fechar a opção '''</context>''', você tem a regra para enum, colque estas regras antes desta opção de enum ou o sistema não vai chegar nelas,  acrescente as seguintes configurações.
 
<pre>
 
<pre>
    <extension name="from_opensips">
 
        <condition field="network_addr" expression="^10\.254\.254\.6$" />
 
        <condition field="destination_number" expression="^(.+)$">
 
          <action application="transfer" data="$1 XML default" />
 
        </condition>
 
    </extension>
 
  
 
     <extension name="vbox">
 
     <extension name="vbox">
Linha 903: Linha 897:
 
</pre>
 
</pre>
  
 +
 +
Altere agora o arquivo '''conf/dialplan/public.xml''' e acrecente a seguinda entrada no fim do arquivo (antes da opção '''</context>'''
 +
 +
<pre>
 +
    <extension name="from_opensips">
 +
        <condition field="network_addr" expression="^10\.254\.254\.6$" />
 +
        <condition field="destination_number" expression="^(.+)$">
 +
          <action application="transfer" data="$1 XML default" />
 +
        </condition>
 +
    </extension>
 +
 +
</pre>
  
 
Agora precisamos ajustar os ramais, entre no diretorio '''conf/directory/default/''' e crie os arquivo abaixo.
 
Agora precisamos ajustar os ramais, entre no diretorio '''conf/directory/default/''' e crie os arquivo abaixo.

Edição das 20h49min de 3 de agosto de 2013

Este tutorial é estritamente baseado num tutorial similar porém utilizando Kamailio, se quiser verificar o tutorial original acesse http://kb.asipto.com/freeswitch:kamailio-3.1.x-freeswitch-1.0.6d-sbc.

Para esta implementação utilizamos Debian 7.0 amd64 , OpenSIPS 1.9 e FreeSwitch XXXx ( coloco a versão logo mais )

Funcionalidades

Este tutorial tem por objetivo atingir as seguintes funcionalidades.

  • Autenticação de usuário
  • Registro de usuário
  • Localização de usuário (encaminhamento de chamadas)
  • Roteamento de chamadas
  • Mensagens instantânea e presença (PRESENCE)

Através do FreeSwitch estenderemos estas funcionalidades agregando.

  • Correio de voz (Voicemail)
  • Conferencia
  • SBC ( Pode ser utilizado para transcoding, esconder topologia, play de mensagens e tarifação )
  • Outros serviços de media (Anuncios, Ura's e coisas do tipo)

Definições

Para um melhor entendimento da solução vamos expor aqui algumas definições de nosso sistema.

  • Usuários locais terão ramais com 3 digitos (ex: 101, 102, 103)
  • Identidade do correio de voz será o mesmo do ramal
  • Serviços de media (acesso a voicemail e outros) receberão rotas de 4 digitos
  • Opensips e Freeswitch utilizarão o mesmo servidor (Neste caso IP: 10.254.254.6)
  • Os serviços rodarão nas portas 5060 (opensips) , 5090 (Freeswitch (perfil interno)) e 5092 (Freeswitch (Perfil externo))

Funcionamento

A autenticação do usuário será realizada pelo OpenSIPs, quando uma chamada é autenticada então ela serguirá:

  • Se o usuário de destino não está online a chamada será enviada para o FreeSwitch para função de correio de voz
  • Se o usuário está online a chamada será encaminhada para o Freeswitch, dest forma é possivel acionar funcionalidades como anuncios, definição de tempo de chamada, forçar codecs e outras funcionalidades.
  • FreeSwitch envia a chamada novamente para o OpenSIPs que verificará no location e entregará a chamada para o usuário.
  • Se a chamada não for atendida o Freeswitch enviará a chamada para o correio de voz.

OpenSIPs

Vamos iniciar o processo de instalação com o OpenSIPs, siga os procedimentos abaixo para evitar qualquer dificuldade.

Dependencias

Execute o comando abaixo para instalar todas as dependencias necessárias

apt-get install gcc make libncurses5-dev libnewt-dev libxml2-dev unixodbc \ 
unixodbc-dev libmysqlclient15-dev libxmlrpc-c3-dev libexpat1-dev zlib1g-dev \ 
m4 bison flex libpcre3-dev mysql-server vim apache2-mpm-prefork libapache2-mod-php5 \
 php5-mysql php5-xmlrpc php-pear  ngrep g++ libjpeg62-dev libssl-dev 


Durante a instalação o sistema irá lhe perguntar a senha de root para o servidor MySQL é importante que você se lembre da mesma posteriormente pois utilizaremos a mesma.

Compilando o OpenSIPs

Para manter um padrão onde os dados estao vamos utilizar o diretório /usr/src/ para o download de código fonte.

cd /usr/src/
wget -c http://opensips.org/pub/opensips/1.9.1/src/opensips-1.9.1_src.tar.gz
tar -xzvf opensips-1.9.1_src.tar.gz
cd opensips-1.9.1-tls/
make menuconfig

Neste ponto o sistema irá abrir uma tela com algumas opções para selecionar, Acesse a primeira opção do menu, no submenu acesse a segunda opção ( Configure excluded modules ), selecione os módulos db_mysql , dialplan , mi_xmlrpc , presence e presence_xml

Agora volte ao submenu, e selecione a opção Save Changes, volte para o menu principal e selecione Compile and Install OpenSips , deixe que o sistema execute suas funções.


Ao finalizar a compilação você retornará ao menu, va na opção Exit and Save all changes

Preparando a Configuração

Antes de darmos inicio ao arquivo de configuração, vamos ajustar algumas questões, o opensips instala os arquivos (se voce nao alterar o parametro) em /usr, consequentemente as configurações ficam em /usr/etc , eu por padrão faço um link para o diretório /etc, assim acesso as configurações em /etc/opensips

ln -s /usr/etc/opensips /etc/

No caso do debian o script de inicialização utiliza um arquivo extra de configuração

cp packaging/debian/opensips.default /etc/default/opensips

Para o script de inicialização execute o comando abaixo

cp packaging/debian/opensips.init /etc/init.d/opensips
chmod +x /etc/init.d/opensips
update-rc.d opensips defaults

Edite o arquivo /etc/default/opensips , a altere o parametro RUN_OPENSIPS para yes

Você pode notar que no arquivo é mensionado o usuário de execução do opensips como opensips, então vamos ter de criar este usuário ( e grupo )

groupadd opensips
mkdir /var/run/opensips
useradd -d /var/run/opensips/ -s /bin/false -g opensips opensips
chown -R opensips.opensips /var/run/opensips


Configurando o opensipsctl

O opensipsctl (e opensipsdbctl) utilizam o arquivo de configuração /etc/opensips/opensipsctlrc, abaixo segue o conteúdo do arquivo. (Sugiro que você faça um backup dos arquivos originais para ter uma copia, existem parametros que você pode estudar depois).

DBENGINE=MYSQL
DBHOST=localhost
DBNAME=opensips
DBRWUSER=opensips
DBRWPW="opensipsrw"

DBROOTUSER="root"
INSTALL_EXTRA_TABLES=ask
ALIASES_TYPE="DB"
MI_CONNECTOR=FIFO:/tmp/opensips_fifo
# VERIFY_ACL=1
# ACL_GROUPS="local ld int voicemail free-pstn"
# VERBOSE=1
# STORE_PLAINTEXT_PW=0
# NOHLPRINT=1
PID_FILE=/var/run/opensips/opensips.pid

Criando o banco de dados

Agora que temos nosso arquivo configurado vamos fazer a criação do banco de dados, execute o comando abaixo.

opensipsdbctl create opensips

O sistema irá lhe perguntar algumas coisas, responda Y (sim) para todas para que ele instale todas as tabelas, não usaremos todas elas, mas desta forma você fica com praticamente tudo criado para o caso de uma expansão dos recursos.


Instalando o RTP Proxy

cd /usr/src/
wget -c http://b2bua.org/chrome/site/rtpproxy-1.2.1.tar.gz
tar -xzvf rtpproxy-1.2.1.tar.gz
cd rtpproxy-1.2.1
./configure
make
make install
groupadd rtpproxy
useradd -d /var/run/rtpproxy -s /bin/true -g rtpproxy rtpproxy
mkdir /var/log/rtpproxy
mkdir /var/run/rtpproxy
chown -R rtpproxy.rtpproxy /var/log/rtpproxy
chown -R rtpproxy.rtpproxy /var/run/rtpproxy

=Arquivo de inicialização

/etc/init.d/rtpproxy

#!/bin/bash
#
# Este script e de autoria de Mike Tesliuk
# qualquer falha no mesmo por favor informe 
# atraves do email mike (a) tesliuk.com
#
### BEGIN INIT INFO
# Provides:          rtpproxy
# Required-Start:    $syslog $network $local_fs $time
# Required-Stop:     $syslog $network $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start the RTPPROXY server
# Description:       Start the RTPPROXY server
### END INIT INFO

PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
USELOG=1
USER=rtpproxy
# Altere o ip abaixo para o ip de seu sistema
IPADDR="10.254.254.6"

. /lib/lsb/init-functions


start(){
        echo "Iniciando RTP PROXY "
        if [ -z $(pidof rtpproxy) ]; then
                if [ "${USELOG}" = "1" ]; then
                        echo "Iniciando com LOG"
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER -F -f d DBUG 2&> /var/log/rtpproxy/rtpproxy.log &
                else
                        echo "Iniciando sem LOG"
                        /usr/local/bin/rtpproxy -l $IPADDR -s udp:127.0.0.1:7722 -u $USER  -F -f d DBUG 2&> /dev/null
                fi

                if [ -n $(pidof rtpproxy) ]; then
                        echo "START OK"
                fi
        else
                echo "Processo ja em execucao"
        fi
}


stop(){

        if [ -z $(pidof rtpproxy) ]; then
                echo "Processo nao encontrado"
        else
                kill -9 $(pidof rtpproxy)
                if [ -n $(pidof rtpproxy) ]; then
                        echo "STOP OK"
                else
                        echo "Falha em realizar stop do servico"
                fi

        fi
}

case $1 in
        start)
                start
        ;;
        stop)
                stop
        ;;
        restart)
                stop
                start

        ;;
        *)
                echo "Utilize: stop | start | restart"
        ;;
esac

Vamos dar permissao e colocar na inicialização

chmod +x /etc/init.d/rtpproxy 
update-rc.d rtpproxy defaults
/etc/init.d/rtpproxy start


Criando o arquivo opensips.cfg

O arquivo opensips.cfg é a onde a coisa toda acontece para o opensips, claro que ele dependerá de informações que estarão no banco de dados, mas é onde criamos todas as nossas rotas e validações.


Este tutorial nao esta terminado, este arquivo ainda esta em testes

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

fork=yes
children=4

/* Descomente as linhas abaixo para ativar o debug */
debug=6
fork=no
log_stderror=yes


/* Comente a linha abaixo para ativar a descoberta automatica de enderecos locais
 , isso significa que o sistema ira verificar todos os ips ativos e hosts e entao ativara
 o protocolo para todos eles */ 
auto_aliases=no

/* Defina aqui o ip a ser utilizado */
listen=udp:10.254.254.6:5060   # Altere este IP para o seu ambiente

/* Nao usaremos sip por tcp nem tls neste script */
disable_tcp=yes

disable_tls=yes


####### Secao de modulos ########

#set module path
mpath="/usr//lib64/opensips/modules/"

loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
modparam("tm", "fr_timer", 5)
modparam("tm", "fr_inv_timer", 30)
modparam("tm", "restart_fr_on_each_reply", 0)
modparam("tm", "onreply_avp_mode", 1)

loadmodule "rr.so"
/* do not append from tag to the RR (no need for this script) */
modparam("rr", "append_fromtag", 0)


loadmodule "maxfwd.so"
loadmodule "sipmsgops.so"
loadmodule "mi_fifo.so"
modparam("mi_fifo", "fifo_name", "/var/run/opensips/opensips_fifo")
modparam("mi_fifo", "fifo_mode", 0666)

loadmodule "db_mysql.so"


loadmodule "uri.so"
modparam("uri", "use_uri_table", 0)

loadmodule "usrloc.so"
modparam("usrloc", "nat_bflag", "FLB_NATB")
modparam("usrloc", "db_mode",   2)
modparam("usrloc", "db_url",  "mysql://opensips:opensipsrw@localhost/opensips")


loadmodule "registrar.so"
modparam("registrar", "tcp_persistent_flag", "TCP_PERSISTENT")

/* Descomente a linha abaixo para nao permitir mais de 10 contatos por conta */
#modparam("registrar", "max_contacts", 10)

loadmodule "acc.so"
/* Quais eventos deverao ser registrados ? */
modparam("acc", "early_media", 0)
modparam("acc", "report_cancels", 0)
/* por padrao nos nao ajustamos a direcao em requisicoes sequencias, 
 se voce deseja usar este recurso tenha certeza de ativar o "appen_fromtag" 
 para o modulo "rr" */
modparam("acc", "detect_direction", 0)
modparam("acc", "failed_transaction_flag", "FLT_ACCFAILED")
/* Gatilhos para accounting  (flags) */
modparam("acc", "log_flag", "FLT_ACC")
modparam("acc", "log_missed_flag", "FLT_ACCMISSED")
modparam("acc", "log_extra", 
	"src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")
modparam("acc", "db_flag", "FLT_ACC")
modparam("acc", "db_missed_flag", "FLT_ACCMISSED")
modparam("acc", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("acc", "db_extra", "src_user=$fU;src_domain=$fd;dst_ouser=$tU;dst_user=$rU;dst_domain=$rd" )

loadmodule "auth.so"
loadmodule "auth_db.so"
modparam("auth_db", "db_url",  "mysql://opensips:opensipsrw@localhost/opensips")
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "")


loadmodule "permissions.so"
modparam("permissions", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")

loadmodule "alias_db.so"
modparam("alias_db", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")

loadmodule "presence.so"
modparam("presence", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")

#loadmodule "presence_xml.so"


loadmodule "dialog.so"
modparam("dialog", "db_mode", 2)
modparam("dialog", "db_url","mysql://opensips:opensipsrw@localhost/opensips")
modparam("dialog", "dlg_match_mode", 1)
#modparam("dialog", "default_timeout", 60)

loadmodule "siptrace.so"
modparam("siptrace", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("siptrace", "trace_flag", 22)
modparam("siptrace", "traced_user_avp", "$avp(s:traceuser)")


loadmodule "nathelper.so"
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", "FLB_NATSIPPING")
modparam("nathelper", "sipping_from", "sip:pinger@10.254.254.6") # Altere o ip para o ip do servidor
modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")

loadmodule "rtpproxy.so"
modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")



####### Logica de roteamento ########


route {

	if (!mf_process_maxfwd_header("3")) {
                send_reply("483","looping");
                exit;
        }

	xlog("REQUISICAO RECEBIDA, ENVIANDO PARA REQINIT");
	# Checagem inicial por requisicao
	route(REQINIT);

	xlog("ENVIANDO PARA NAT");
	# Deteccao de nat
	route(NAT);

	xlog("ENVIANDO PARA WITHINDLG");
	# Gerenciando requisicaoes com dialog
	route(WITHINDLG);

	# Manipulando requisicoes iniciais (nao consta To tag)
	
	# Processando CANCEL

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

	t_check_trans();

	# Enviando para autenticacao
	xlog("ENVIANDO PARA AUTENTICACAO");
	route(AUTH);

	# gravando rota para formacao dos dialogs (caso sejam roteados)
	# removemos qualquer cabecalho de rota pre carregado
	remove_hf("Route");
	if(is_method("INVITE|SUBSCRIBE")){
		xlog("METHOD INVITE OU SIBSCRIBE");
		record_route();
	}

	# Contabilizando (acc) INVITES
	if(is_method("INVITE")){
		xlog("METHOD INVITE, FAZENDOA ACC");
		setflag(FLT_ACC);
	}

	# Enviando chamada para destinos externos
	xlog("ENVIANDO PARA SIPOUT");
	route(SIPOUT);

	# Requisicoes para dominio local
	
	# Roteando requisicoes de PRESENCE
	xlog("ENVIANDO PARA PRESENCE");

	route(PRESENCE);

	# Gerenciando pedidos de registro
	xlog("ENVIANDO PARA REGISTRAR");	
	route(REGISTRAR);

	if($ru==""){
		xlog("ru --> vazio");
		# Requisicao sem usuario na RURI
		sl_send_reply("484", "Address Incomplete");
	}

	# Enviando requisicao para PSTN
	xlog("ENVIANDO PARA PSTN");
	route(PSTN);


	# Salvando informacao de quem originou a chamad
	$avp(callee)=$rU;
	xlog("ENVIANDO PARA DISPATCH PSTN");
	route(FSDISPATCH);


	
	# Servico de localizacao de usuario
	route(LOCATION);

	# Efetuando o relay (encaminhamento)
	route(RELAY);



}


route[RELAY] {
	if(check_route_param("nat=yes")){
		setbflag(FLB_NATB);
	}

	if(isflagset(FLT_NATS) || isbflagset(FLB_NATB)){
		route(RTPPROXY);
	}

	if(is_method("INVITE")){
		t_on_reply("REPLY_ONE");
		t_on_failure("FAIL_ONE");
	}

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

	exit;
}


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


route[WITHINDLG] {
	if(has_totag()){
		if(loose_route()){
			if(is_method("BYE")){
				setflag(FLT_ACC);
				setflag(FLT_ACCFAILED);
			}
			route(RELAY);
		}else{
			if(is_method("SUBSCRIBE") && uri==myself) {
				# requisicao de subscribe pre-estabelecida
				route(PRESENCE);
				exit;
			}

			if(is_method("ACK")){
				if(t_check_trans()){
					t_relay();
					exit;
				}
			}else{
				# ACK para transacao nao encontrada, ignoramos...
				exit;

			}
			
			sl_send_reply("404", "Not Here");

		}	
		exit;
	}
}


route[REGISTRAR] {

	if(is_method("REGISTER")){
		if(isflagset(FLT_NATS)){
			setbflag(FLB_NATB);
		}

		if(!save("location")){
			sl_reply_error();
		}

		exit;
	}

}

route[LOCATION] {

	alias_db_lookup("dbaliases");
	if(!lookup("location")){
		switch($rc) {
			case -1:
			case -3:
				t_newtran();
				t_reply("404","Not Found");
				exit;
			case -2:
				sl_send_reply("405", "Method Not Allowed");
				exit;
		}
	}


	if(is_method("INVITE")){
		setflag(FLT_ACCMISSED);
	}

	

}

route[PRESENCE] {
	if(!is_method("PUBLISH|SUBSCRIBE")){
		return;
	}

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

	if(is_method("PUBLISH")){
		handle_publish();
	}else if(is_method("SUBSCRIBE")){
		handle_subscribe();
	}
	exit;

}


route[AUTH]{
	xlog("PEDIDO DE AUTENTICACAO");
	if(is_method("REGISTER")){
		# atentica pedidos de registro
		if(!www_authorize("", "subscriber")){
			www_challenge("", "0");
			exit;
		}

		if($au!=$tU){
			sl_send_reply("403", "Forbidden auth ID");
			exit;
		}

		
	}else{
		if(route(FSINBOUND)){
			return;
		}

		if(check_source_address("0")){
			return;
		}

		if(from_uri==myself){
			if(!proxy_authorize("", "subscriber")){
				proxy_challenge("","0");
				exit;
			}

			if(is_method("PUBLISH")){
				if($au!=$tU){
					sl_send_reply("403", "Forbidden auth ID");
					exit;
				}
				
			}else{
				if($au!=$fU){
					sl_send_reply("403", "Forbidden auth ID");
					exit;
				}
			}

			
			# Validamos (autenticamos) o usuario
			consume_credentials();
		}else{
		
			# usuario nao e local, vamos negar
			if(!uri==myself){
				sl_send_reply("403", "Not relaying");
				exit;
			}	
		}
	}

	return;
}


route[NAT] {
	force_rport();
	if(nat_uac_test("19")){
		if(method=="REGISTER"){
			fix_nated_register();
		}else{
			fix_nated_contact();
		}
		setflag(FLT_NATS);
	}

	return;
}

route[RTPPROXY] {
	if(is_method("BYE")){
		unforce_rtp_proxy();
	}else if(is_method("INVITE")){
		engage_rtp_proxy();
	}

	if(!has_totag()){
		add_rr_param(";nat=yes");
	}

	return;
}

route[SIPOUT]{
	if(!uri==myself){
		append_hf("P-hint: outbound\r\n");
		route(RELAY);
	}
}

route[PSTN]{
	# verificar esta definicao
	return;
}

route[XMLRPC]{
	# nao vamos implementar esta funcionalidade
	return;
}

route[FSINBOUND] {
	# verificar para validar o ip do freeswitch:porta
	# se bater , responder com return 1;

	return(-1);
}

route[FSDISPATCH] {

	if(!is_method("INVITE")){
		return;
	}

	if(route(FSINBOUND)){
		return;
	}

	switch($rU){
		case "^41$":
			#regra de menu de voicemail, apenas 
			# usuarios autenticados
			if($au==""){
				sl_send_reply("403", "Not Allowed");
				exit;
			}

			$rU = "vm-" + $au;
		break;
		case "^441[0-9][0-9]$":
			# numero discado comeca com 441 seguido de dois digitos
			# chamada direta para inbox do voicemail
			strip(2);
		break;
		case "^443[01][0-9][0-9]$":
			# numero comecado em 443, seguido de 0 ou 1, mais dois digitos
			# sistema de conferencia
			strip(2);
		break;
		case "^45[0-9]+$":
			#numero comecado com 45, seguindo de numeros;
			strip(2);
		default:
			# usuario offline, enviando para voicemail
			if(!registered("location")){
				route(FSVBOX);
				exit;
			}

			# usuario online, fazendo bridging
			prefix("kb-");
			if(is_method("INVITE")){
				t_on_failure("FAIL_FSVBOX");
			}
	}
	route(FSRELAY);
	exit;
}

route[FSVBOX]{
	$du = "sip:" + "10.254.254.6" + ":" + "5090";
	if($var(newbranch)==1){
		append_branch();
		$var(newbranch)=0;
	}
	route(RELAY);
	exit;
}


route[FSRELAY] {
	$du = "sip:" + "10.254.254.6" + ":" + "5090";
	if($var(newbranch)==1){
		append_branch();
		$var(newbranch)=0;
	}
	route(RELAY);
	exit;

}

branch_route[BRANCH_ONE]{
	xlog("new branch at $ru");
}


onreply_route[REPLY_ONE]{
	xlog("Incoming reply");
	if((isflagset(FLT_NATS) || isbflagset(FLB_NATB) && status =~ "(183)|(2[0-9][0-9])")){
		rtpproxy_offer();
		
	}
	if(isbflagset(FLB_NATB)){
		fix_nated_contact();
	}

	
}



	


failure_route[FAIL_ONE]{
	if(is_method("INVITE") && (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){
		unforce_rtp_proxy();
	}

	if(t_was_cancelled()){
		exit;
	}

	
}


failure_route[FAIL_FSVBOX]{
	if(is_method("INVITE") && (isbflagset(FLB_NATB) || isflagset(FLT_NATS))){
		unforce_rtp_proxy();
	}

	if(t_was_cancelled()){
		exit;
	}

	if(t_check_status("486|408")){
		$rU = $avp(callee);
		$var(newbranch) = 1;
		route(FSVBOX);
	}
}


Testes com Opensips (registro)

Antes de podermos testar precisamos iniciar o serviço, no momento estamos com ele operando em modo debug, então a inicialização deve ser realizada com o comando abaixo

/etc/init.d/opensips debug

Abra uma nova sessão no servidor e então vamos criar os usuários

opensipsctl add 101 101
opensipsctl add 102 102
opensipsctl add 103 103

usuario 101 com senha 101 e assim por diante

Faça a onexão com seu softphone, aqui para testes utilizei o jitsi e o zoiper, neste momento vamos apenas fazer o registro do usuário para testar a autenticação, se você tentar realizar uma discagem não funcionará pois neste caso o processo depende do freeswitch que ainda não está configurado, vamos dar inicio nesta configuração agora.

FreeSwtich

cd /usr/src/
wget -c http://files.freeswitch.org/freeswitch-1.2.12.tar.bz2
tar -xjvf freeswitch-1.2.12.tar.bz2
cd freeswitch-1.2.12
./configure
make
make install
echo "/usr/local/freeswitch/lib" >> /etc/ld.so.conf
ldconfig

Neste tutorial nao vamos abordar pontos profundos de freeswitch, a ideia é apenas gerar as configurações que precisamos.

A configuração do Freeswitch nesta configuração está localizada em /usr/local/freeswitch , entao dentro deste edite o arquivo conf/vars.xml, localize a configuração internal_sip_port e altere o valor de 5060 para 5090, localize a configuração external_sip_port e altere o valor para 5092

No arquivo de configuração conf/sip_profiles/external.xml, localize a opção auth-calls e altere o valor para true, com isso a autenticação do opensips será valida pelo ip.

Abra agora o arquivo conf/autoload_configs/acl.conf.xml , localize a sessão <list name="domains", e acrescente a linha abaixo.

<node type="allow" cidr="10.254.254.6/32" />


Agora vamos abrir o arquivo conf/dialplan/default.xml e configurar nosso dialplan.

No fim do arquivo antes de fechar a opção </context>, você tem a regra para enum, colque estas regras antes desta opção de enum ou o sistema não vai chegar nelas, acrescente as seguintes configurações.


    <extension name="vbox">
      <condition field="destination_number" expression="^vb-(1[0-9][0-9])$">
            <action application="answer"/>
            <action application="voicemail" data="default ${domain_name} $1"/>
      </condition>
    </extension>

    <extension name="vmenu">
      <condition field="destination_number" expression="^vm-(1[0-9][0-9])$">
            <action application="voicemail" data="check default ${domain_name} $1"/>
      </condition>
    </extension>

    <extension name="kbridge">
      <condition field="destination_number" expression="^kb-(.+)$">
                  <action application="set" data="proxy_media=true"/>
                  <action application="set" data="call_timeout=50"/>
                  <action application="set" data="continue_on_fail=true"/>
                  <action application="set" data="hangup_after_bridge=true"/>
                  <action application="set" data="sip_invite_domain=10.254.254.6"/>
                  <action application="export" data="sip_contact_user=ufs"/>
                  <action application="bridge" data="sofia/$${domain}/$1@10.254.254.6"/>
                  <action application="answer"/>
                  <action application="voicemail" data="default ${domain_name} $1"/>
      </condition>
    </extension>


Altere agora o arquivo conf/dialplan/public.xml e acrecente a seguinda entrada no fim do arquivo (antes da opção </context>

    <extension name="from_opensips">
        <condition field="network_addr" expression="^10\.254\.254\.6$" />
        <condition field="destination_number" expression="^(.+)$">
          <action application="transfer" data="$1 XML default" />
        </condition>
    </extension>

Agora precisamos ajustar os ramais, entre no diretorio conf/directory/default/ e crie os arquivo abaixo.

101.xml

<include>
  <user id="101">
    <params>
      <param name="vm-password" value="1001"/>
    </params>
    <variables>
      <variable name="accountcode" value="101"/>
      <variable name="user_context" value="default"/>
      <variable name="effective_caller_id_name" value="Extension 101"/>
      <variable name="effective_caller_id_number" value="101"/>
    </variables>
  </user>
</include>

102.xml

<include>
  <user id="102">
    <params>
      <param name="vm-password" value="1002"/>
    </params>
    <variables>
      <variable name="accountcode" value="102"/>
      <variable name="user_context" value="default"/>
      <variable name="effective_caller_id_name" value="Extension 102"/>
      <variable name="effective_caller_id_number" value="102"/>
    </variables>
  </user>
</include>

103.xml