<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://opensips.com.br/wiki/index.php?action=history&amp;feed=atom&amp;title=Opensips_NAT_Script_com_RTPproxy</id>
	<title>Opensips NAT Script com RTPproxy - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="http://opensips.com.br/wiki/index.php?action=history&amp;feed=atom&amp;title=Opensips_NAT_Script_com_RTPproxy"/>
	<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Opensips_NAT_Script_com_RTPproxy&amp;action=history"/>
	<updated>2026-04-30T03:39:20Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_NAT_Script_com_RTPproxy&amp;diff=1530&amp;oldid=prev</id>
		<title>Admin em 22h57min de 15 de abril de 2021</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Opensips_NAT_Script_com_RTPproxy&amp;diff=1530&amp;oldid=prev"/>
		<updated>2021-04-15T22:57:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pt-BR&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Edição anterior&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Edição das 22h57min de 15 de abril de 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Linha 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linha 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|Precisando de recursos de númeração para fazer seus testes ? Contrate conosco em [http://www.brdvoz.com.br BRDVoz]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|Ou talvez gostaria de uma consultoria no seu proejto ? Também estamos disponiveis em [https://www.brdsoft.com.br BRDSoft]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|-&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt; &lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Prefacio==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Prefacio==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Nat é uma questão que normalmente da um pouco de trabalho para entender no opensips, é bem diferente daquilo que estamos acostumados no asterisk por exemplo onde basta ativar uma flag e pronto tudo acontece.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Nat é uma questão que normalmente da um pouco de trabalho para entender no opensips, é bem diferente daquilo que estamos acostumados no asterisk por exemplo onde basta ativar uma flag e pronto tudo acontece.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://opensips.com.br/wiki/index.php?title=Opensips_NAT_Script_com_RTPproxy&amp;diff=1423&amp;oldid=prev</id>
		<title>Mike: Criou página com '==Prefacio== Nat é uma questão que normalmente da um pouco de trabalho para entender no opensips, é bem diferente daquilo que estamos acostumados no asterisk por exemplo on...'</title>
		<link rel="alternate" type="text/html" href="http://opensips.com.br/wiki/index.php?title=Opensips_NAT_Script_com_RTPproxy&amp;diff=1423&amp;oldid=prev"/>
		<updated>2013-09-28T17:13:46Z</updated>

		<summary type="html">&lt;p&gt;Criou página com &amp;#039;==Prefacio== Nat é uma questão que normalmente da um pouco de trabalho para entender no opensips, é bem diferente daquilo que estamos acostumados no asterisk por exemplo on...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Prefacio==&lt;br /&gt;
Nat é uma questão que normalmente da um pouco de trabalho para entender no opensips, é bem diferente daquilo que estamos acostumados no asterisk por exemplo onde basta ativar uma flag e pronto tudo acontece.&lt;br /&gt;
&lt;br /&gt;
Não vou demonstrar aqui como instalar o opensips ou rtpproxy, apenas demonstro um arquivo de configuração todo comentado com uma configuração minima para aceitar registros e encaminhar chamadas de um usuario para outro atrás de nat&lt;br /&gt;
&lt;br /&gt;
O script não precisa de usuario previamente configurado, qualquer autenticacao enviada ele ira aceitar, e a cada restart voce tem que se registrar novamente pois a informacao esta toda na memoria, o proposito é unicamente demonstrar as questoes de nat&lt;br /&gt;
&lt;br /&gt;
==opensips.cfg==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
###################################&lt;br /&gt;
# Este script tem por intuito demonstrar a configuracao&lt;br /&gt;
# de um script de roteamento com NAT&lt;br /&gt;
#&lt;br /&gt;
###################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Parametros Globais #########&lt;br /&gt;
&lt;br /&gt;
debug=3&lt;br /&gt;
log_stderror=no&lt;br /&gt;
log_facility=LOG_LOCAL0&lt;br /&gt;
&lt;br /&gt;
fork=yes&lt;br /&gt;
children=4&lt;br /&gt;
&lt;br /&gt;
/* Para fazer debug descomente as linhas abaixo */&lt;br /&gt;
#debug=6&lt;br /&gt;
#fork=no&lt;br /&gt;
#log_stderror=yes&lt;br /&gt;
&lt;br /&gt;
auto_aliases=no&lt;br /&gt;
&lt;br /&gt;
# IP no qual iremos aguardar por requisicoes&lt;br /&gt;
listen=udp:___IP_DO_OPENSIPS_AQUI___:5060  &lt;br /&gt;
&lt;br /&gt;
# Desativacao do suporte a SIP via TCP&lt;br /&gt;
disable_tcp=yes&lt;br /&gt;
&lt;br /&gt;
# Desativacao do suporte a TLS (criptografia) na sinalizacao&lt;br /&gt;
disable_tls=yes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Secao de Modulos ########&lt;br /&gt;
&lt;br /&gt;
# Definicao do diretorio de modulos&lt;br /&gt;
mpath=&amp;quot;/usr//lib64/opensips/modules/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo de sinalizacao &lt;br /&gt;
loadmodule &amp;quot;signaling.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo stateless &lt;br /&gt;
loadmodule &amp;quot;sl.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo para suporte a transacoes &lt;br /&gt;
loadmodule &amp;quot;tm.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_timer&amp;quot;, 5)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;fr_inv_timer&amp;quot;, 30)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;restart_fr_on_each_reply&amp;quot;, 0)&lt;br /&gt;
modparam(&amp;quot;tm&amp;quot;, &amp;quot;onreply_avp_mode&amp;quot;, 1)&lt;br /&gt;
&lt;br /&gt;
#### Modulo para Record Route &lt;br /&gt;
loadmodule &amp;quot;rr.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rr&amp;quot;, &amp;quot;append_fromtag&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
#### Modulo para deteccao de loop (Max forward) &lt;br /&gt;
loadmodule &amp;quot;maxfwd.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo para mensagens de operaca&lt;br /&gt;
loadmodule &amp;quot;sipmsgops.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#### Modulo para ativacao do gerenciamento via FIFO &lt;br /&gt;
loadmodule &amp;quot;mi_fifo.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_name&amp;quot;, &amp;quot;/tmp/opensips_fifo&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;mi_fifo&amp;quot;, &amp;quot;fifo_mode&amp;quot;, 0666)&lt;br /&gt;
&lt;br /&gt;
#### Modulo URI &lt;br /&gt;
loadmodule &amp;quot;uri.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;uri&amp;quot;, &amp;quot;use_uri_table&amp;quot;, 0)&lt;br /&gt;
&lt;br /&gt;
#### Modulo para localizacao de usuario &lt;br /&gt;
loadmodule &amp;quot;usrloc.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;nat_bflag&amp;quot;, &amp;quot;NAT&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;usrloc&amp;quot;, &amp;quot;db_mode&amp;quot;,   0)&lt;br /&gt;
&lt;br /&gt;
#### Modulo para suporte a registros&lt;br /&gt;
loadmodule &amp;quot;registrar.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### Modulo para auxilio de NAT&lt;br /&gt;
loadmodule &amp;quot;nathelper.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_interval&amp;quot;, 10)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;natping_socket&amp;quot;, &amp;quot;___IP_DO_OPENSIPS_AQUI___:5060&amp;quot;)&lt;br /&gt;
# o parametro abaixo armazena a uri do usuario quando chamada&lt;br /&gt;
# a funcao fix_nated_register&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;received_avp&amp;quot;, &amp;quot;$avp(42)&amp;quot;)&lt;br /&gt;
#modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_bflag&amp;quot;, &amp;quot;SIP_PING_FLAG&amp;quot;)&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_from&amp;quot;, &amp;quot;sip:pinger@___IP_DO_OPENSIPS_AQUI___&amp;quot;)&lt;br /&gt;
# o parametro abaixo define qual o formato do pacote a ser enviado&lt;br /&gt;
# ele pode ser OPTIONS (default) ou INFO&lt;br /&gt;
modparam(&amp;quot;nathelper&amp;quot;, &amp;quot;sipping_method&amp;quot;, &amp;quot;OPTIONS&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#### Modulo rtpproxy (forcar o audio atraves do opensips)&lt;br /&gt;
loadmodule &amp;quot;rtpproxy.so&amp;quot;&lt;br /&gt;
modparam(&amp;quot;rtpproxy&amp;quot;, &amp;quot;rtpproxy_sock&amp;quot;, &amp;quot;udp:localhost:7890&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
####### Logica de roteamento ########&lt;br /&gt;
&lt;br /&gt;
#  Sessao principal&lt;br /&gt;
&lt;br /&gt;
route{&lt;br /&gt;
&lt;br /&gt;
	# Esta e uma configuracao minima recomendada para &lt;br /&gt;
	# previnir loops&lt;br /&gt;
	if (!mf_process_maxfwd_header(&amp;quot;10&amp;quot;)) {&lt;br /&gt;
		sl_send_reply(&amp;quot;483&amp;quot;,&amp;quot;Too Many Hops&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	if (has_totag()) {&lt;br /&gt;
		# Requisicao previamente processada&lt;br /&gt;
		if (loose_route()) {&lt;br /&gt;
			xlog(&amp;quot;Estamos em loose_route&amp;quot;);&lt;br /&gt;
			if (is_method(&amp;quot;INVITE&amp;quot;)) {&lt;br /&gt;
				record_route();&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			route(relay);&lt;br /&gt;
		} else {&lt;br /&gt;
			if ( is_method(&amp;quot;ACK&amp;quot;) ) {&lt;br /&gt;
				if ( t_check_trans() ) {&lt;br /&gt;
					t_relay();&lt;br /&gt;
					exit;&lt;br /&gt;
				} else {&lt;br /&gt;
					xlog(&amp;quot;Nao estamos em loose, temos totag, metodo nao ack [ $rm ] &amp;quot;);&lt;br /&gt;
					# Transacao nao encontrada , vamos encerrar o roteamento&lt;br /&gt;
					exit;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			# Rota nao trata de encerramento e nem a resposta&lt;br /&gt;
			# de requisicao, entao enviamos um 404&lt;br /&gt;
			sl_send_reply(&amp;quot;404&amp;quot;,&amp;quot;Not here&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
		# Processando requisicao de cancelamento &lt;br /&gt;
	if (is_method(&amp;quot;CANCEL&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		if (t_check_trans())&lt;br /&gt;
			t_relay();&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	t_check_trans();&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	if ( !(is_method(&amp;quot;REGISTER&amp;quot;)  ) ) {&lt;br /&gt;
		# Verificando se o from e um usuario valido&lt;br /&gt;
		if (from_uri==myself)&lt;br /&gt;
		{&lt;br /&gt;
		} else {&lt;br /&gt;
			# From nao e usuario valido entao procedemos&lt;br /&gt;
			# para recusa pois o destino nao somos nos&lt;br /&gt;
			if (!uri==myself) {&lt;br /&gt;
				send_reply(&amp;quot;403&amp;quot;,&amp;quot;Rely forbidden&amp;quot;);&lt;br /&gt;
				exit;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Checando pacotes com rotas pre-carregadas &lt;br /&gt;
	if (loose_route()) {&lt;br /&gt;
		xlog(&amp;quot;L_ERR&amp;quot;,&lt;br /&gt;
		&amp;quot;Attempt to route with preloaded Route's [$fu/$tu/$ru/$ci]&amp;quot;);&lt;br /&gt;
		if (!is_method(&amp;quot;ACK&amp;quot;))&lt;br /&gt;
			sl_send_reply(&amp;quot;403&amp;quot;,&amp;quot;Preload Route denied&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Se metodo nao e register ou message entao gravamos a rota &lt;br /&gt;
	if (!is_method(&amp;quot;REGISTER|MESSAGE&amp;quot;))&lt;br /&gt;
		record_route();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Nao somos o destino da requisicao entao acrescentamos &lt;br /&gt;
	# uma informacao para identificar como saida e enviamos para relay	&lt;br /&gt;
	if (!uri==myself) {&lt;br /&gt;
		append_hf(&amp;quot;P-hint: outbound\r\n&amp;quot;); &lt;br /&gt;
		route(relay);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Requisicoes de PUBLISH e SUBSCRIBE&lt;br /&gt;
	# Nao vamos tratar neste documento &lt;br /&gt;
	if (is_method(&amp;quot;PUBLISH|SUBSCRIBE&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
		sl_send_reply(&amp;quot;503&amp;quot;, &amp;quot;Service Unavailable&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Tratamento para metodo register&lt;br /&gt;
	if (is_method(&amp;quot;REGISTER&amp;quot;))&lt;br /&gt;
	{&lt;br /&gt;
&lt;br /&gt;
		# Aqui estamos recebendo um pedido de register&lt;br /&gt;
		# vamos executar fix_nated_register&lt;br /&gt;
		fix_nated_register();&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
&lt;br /&gt;
		# Este script e apenas ilustrativo , nao vamos criar usuarios&lt;br /&gt;
		# qualquer requisicao que chegue no mesmo sera aceita como valida&lt;br /&gt;
		# (registro) e a informacao sera salva&lt;br /&gt;
		if (!save(&amp;quot;location&amp;quot;))&lt;br /&gt;
			sl_reply_error();&lt;br /&gt;
&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ($rU==NULL) {&lt;br /&gt;
		#requisicao com endereco incompleto&lt;br /&gt;
		sl_send_reply(&amp;quot;484&amp;quot;,&amp;quot;Address Incomplete&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Este processamento so vai acontecer quando for uma chamada&lt;br /&gt;
	# com destino a nosso opensips, neste caso ele ira &lt;br /&gt;
	# verificar se o usuario esta registrado, se estiver&lt;br /&gt;
	# ele apenas enviara para relay se nao ele vai responder&lt;br /&gt;
	# com uma mensagem de 404&lt;br /&gt;
	if (!lookup(&amp;quot;location&amp;quot;,&amp;quot;m&amp;quot;)) {&lt;br /&gt;
		t_newtran();&lt;br /&gt;
		t_reply(&amp;quot;404&amp;quot;, &amp;quot;Not Found&amp;quot;);&lt;br /&gt;
		exit;&lt;br /&gt;
	} &lt;br /&gt;
&lt;br /&gt;
	# Enviando para relay &lt;br /&gt;
	route(relay);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
route[relay] {&lt;br /&gt;
	# verificamos se trata-se de um invite&lt;br /&gt;
	# para entao podermos definir as funcoes&lt;br /&gt;
	# para resposta dos pacotes&lt;br /&gt;
	if (is_method(&amp;quot;INVITE&amp;quot;)) {&lt;br /&gt;
		# Para cada perna adicionada ele chama&lt;br /&gt;
		# a rota abaixo ( branch_route(per_branch_ops) )&lt;br /&gt;
		t_on_branch(&amp;quot;per_branch_ops&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		# Para cada reply recebido ele executa a rota abaixo&lt;br /&gt;
		# on_reply_route(handle_nat)&lt;br /&gt;
		t_on_reply(&amp;quot;handle_nat&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
		# Chamadas que nao completaram sao procesadas&lt;br /&gt;
		# pela failure_route(missed_call)&lt;br /&gt;
		t_on_failure(&amp;quot;missed_call&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		# Vamos tentar identificar se o usuario esta atras de nat&lt;br /&gt;
		# fazemos isso no invite porque assim que recebemos &lt;br /&gt;
		# a requisicao procedemos com a correcao se necessaria&lt;br /&gt;
		if(nat_uac_test(&amp;quot;127&amp;quot;)){&lt;br /&gt;
			# Usuario identificado como atras de nat&lt;br /&gt;
			xlog(&amp;quot;Usuario atras de nat em handle nat&amp;quot;);&lt;br /&gt;
			fix_nated_contact();&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		# Vamos verificar se temos cabecalho rtp e entao proceder com o rtpproxy&lt;br /&gt;
		if(has_body(&amp;quot;application/sdp&amp;quot;)){&lt;br /&gt;
			xlog(&amp;quot;Temos sdp no body para $rm&amp;quot;);&lt;br /&gt;
			rtpproxy_offer();&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# Loose route quando tudo ok envia cancel e by para ca&lt;br /&gt;
	# entao aqui vamos desligar o rtp proxy&lt;br /&gt;
	if(is_method(&amp;quot;CANCEL|BYE&amp;quot;)){&lt;br /&gt;
		unforce_rtp_proxy();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Aqui finalmente fazemos o relay do pacote&lt;br /&gt;
	# se nao conseguirmos fazer o relay entao&lt;br /&gt;
	# retornarmos erro 500 como erro interno&lt;br /&gt;
	if (!t_relay()) {&lt;br /&gt;
		send_reply(&amp;quot;500&amp;quot;,&amp;quot;Internal Error&amp;quot;);&lt;br /&gt;
	};&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
branch_route[per_branch_ops] {&lt;br /&gt;
	# Nova perna adicionada a chamada&lt;br /&gt;
	xlog(&amp;quot;new branch at $ru\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
onreply_route[handle_nat] {&lt;br /&gt;
	# Recebemos resposta do pacote	&lt;br /&gt;
	xlog(&amp;quot;incoming reply\n&amp;quot;);&lt;br /&gt;
	&lt;br /&gt;
	# Verificamos aqui se esta requisicao possui SDP&lt;br /&gt;
	if(is_method(&amp;quot;ACK&amp;quot;) &amp;amp;&amp;amp; has_body(&amp;quot;application/sdp&amp;quot;)){&lt;br /&gt;
		# Atendemos no rtpproxy&lt;br /&gt;
		rtpproxy_answer();&lt;br /&gt;
&lt;br /&gt;
	}else if(has_body(&amp;quot;application/sdp&amp;quot;)){&lt;br /&gt;
		# possuindo sdp vamos re-escrever a informacao&lt;br /&gt;
		#fix_nated_sdp(&amp;quot;2&amp;quot;);&lt;br /&gt;
		rtpproxy_offer();	&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	# Vamos tentar identificar se o usuario esta atras de nat&lt;br /&gt;
	# executamos neste nivel pois aqui sera executado&lt;br /&gt;
	# no momento que recebemos resposta, assim garantimos&lt;br /&gt;
	# que em todos os casos manipularemos o nat&lt;br /&gt;
	if(nat_uac_test(&amp;quot;127&amp;quot;)){&lt;br /&gt;
		# Usuario identificado como atras de nat&lt;br /&gt;
		xlog(&amp;quot;Usuario atras de nat em handle nat&amp;quot;);&lt;br /&gt;
		fix_nated_contact();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
failure_route[missed_call] {&lt;br /&gt;
	# Chamada nao completada&lt;br /&gt;
	# verificamos se Ã© um cancess e chamamos&lt;br /&gt;
	# a funcao responsavel por isso e entao&lt;br /&gt;
	# encerramos&lt;br /&gt;
	if (t_was_cancelled()) {&lt;br /&gt;
		exit;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
</feed>