Hola, estoy utilizando kamailio 3.2.0 (x86_64/linux) y desde hace unos días estoy intentando comunicar un softphone desde el interior de una red con NAT con el exterior. La configuración es la siguiente:<div><br></div><div>
Softphone (192.168.0.5) <--> Kamailio (192.168.0.3) <--> Router (192.168.0.1) <--> Softphone sobre smartphone</div><div><br></div><div>Todos los puertos del router están redireccionados a 192.168.0.3</div>
<div>Tengo instalado rtpproxy 1.2.1-1 con la siguiente configuración:</div><div><br></div><div>--------------------------/etc/defaults/rtpproxy--------------------------------</div><div><div># The control socket.</div><div>
#CONTROL_SOCK="unix:/var/run/rtpproxy/rtpproxy.sock"</div><div># To listen on an UDP socket, uncomment this line:</div><div>CONTROL_SOCK=udp:<a href="http://127.0.0.1:22222">127.0.0.1:22222</a></div><div><br></div>
<div># Additional options that are passed to the daemon.</div><div>EXTRA_OPTS="-l <a href="http://candamil.dyndns.org">candamil.dyndns.org</a>"</div></div><div>----------------------------------------------------------------------------------------</div>
<div><br></div><div>y el funcionamiento es correcto. Este es el mensaje de salida del log de kamailio:</div><div><br></div><div>----------------------------------------------------------------------------------------------</div>
<div>Nov 12 20:09:13 condor kamailio[7001]: INFO: rtpproxy [rtpproxy.c:1415]: rtp proxy <udp:<a href="http://127.0.0.1:22222">127.0.0.1:22222</a>> found, support for it enabled</div><div>-----------------------------------------------------------------------------------------------</div>
<div><br></div><div><br></div><div>Tanto el softphone del interior de la red como el del exterior son linphone. La configuración del del interior de la red es la siguiente:</div><div><br></div><div>SIP identity: <a href="mailto:sip%3A1001@192.168.0.3">sip:1001@192.168.0.3</a></div>
<div>SIP proxy: sip:192.168.0.3</div><div>Indico conexión directa a internet.</div><div><br></div><div>En la del externo especifico como proxy y domain "<a href="http://candamil.dyndns.org">candamil.dyndns.org</a>", que es la dirección DNS que apunta a la IP de mi router.</div>
<div><br></div><div>En este caso, los síntomas son los siguientes:</div><div>La autentificación de ambos, tanto externo como interno, es correcta.</div><div>Al realizar una llamada en cualquiera de los dos sentidos, el softphone suena y la llamada se contesta y cuelga correctamente, pero no se transmite la señal de voz. En el log figura el siguiente mensaje:</div>
<div><br></div><div>----------------------------------------------------------------------------------------------</div><div>Nov 12 20:23:14 condor kamailio[6991]: ERROR: rtpproxy [rtpproxy.c:2260]: incorrect port 0 in reply from rtp proxy</div>
<div>----------------------------------------------------------------------------------------------</div><div><br></div><div><br></div><div>Ocurre lo mismo si en el interno indico que está tras NAT, con la ip del router, y que está tras NAT con un servidor STUN (<a href="http://stunserver.org">stunserver.org</a>). En los 3 casos, en el softphone externo, figura una llamada de <a href="mailto:1001@192.168.0.3">1001@192.168.0.3</a>, mientras que en el interno, figura una llamada de <a href="mailto:1002@candamil.dyndns.org">1002@candamil.dyndns.org</a>.</div>
<div><br></div><div>Si cambio en el softphone interno el proxy a sip:<a href="http://candamil.dyndns.org">candamil.dyndns.org</a>, todo se vuelve a repetir.</div><div>Si lo que hago es cambiar la SIP identity a <a href="mailto:sip%3A1001@candamil.dyndns.org">sip:1001@candamil.dyndns.org</a>, al realizar una llamada desde interno a externo, el interno no llega a percatarse de que se respondió a la llamada, y aparece el siguiente error en el log:</div>
<div><br></div><div>----------------------------------------------------------------------------------------------------------</div><div><div>Nov 12 20:53:00 condor kamailio[7306]: ERROR: <core> [parser/parse_via.c:2600]: ERROR: parse_via: invalid port number <5060ranch=z9hG4bKc</div>
<div>50f.b4825246.0></div><div>Nov 12 20:53:00 condor kamailio[7306]: ERROR: <core> [parser/parse_via.c:2629]: ERROR: parse_via on: <SIP/2.0/UDP 192.168.0.3:5060ranch=z</div><div>9hG4bKc50f.b4825246.0;received=87.223.138.84#015#012Via: SIP/2.0/UDP 87.223.138.84:5060;rport=5060;branch=z9hG4bK1021772993#015#012From: </div>
<div><<a href="mailto:sip%3A1001@candamil.dyndns.org">sip:1001@candamil.dyndns.org</a>>;tag=783852345#015#012To: <<a href="mailto:sip%3A1002@candamil.dyndns.org">sip:1002@candamil.dyndns.org</a>>#015#012Call-ID: 1644787160#015#012CSeq: 21 INVITE#</div>
<div>015#012User-Agent: Linphone/3.4.0 (eXosip2/unknown)#015#012Content-Length: 0#015#012#015#012></div></div><div>------------------------------------------------------------------------------------------------------------</div>
<div><br></div><div>Por el contrario, haciendo una llamada desde el externo al interno, ocurre lo mismo que antes.</div><div><br></div><div>Por último, esta es la configuración relevante de kamailio:</div><div><br></div>
<div>
-----------------------------------------kamailio.cfg----------------------------------------------------</div><div><div>#!define WITH_MYSQL</div><div>#!define WITH_AUTH</div><div>#!define WITH_NAT</div><div><br></div><div>
####### Defined Values #########</div><div><br></div><div># *** Value defines - IDs used later in config</div><div>#!ifdef WITH_MYSQL</div><div># - database URL - used to connect to database server by modules such</div><div>
# as: auth_db, acc, usrloc, a.s.o.</div><div>#!define DBURL "mysql://openser:openserrw@localhost/openser"</div><div>#!endif</div><div>#!ifdef WITH_MULTIDOMAIN</div><div># - the value for 'use_domain' parameters</div>
<div>#!define MULTIDOMAIN 1</div><div>#!else</div><div>#!define MULTIDOMAIN 0</div><div>#!endif</div><div><br></div><div># - flags</div><div># FLT_ - per transaction (message) flags</div><div>#<span class="Apple-tab-span" style="white-space:pre">        </span>FLB_ - per branch flags</div>
<div>#!define FLT_ACC 1</div><div>#!define FLT_ACCMISSED 2</div><div>#!define FLT_ACCFAILED 3</div><div>#!define FLT_NATS 5</div><div><br></div><div>#!define FLB_NATB 6</div><div>#!define FLB_NATSIPPING 7</div><div><br></div>
<div>####### Global Parameters #########</div><div>/* uncomment the next line to disable the auto discovery of local aliases</div><div> based on reverse DNS on IPs (default on) */</div><div>#auto_aliases=no</div><div><br>
</div><div>/* add local domain aliases */</div><div>alias="<a href="http://candamil.dyndns.org">candamil.dyndns.org</a>"</div><div><br></div><div>/* port to listen to</div><div> * - can be specified more than once if needed to listen on many ports */</div>
<div>port=5060</div><div><br></div><div>#!ifdef WITH_TLS</div><div>enable_tls=yes</div><div>#!endif</div><div><br></div><div># life time of TCP connection when there is no traffic</div><div># - a bit higher than registration expires to cope with UA behind NAT</div>
<div>tcp_connection_lifetime=3605</div><div><br></div><div>####### Custom Parameters #########</div><div><br></div><div>#!ifdef WITH_PSTN</div><div># PSTN GW Routing</div><div>#</div><div># - pstn.gw_ip: valid IP or hostname as string value, example:</div>
<div># pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"</div><div>#</div><div># - by default is empty to avoid misrouting</div><div>pstn.gw_ip = "" desc "PSTN GW Address"</div><div>
#!endif</div><div><br></div><div>####### Modules Section ########</div><div><br></div><div>#!ifdef WITH_MYSQL</div><div>loadmodule "db_mysql.so"</div><div>#!endif</div><div><br></div><div>#!ifdef WITH_AUTH</div>
<div>loadmodule "auth.so"</div><div>loadmodule "auth_db.so"</div><div><br></div><div>#!ifdef WITH_NAT</div><div>loadmodule "nathelper.so"</div><div>loadmodule "rtpproxy.so"</div><div>
#!endif</div><div><br></div><div># ----------------- setting module-specific parameters ---------------</div><div><br></div><div># ----- auth_db params -----</div><div>#!ifdef WITH_AUTH</div><div>modparam("auth_db", "db_url", DBURL)</div>
<div>modparam("auth_db", "calculate_ha1", yes)</div><div>modparam("auth_db", "password_column", "password")</div><div>modparam("auth_db", "load_credentials", "")</div>
<div>modparam("auth_db", "use_domain", MULTIDOMAIN)</div><div><br></div><div><br></div><div>#!ifdef WITH_NAT</div><div># ----- rtpproxy params -----</div><div>modparam("rtpproxy", "rtpproxy_sock", "udp:<a href="http://127.0.0.1:22222">127.0.0.1:22222</a>")</div>
<div><br></div><div># ----- nathelper params -----</div><div>modparam("nathelper", "natping_interval", 30)</div><div>modparam("nathelper", "ping_nated_only", 1)</div><div>modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)</div>
<div>modparam("nathelper", "sipping_from", "<a href="mailto:sip%3Apinger@kamailio.org">sip:pinger@kamailio.org</a>")</div><div><br></div><div># params needed for NAT traversal in other modules</div>
<div>modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")</div><div>modparam("usrloc", "nat_bflag", FLB_NATB)</div><div>#!endif</div><div><br></div><div>####### Routing Logic ########</div>
<div><br></div><div><br></div><div># Main SIP request routing logic</div><div># - processing of any incoming SIP request starts with this route</div><div># - note: this is the same as route { ... }</div><div>request_route {</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># per request initial checks</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(REQINIT);</div><div><br></div><div>
<span class="Apple-tab-span" style="white-space:pre">        </span># NAT detection</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(NATDETECT);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># handle requests within SIP dialogs</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>route(WITHINDLG);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>### only initial requests (no To tag)</div><div><br>
</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># CANCEL processing</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("CANCEL"))</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>if (t_check_trans())</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>t_relay();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>t_check_trans();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># authentication</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>route(AUTH);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># record routing for dialog forming requests (in case they are routed)</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span># - remove preloaded route headers</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>remove_hf("Route");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE|SUBSCRIBE"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>record_route();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># account only INVITEs</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>setflag(FLT_ACC); # do accounting</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># dispatch requests to foreign domains</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(SIPOUT);</div><div><br>
</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>### requests for my local domains</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># handle presence related requests</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>route(PRESENCE);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># handle registrations</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(REGISTRAR);</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if ($rU==$null)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span># request with no Username in RURI</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply("484","Address Incomplete");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># dispatch destinations to PSTN</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(PSTN);</div><div><br></div><div>
<span class="Apple-tab-span" style="white-space:pre">        </span># user location service</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(LOCATION);</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(RELAY);</div>
<div>}</div><div><br></div><div><br></div><div>route[RELAY] {</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># enable additional event routes for forwarded requests</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># - serial forking, RTP relaying handling, a.s.o.</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE|SUBSCRIBE")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>t_on_branch("MANAGE_BRANCH");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>t_on_reply("MANAGE_REPLY");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>t_on_failure("MANAGE_FAILURE");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!t_relay()) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_reply_error();</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>exit;</div>
<div>}</div><div><br></div><div># Per SIP request initial checks</div><div>route[REQINIT] {</div><div>#!ifdef WITH_ANTIFLOOD</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># flood dection from same IP and traffic ban for a while</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span># be sure you exclude checking trusted peers, such as pstn gateways</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># - local host excluded (e.g., loop to self)</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if(src_ip!=myself)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if($sht(ipban=>$si)!=$null)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span># ip is already blocked</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (!pike_check_req())</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>$sht(ipban=>$si) = 1;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>#!endif</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!mf_process_maxfwd_header("10")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply("483","Too Many Hops");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(!sanity_check("1511", "7"))</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>xlog("Malformed SIP message from $si:$sp\n");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>}</div><div><br></div><div># Handle requests within SIP dialogs</div>
<div>route[WITHINDLG] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (has_totag()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span># sequential request withing a dialog should</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span># take the path determined by record-routing</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (loose_route()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (is_method("BYE")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>setflag(FLT_ACC); # do accounting ...</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>setflag(FLT_ACCFAILED); # ... even if the transaction fails</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if ( is_method("ACK") ) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span># ACK is forwarded statelessy</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>route(NATMANAGE);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>route(RELAY);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (is_method("SUBSCRIBE") && uri == myself) {</div><div>
<span class="Apple-tab-span" style="white-space:pre">                                </span># in-dialog subscribe requests</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>route(PRESENCE);</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if ( is_method("ACK") ) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ( t_check_trans() ) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span># no loose-route, but stateful ACK;</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span># must be an ACK after a 487</div><div>
<span class="Apple-tab-span" style="white-space:pre">                                        </span># or e.g. 404 from upstream server</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>t_relay();</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>} else {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span># ACK without matching transaction ... ignore and discard</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>sl_send_reply("404","Not here");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>}</div><div><br></div><div># Handle SIP registrations</div><div>
route[REGISTRAR] {</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("REGISTER"))</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(isflagset(FLT_NATS))</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>setbflag(FLB_NATB);</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span># uncomment next line to do SIP NAT pinging </div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>setbflag(FLB_NATSIPPING);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (!save("location"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>sl_reply_error();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>}</div><div><br></div><div># USER location service</div><div>route[LOCATION] {</div><div><br></div><div>#!ifdef WITH_SPEEDIAL</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># search for short dialing - 2-digit extension</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if($rU=~"^[0-9][0-9]$")</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(sd_lookup("speed_dial"))</div><div>
<span class="Apple-tab-span" style="white-space:pre">                        </span>route(SIPOUT);</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_ALIASDB</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># search in DB-based aliases</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(alias_db_lookup("dbaliases"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>route(SIPOUT);</div><div>#!endif</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$avp(oexten) = $rU;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!lookup("location")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>$var(rc) = $rc;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>route(TOVOICEMAIL);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>t_newtran();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>switch ($var(rc)) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>case -1:</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>case -3:</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>send_reply("404", "Not Found");</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>case -2:</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>send_reply("405", "Method Not Allowed");</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div><div>
<span class="Apple-tab-span" style="white-space:pre">                </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># when routing via usrloc, log the missed calls also</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("INVITE"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>setflag(FLT_ACCMISSED);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>}</div><div><br></div><div># Presence server route</div><div>route[PRESENCE] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(!is_method("PUBLISH|SUBSCRIBE"))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div>
<div><br></div><div>#!ifdef WITH_PRESENCE</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!t_newtran())</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_reply_error();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>};</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(is_method("PUBLISH"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>handle_publish();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>t_release();</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>else</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if( is_method("SUBSCRIBE"))</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>handle_subscribe();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>t_release();</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>exit;</div><div>#!endif</div><div><span class="Apple-tab-span" style="white-space:pre">        </span></div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span># if presence enabled, this part will not be executed</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("PUBLISH") || $rU==$null)</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply("404", "Not here");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div># Authentication route</div><div>route[AUTH] {</div>
<div>#!ifdef WITH_AUTH</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_method("REGISTER"))</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                </span># authenticate the REGISTER requests (uncomment to enable auth)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>if (!www_authorize("$td", "subscriber"))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>www_challenge("$td", "0");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if ($au!=$tU)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>sl_send_reply("403","Forbidden auth ID");</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>} else {</div><div><br></div><div>#!ifdef WITH_IPAUTH</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(allow_source_address())</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span># source IP allowed</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>return;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div>#!endif</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                </span># authenticate if from local subscriber</div><div>
<span class="Apple-tab-span" style="white-space:pre">                </span>if (from_uri==myself)</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (!proxy_authorize("$fd", "subscriber")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>proxy_challenge("$fd", "0");</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (is_method("PUBLISH"))</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($au!=$fU || $au!=$tU) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>sl_send_reply("403","Forbidden auth ID");</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div>
<span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($au!=$rU) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>sl_send_reply("403","Forbidden R-URI");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div>#!ifdef WITH_MULTIDOMAIN</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($fd!=$rd) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>sl_send_reply("403","Forbidden R-URI domain");</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div>#!endif</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>if ($au!=$fU) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                        </span>sl_send_reply("403","Forbidden auth ID");</div><div><span class="Apple-tab-span" style="white-space:pre">                                        </span>exit;</div><div>
<span class="Apple-tab-span" style="white-space:pre">                                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>consume_credentials();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span># caller authenticated</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span># caller is not local subscriber, then check if it calls</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span># a local destination, otherwise deny, not an open relay here</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if (!uri==myself)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>{</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>sl_send_reply("403","Not relaying");</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>#!endif</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div># Caller NAT detection route</div><div>route[NATDETECT] {</div><div>#!ifdef WITH_NAT</div><div>
<span class="Apple-tab-span" style="white-space:pre">        </span>force_rport();</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (nat_uac_test("19")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (is_method("REGISTER")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>fix_nated_register();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>} else {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>fix_nated_contact();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>setflag(FLT_NATS);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>#!endif</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div># RTPProxy control</div><div>route[NATMANAGE] {</div><div>#!ifdef WITH_NAT</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_request()) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>if(has_totag()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>if(check_route_param("nat=yes")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                                </span>setbflag(FLB_NATB);</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><br></div><div>
<span class="Apple-tab-span" style="white-space:pre">        </span>rtpproxy_manage();</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_request()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if (!has_totag()) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>add_rr_param(";nat=yes");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (is_reply()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if(isbflagset(FLB_NATB)) {</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>fix_nated_contact();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>#!endif</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div>
<div>}</div><div><br></div><div># Routing to foreign domains</div><div>route[SIPOUT] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (!uri==myself)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>append_hf("P-hint: outbound\r\n");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>route(RELAY);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>}</div><div><br></div><div># PSTN GW routing</div><div>route[PSTN] {</div><div>#!ifdef WITH_PSTN</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># check if PSTN GW IP is defined</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (strempty($sel(cfg_get.pstn.gw_ip))) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># route to PSTN dialed numbers starting with '+' or '00'</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span># (international format)</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># - update the condition to match your dialing rules for PSTN routing</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><br></div><div>
<span class="Apple-tab-span" style="white-space:pre">        </span># only local users allowed to call</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(from_uri!=myself) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>sl_send_reply("403", "Not Allowed");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(RELAY);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>exit;</div><div>#!endif</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div>
<div>}</div><div><br></div><div># XMLRPC routing</div><div>#!ifdef WITH_XMLRPC</div><div>route[XMLRPC] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># allow XMLRPC from localhost</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if ((method=="POST" || method=="GET")</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>&& (src_ip==127.0.0.1)) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span># close connection only for xmlrpclib user agents (there is a bug in</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span># xmlrpclib: it waits for EOF before interpreting the response).</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>if ($hdr(User-Agent) =~ "xmlrpclib")</div>
<div><span class="Apple-tab-span" style="white-space:pre">                        </span>set_reply_close();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>set_reply_no_connect();</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>dispatch_rpc();</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>send_reply("403", "Forbidden");</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>exit;</div><div>}</div><div>#!endif</div><div><br></div><div># route to voicemail server</div><div>route[TOVOICEMAIL] {</div><div>#!ifdef WITH_VOICEMAIL</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if(!is_method("INVITE"))</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span># check if VoiceMail server IP is defined</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (strempty($sel(cfg_get.voicemail.srv_ip))) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if($avp(oexten)==$null)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>return;</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>$ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                                </span>+ $sel(cfg_get.voicemail.srv_port);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(RELAY);</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>exit;</div>
<div>#!endif</div><div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>return;</div><div>}</div><div><br></div><div># manage outgoing branches</div><div>branch_route[MANAGE_BRANCH] {</div><div>
<span class="Apple-tab-span" style="white-space:pre">        </span>xdbg("new branch [$T_branch_idx] to $ru\n");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(NATMANAGE);</div><div>}</div>
<div><br></div><div># manage incoming replies</div><div>onreply_route[MANAGE_REPLY] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>xdbg("incoming reply\n");</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if(status=~"[12][0-9][0-9]")</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>route(NATMANAGE);</div><div>}</div><div><br></div><div># manage failure routing cases</div><div>failure_route[MANAGE_FAILURE] {</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>route(NATMANAGE);</div>
<div><br></div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (t_is_canceled()) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div><br></div><div>#!ifdef WITH_BLOCK3XX</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># block call redirect based on 3xx replies.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>if (t_check_status("3[0-9][0-9]")) {</div>
<div><span class="Apple-tab-span" style="white-space:pre">                </span>t_reply("404","Not found");</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div>
<div>#!endif</div><div><br></div><div>#!ifdef WITH_VOICEMAIL</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># serial forking</div><div><span class="Apple-tab-span" style="white-space:pre">        </span># - route to voicemail on busy or no answer (timeout)</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>if (t_check_status("486|408")) {</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>route(TOVOICEMAIL);</div><div><span class="Apple-tab-span" style="white-space:pre">                </span>exit;</div>
<div><span class="Apple-tab-span" style="white-space:pre">        </span>}</div><div>#!endif</div><div>}</div></div><div>--------------------------------------------------------------------------------------------------------------</div>
<div><br></div><div><br></div><div><br></div><div>Espero que alguien pueda echarme una mano. Gracias.</div>