Hola a todos,
Estoy tratando de configurar Kamailio 3.0.0 para que redirija las llamadas
a un buzón de voz basado en SEMS cuando el usuario llamado está ocupado.
Siguiendo las instrucciones de varios ejemplos encontrados en internet, y
del propio script ejemplo de kamailio.cfg, estoy usando las funciones
revert_uri(), rewritehostport() (o reescribiéndo el R-URI manualmente) y
append_branch(), dentro de la failure_route. Aparentemente modifica
correctamente el R-URI y crea la segunda "pata" de la llamada. Sin embargo,
a pesar de que la dirección del R-Uri aparece bien cambiada como decía en
la Request Line, el paquete IP se envía a la dirección IP del destinatario
original:
|Time | 192.168.3.20
| 192.168.0.167 |
| | | 192.168.0.197 |
|5,069 | INVITE SDP ( telephone-event)
| |SIP From: sip:4095@192.168.0.197
To:sip:4440@192.168.0.197
| |(5060) ------------------> (5060) | |
|5,071 | 407 Proxy Authentication Required
| |SIP Status
| |(5060) <------------------ (5060) | |
|5,074 | ACK | | |SIP
Request
| |(5060) ------------------> (5060) | |
|5,076 | INVITE SDP ( telephone-event)
| |SIP From: sip:4095@192.168.0.197
To:sip:4440@192.168.0.197
| |(5060) ------------------> (5060) | |
|5,084 | 100 trying -- your call is important to us
| |SIP Status
| |(5060) <------------------ (5060) | |
|5,085 | | INVITE SDP (
telephone-event) |SIP Request
| | |(5060) ------------------> (5060) |
|5,088 | | 100 Trying| |SIP
Status
| | |(5060) <------------------ (5060) |
|5,088 | | 486 Busy Here |SIP
Status
| | |(5060) <------------------ (5060) |
|5,091 | | ACK | |SIP
Request
| | |(5060) ------------------> (5060) |
|5,101 | | INVITE SDP (
telephone-event) |SIP Request
| | |(5060) ------------------> (5060) |
|5,102 | | 404 Not Found |SIP
Status
| | |(5060) <------------------ (5060) |
|5,102 | | ACK | |SIP
Request
| | |(5060) ------------------> (5060) |
|5,103 | 404 Not Found | |SIP
Status
| |(5060) <------------------ (5060) | |
|5,106 | ACK | | |SIP
Request
| |(5060) ------------------> (5060) | |
Esta es la captura del Invite de la redirección, en el timestamp 5,101
No. Time Source Destination Protocol
Info
1235 5.100698 192.168.0.197 192.168.0.167 SIP/SDP
Request: INVITE sip:voicemail4440@192.168.0.197:5080, with session
description
Frame 1235 (1151 bytes on wire, 1151 bytes captured)
Ethernet II, Src: CadmusCo_96:31:84 (08:00:27:96:31:84), Dst:
Micro-St_6d:77:54 (00:21:85:6d:77:54)
Internet Protocol, Src: 192.168.0.197 (192.168.0.197), Dst: 192.168.0.167
(192.168.0.167)
User Datagram Protocol, Src Port: sip (5060), Dst Port: sip (5060)
Session Initiation Protocol
Request-Line: INVITE sip:voicemail4440@192.168.0.197:5080 SIP/2.0
Method: INVITE
Request-URI: sip:voicemail4440@192.168.0.197:5080
[Resent Packet: True]
[Suspected resend of frame: 1233]
Message Header
Record-Route: <sip:192.168.0.197;lr=on;nat=
yes>
Via: SIP/2.0/UDP 192.168.0.197;branch=z9hG4bKafce.403718a6.1
Via: SIP/2.0/UDP
192.168.57.20;received=192.168.3.20;rport=5060;branch=z9hG4bK0a00030f0000003151ed60b85ec2c3de000000c8
Content-Length: 386
Contact: <sip:4095@192.168.3.20:5060>
Call-ID: 8EAF9EC2-1DD2-11B2-B110-C84E476664B0(a)10.0.3.15
Content-Type: application/sdp
CSeq: 2 INVITE
From: "4095"<sip:4095@192.168.0.197>;tag=121754238352072516
Max-Forwards: 69
To: <sip:4440@192.168.0.197>
User-Agent: SJphone/1.60.299a/L (SJ Labs)
P-App-Name: voicemail
P-App-Param: mod=box;usr= voicemail4440;dom=sipproxy.a.com
;uid=voicemail4440;did=sipproxy.a.com;
Message Body
La configuración que he usado es la siguiente:
# Sample failure route
failure_route[FAIL_ONE] {
#ifdef WITH_NAT
if (is_method("INVITE")
&& (isbflagset("6") || isflagset(5))) {
unforce_rtp_proxy();
}
#endif
if (t_is_canceled()) {
exit;
}
# uncomment the following lines if you want to block client
# redirect based on 3xx replies.
##if (t_check_status("3[0-9][0-9]")
) {
##t_reply("404","Not found");
## exit;
##}
# uncomment the following lines if you want to redirect the failed
# calls to a different new destination
if (t_check_status("486|408")) {
revert_uri();
prefix("voicemail");
remove_hf("P-App-Name");
append_hf("P-App-Name: voicemail\r\n");
append_hf("P-App-Param: mod=box;usr= $rU;dom=sipproxy.a.com
;uid=$rU;did=sipproxy.a.com;\r\n");
$ru = "sip:" + $rU + "@" + "192.168.0.197:5080";
#rewritehostport("192.168.0.197:5080");
#append_branch("sip:4888@192.168.0.102");
append_branch();
# do not set the missed call flag again
t_relay();
}
}
¿Alguien ha tenido un problema similar? Cualquier ayuda será bienvenida.
Saludos.
LAA.
Alguien me podria por favor ayudar con mi setup, estoy tratando de
configurar kamailio como proxy en AWS, nesecito pasar llamadas de carriers
hacia my banco de asterisk, pero estoy teniendo un problema cuando asterisk
responde el carrier recibe el ip interno no el externo y la llamada se cae
despues de varios 200 de asterisk wue son a su vez pasados por kamailio,
podria alguien mostrar un link donde pueda aprender a configurar nat en
kamailio.
la siguiente es mi configuracion
mi pobjetivo es hacer un proxy para ocultar todos los asterisk detras de
kamailio.
no nesecito registrar ninguna cuenta solo hacer un proxy de los invites, y
el problema esta que en mis respuestas en el contacto kamailio esta
escribiendo el ip interno no el externo y por esto el originador no puede
responder a la llamada.
gracias de antemano por cualquier ayuda prestada.
originador >>>kamailio >>>>asterisk
debug=4
log_stderror=yes
#!else
debug=2
log_stderror=yes
#!endif
memdbg=5
memlog=5
log_facility=LOG_LOCAL0
fork=yes
children=4
auto_aliases=no
listen=udp:internal ip:5060 advertise external ip:5060
mhomed=0
alias="mysip.com"
alias="Internal IP:5060"
alias=Internal IP:5060
alias=Elastic IP
alias=Elastic IP:5060
port=5060
enable_tls=no
#tcp_connection_lifetime=3605
#!ifdef WITH_SRCPATH
mpath="modules_k:modules"
#!else
mpath="/usr/lib64/kamailio/modules_k/:/usr/lib64/kamailio/modules/"
mpath="/usr/lib64/kamailio/modules_k/:/usr/lib64/kamailio/modules/"
#!endif
loadmodule "tm.so"
loadmodule "sl.so"
loadmodule "rr.so"
loadmodule "maxfwd.so"
loadmodule "textops.so"
loadmodule "pv.so"
loadmodule "dispatcher.so"
loadmodule "usrloc.so"
loadmodule "registrar.so"
loadmodule "siputils.so"
loadmodule "sanity.so"
loadmodule "ctl.so"
loadmodule "mi_rpc.so"
loadmodule "acc.so"
loadmodule "avpops.so"
#!ifdef WITH_NAT
loadmodule "nathelper.so"
loadmodule "rtpproxy.so"
#!endif
loadmodule "xlog.so"
modparam("tm", "failure_reply_mode", 3)
modparam("tm", "fr_timer", 30000)
modparam("tm", "fr_inv_timer", 120000)
modparam("dispatcher", "list_file", "/etc/kamailio/dispatcher.lst")
#!ifdef WITH_NAT
# ----- rtpproxy params -----
modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")
# ----- nathelper params -----
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
# params needed for NAT traversal in other modules
modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
modparam("usrloc", "nat_bflag", FLB_NATB)
#!endif
#subst_uri('/^sip:1([23456789][0-9]+)@(.*)$/sip:\1@\2/i');
request_route {
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
}
if (loose_route()) {
if (!t_relay()) {
sl_reply_error();
}
exit;
}
if (is_method("INVITE")) {
record_route();
append_hf("X-Src-IP: $src_ip\r\n");
}
if(!t_relay_to_udp("ip interna", "5060")) {
sl_reply_error();
}
exit;
}
Buenas tardes
Este es mi primer mensaje a la lista, he empezado con kamailio hace
poco, aunque ya tengo bastante experiencia con asterisk y la voip en
general
He instalado kamailio 3.3 + asterisk 1.8 realtime en una debian.
Siguiendo el documento que hay en Asipto.
Para probarlo, contraté una línea voip y la puse como salida y entrada
de llamadas en el asterisk. Todo funcionando sin problemas, puedo
llamar y recibir llamadas.
Luego registré otro asterisk (B) en otra máquina para que haga uso de
la infraestructura arriba mencionada.
La cuestión es que, a ojos del asterisk (A) que trabaja junto a
kamailio, todos los usuarios SIP registrados provienen de la misma IP
y del mismo puerto (la ip local)
sip*CLI> sip show peers
Name/username Host Dyn
Forcerport ACL Port Status Realtime
200001/200001 88.99.88.99 D
N 5060 OK (50 ms) Cached RT
200002/200002 88.99.88.99 D
N 5060 OK (9 ms) Cached RT
kamailio 88.99.88.99
N 5060 OK (1 ms)
proveedor/vozip 123.123.123.123
5060 OK (1 ms)
4 sip peers [Monitored: 4 online, 0 offline Unmonitored: 0 online, 0 offline]
Si yo en otro sistema asterisk (B) creo un trunk tal que así:
register=200001:password@88.99.88.99
[trunkvoip]
disallow=all
defaultuser=200001
type=friend
sendrpid=yes
secret=password
qualify=yes
insecure=invite,port
host=88.99.88.99
dtmfmode=rfc2833
canrenvite=no
allow=g729
context=llamadas-entrantes
fromuser=200001
funciona bien.
La cuestión es que yo puedo falsear el usuario que llama, simplemente
cambiando "fromuser" a otro usuario que sí que exista en la base de
datos realtime
simplemente poniendo "fromuser=200002", el asterisk ya se cree que es
el usuario 200002 el que genera la llamada, cuando realmente es el
usuario 200001
¿Como puedo evitar esta situación?
Muchas gracias
Buenas,
Estoy intentando configurar Kamailio 3.3.1 como proxy SIP detras de un NAT
y como dispatcher de 2 Asterisk 1.8.7 detras del mismo NAT.
Las llamadas vienen de carriers externos hacia Kamailio que sera el que
tenga que balancear la carga entre los Asterisk.
He intentado manualmente reescribir la record-route hacia afuera con la ip
publica (advertised_address="...")
El problema viene cuando el carrier externo manda un ACK hacia la
IP_PUBLICA_NAT y éste no lo reconoce como su propia ip y lo reenvia (me
imagino que es por la cabecera Record-Route que apunta a la ip publica)
He probado forzando al Centos 5.8 a que escuche en una ip no local
cambiando en el fichero /etc/sysctl.conf:
net.ipv4.ip_nonlocal_bind = 1
Y en la configuracion de Kamailio:
listen:udp:IP_PUBLICA_NAT:5060
Para que Kamailio escuche en la IP_PUBLICA_NAT pero sigue sin funcionar.
Cuando le llegan paquetes SIP del tipo:
ACK sip:IP_PUBLICA_NAT:5060;lr=on
Envia el paquete a la IP del NAT y no se como decir a Kamailio que reenvie
ese paquete al Asterisk correspondiente.
¿Es posible esta configuración o es indispensable que Kamailio tenga una IP
publica escuchando en la interfaz? ¿Es posible una configuracion de
Kamailio detras de un NAT y que gestione llamadas entrantes?
Gracias de antemano y un saludo.
--
*Victor Torre*
Buenas,
acabo de actualizar Kamailio y no quiere iniciar. En los logs veo esto:
ERROR: <core> [db.c:439]: invalid version 9 for table active_watchers
found, expected 11 (check table structure and table "version")
Estoy usando los paquetes de la versión estable de deb.kamailio.org
Buscando por Google no encuentro nada claro de como solucionarlo. ¿Cómo
puedo actualizar el schema de esa tabla?
Saludos
Finalmente tengo Kamailio y dos Asterisks "configurados"
Quiero ver si alguien me puede encaminar para hacer loadbalance y failover
en los dos Asterisks.
Gracias de antemano,
Tony
Hola a tod@s,
llevo un tiempo intentando activar la redirección en Kamailio cuando el
destinatario tiene activadas dichas redirecciones "callbusy". Este es el
último código que tengo en pruebas y no funciona.
La redirección directa funciona sin problemas, pero esta no. Al parecer
entra dentro de la ruta, detecta el 486 pero no vuelve a llamar a la uri de
la redirección.
failure_route[FAIL_ONE] {
xlog("L_INFO", "entering failure_route for reply code $T_reply_code\n");
if (is_method("INVITE") && (isbflagset(FLB_NATB) ||
isflagset(FLT_NATS))) {
unforce_rtp_proxy();
}
if (t_is_canceled()) {
exit;
}
if (t_check_status("486|408"))
{
xlog("L_NOTICE", "r[FAIL] / &ru TimeOut or Busy\n");
if(avp_db_load("$ru","$avp(s:callbusy)"))
{
xlog("L_NOTICE", "Callbusy activado!\n");
avp_pushto ("$ru","$avp(s:callbusy)");
xlog("L_NOTICE","$ru\n");
append_branch();
route(BUSY);
}
}
}
route[BUSY]
{
route(NAT);
route(RELAY);
}
Este es el error que puedo ver
3(14163) NOTICE: <script>: KAM-INFO: r[ALIAS] - Checking ALIAS -> 171
3(14163) NOTICE: <script>: ALIAS FOUND: sip:171@xxx.net;user=phone ->
xxxx.xxx(a)xxx.net
3(14163) INFO: <script>: RTPPROXY -> M=INVITE
RURI=sip:xxxx.xxx@XX.XX.36.116:1548 F=sip:xxx@xxx.net
T=sip:171@xxx.net;user=phone
IP=XX.XX.32.48 ID=1291401699@XX_XX_32_48
3(14163) ERROR: nathelper [nhelpr_funcs.c:341]: failed to parse Contact
URI []
4(14164) INFO: <script>: entering failure_route for reply code 302
1(14161) INFO: <core> [forward.c:774]: broken reply to forward - no 2nd via
2(14162) INFO: <core> [forward.c:774]: broken reply to forward - no 2nd via
Cualquier ayuda será bienvenida
Gracias de antemano
Saludos
Pepe
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:
Softphone (192.168.0.5) <--> Kamailio (192.168.0.3) <--> Router
(192.168.0.1) <--> Softphone sobre smartphone
Todos los puertos del router están redireccionados a 192.168.0.3
Tengo instalado rtpproxy 1.2.1-1 con la siguiente configuración:
--------------------------/etc/defaults/rtpproxy--------------------------------
# The control socket.
#CONTROL_SOCK="unix:/var/run/rtpproxy/rtpproxy.sock"
# To listen on an UDP socket, uncomment this line:
CONTROL_SOCK=udp:127.0.0.1:22222
# Additional options that are passed to the daemon.
EXTRA_OPTS="-l candamil.dyndns.org"
----------------------------------------------------------------------------------------
y el funcionamiento es correcto. Este es el mensaje de salida del log de
kamailio:
----------------------------------------------------------------------------------------------
Nov 12 20:09:13 condor kamailio[7001]: INFO: rtpproxy [rtpproxy.c:1415]:
rtp proxy <udp:127.0.0.1:22222> found, support for it enabled
-----------------------------------------------------------------------------------------------
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:
SIP identity: sip:1001@192.168.0.3
SIP proxy: sip:192.168.0.3
Indico conexión directa a internet.
En la del externo especifico como proxy y domain "candamil.dyndns.org", que
es la dirección DNS que apunta a la IP de mi router.
En este caso, los síntomas son los siguientes:
La autentificación de ambos, tanto externo como interno, es correcta.
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:
----------------------------------------------------------------------------------------------
Nov 12 20:23:14 condor kamailio[6991]: ERROR: rtpproxy [rtpproxy.c:2260]:
incorrect port 0 in reply from rtp proxy
----------------------------------------------------------------------------------------------
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 (stunserver.org). En los 3
casos, en el softphone externo, figura una llamada de 1001(a)192.168.0.3,
mientras que en el interno, figura una llamada de 1002(a)candamil.dyndns.org.
Si cambio en el softphone interno el proxy a sip:candamil.dyndns.org, todo
se vuelve a repetir.
Si lo que hago es cambiar la SIP identity a sip:1001@candamil.dyndns.org,
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:
----------------------------------------------------------------------------------------------------------
Nov 12 20:53:00 condor kamailio[7306]: ERROR: <core>
[parser/parse_via.c:2600]: ERROR: parse_via: invalid port number
<5060ranch=z9hG4bKc
50f.b4825246.0>
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
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:
<sip:1001@candamil.dyndns.org>;tag=783852345#015#012To: <
sip:1002@candamil.dyndns.org>#015#012Call-ID: 1644787160#015#012CSeq: 21
INVITE#
015#012User-Agent: Linphone/3.4.0 (eXosip2/unknown)#015#012Content-Length:
0#015#012#015#012>
------------------------------------------------------------------------------------------------------------
Por el contrario, haciendo una llamada desde el externo al interno, ocurre
lo mismo que antes.
Por último, esta es la configuración relevante de kamailio:
-----------------------------------------kamailio.cfg----------------------------------------------------
#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_NAT
####### Defined Values #########
# *** Value defines - IDs used later in config
#!ifdef WITH_MYSQL
# - database URL - used to connect to database server by modules such
# as: auth_db, acc, usrloc, a.s.o.
#!define DBURL "mysql://openser:openserrw@localhost/openser"
#!endif
#!ifdef WITH_MULTIDOMAIN
# - the value for 'use_domain' parameters
#!define MULTIDOMAIN 1
#!else
#!define MULTIDOMAIN 0
#!endif
# - flags
# FLT_ - per transaction (message) flags
# FLB_ - per branch flags
#!define FLT_ACC 1
#!define FLT_ACCMISSED 2
#!define FLT_ACCFAILED 3
#!define FLT_NATS 5
#!define FLB_NATB 6
#!define FLB_NATSIPPING 7
####### Global Parameters #########
/* uncomment the next line to disable the auto discovery of local aliases
based on reverse DNS on IPs (default on) */
#auto_aliases=no
/* add local domain aliases */
alias="candamil.dyndns.org"
/* port to listen to
* - can be specified more than once if needed to listen on many ports */
port=5060
#!ifdef WITH_TLS
enable_tls=yes
#!endif
# life time of TCP connection when there is no traffic
# - a bit higher than registration expires to cope with UA behind NAT
tcp_connection_lifetime=3605
####### Custom Parameters #########
#!ifdef WITH_PSTN
# PSTN GW Routing
#
# - pstn.gw_ip: valid IP or hostname as string value, example:
# pstn.gw_ip = "10.0.0.101" desc "My PSTN GW Address"
#
# - by default is empty to avoid misrouting
pstn.gw_ip = "" desc "PSTN GW Address"
#!endif
####### Modules Section ########
#!ifdef WITH_MYSQL
loadmodule "db_mysql.so"
#!endif
#!ifdef WITH_AUTH
loadmodule "auth.so"
loadmodule "auth_db.so"
#!ifdef WITH_NAT
loadmodule "nathelper.so"
loadmodule "rtpproxy.so"
#!endif
# ----------------- setting module-specific parameters ---------------
# ----- auth_db params -----
#!ifdef WITH_AUTH
modparam("auth_db", "db_url", DBURL)
modparam("auth_db", "calculate_ha1", yes)
modparam("auth_db", "password_column", "password")
modparam("auth_db", "load_credentials", "")
modparam("auth_db", "use_domain", MULTIDOMAIN)
#!ifdef WITH_NAT
# ----- rtpproxy params -----
modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:22222")
# ----- nathelper params -----
modparam("nathelper", "natping_interval", 30)
modparam("nathelper", "ping_nated_only", 1)
modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)
modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")
# params needed for NAT traversal in other modules
modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")
modparam("usrloc", "nat_bflag", FLB_NATB)
#!endif
####### Routing Logic ########
# Main SIP request routing logic
# - processing of any incoming SIP request starts with this route
# - note: this is the same as route { ... }
request_route {
# per request initial checks
route(REQINIT);
# NAT detection
route(NATDETECT);
# handle requests within SIP dialogs
route(WITHINDLG);
### only initial requests (no To tag)
# CANCEL processing
if (is_method("CANCEL"))
{
if (t_check_trans())
t_relay();
exit;
}
t_check_trans();
# authentication
route(AUTH);
# record routing for dialog forming requests (in case they are routed)
# - remove preloaded route headers
remove_hf("Route");
if (is_method("INVITE|SUBSCRIBE"))
record_route();
# account only INVITEs
if (is_method("INVITE"))
{
setflag(FLT_ACC); # do accounting
}
# dispatch requests to foreign domains
route(SIPOUT);
### requests for my local domains
# handle presence related requests
route(PRESENCE);
# handle registrations
route(REGISTRAR);
if ($rU==$null)
{
# request with no Username in RURI
sl_send_reply("484","Address Incomplete");
exit;
}
# dispatch destinations to PSTN
route(PSTN);
# user location service
route(LOCATION);
route(RELAY);
}
route[RELAY] {
# enable additional event routes for forwarded requests
# - serial forking, RTP relaying handling, a.s.o.
if (is_method("INVITE|SUBSCRIBE")) {
t_on_branch("MANAGE_BRANCH");
t_on_reply("MANAGE_REPLY");
}
if (is_method("INVITE")) {
t_on_failure("MANAGE_FAILURE");
}
if (!t_relay()) {
sl_reply_error();
}
exit;
}
# Per SIP request initial checks
route[REQINIT] {
#!ifdef WITH_ANTIFLOOD
# flood dection from same IP and traffic ban for a while
# be sure you exclude checking trusted peers, such as pstn gateways
# - local host excluded (e.g., loop to self)
if(src_ip!=myself)
{
if($sht(ipban=>$si)!=$null)
{
# ip is already blocked
xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
exit;
}
if (!pike_check_req())
{
xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
$sht(ipban=>$si) = 1;
exit;
}
}
#!endif
if (!mf_process_maxfwd_header("10")) {
sl_send_reply("483","Too Many Hops");
exit;
}
if(!sanity_check("1511", "7"))
{
xlog("Malformed SIP message from $si:$sp\n");
exit;
}
}
# Handle requests within SIP dialogs
route[WITHINDLG] {
if (has_totag()) {
# sequential request withing a dialog should
# take the path determined by record-routing
if (loose_route()) {
if (is_method("BYE")) {
setflag(FLT_ACC); # do accounting ...
setflag(FLT_ACCFAILED); # ... even if the transaction fails
}
if ( is_method("ACK") ) {
# ACK is forwarded statelessy
route(NATMANAGE);
}
route(RELAY);
} else {
if (is_method("SUBSCRIBE") && uri == myself) {
# in-dialog subscribe requests
route(PRESENCE);
exit;
}
if ( is_method("ACK") ) {
if ( t_check_trans() ) {
# no loose-route, but stateful ACK;
# must be an ACK after a 487
# or e.g. 404 from upstream server
t_relay();
exit;
} else {
# ACK without matching transaction ... ignore and discard
exit;
}
}
sl_send_reply("404","Not here");
}
exit;
}
}
# Handle SIP registrations
route[REGISTRAR] {
if (is_method("REGISTER"))
{
if(isflagset(FLT_NATS))
{
setbflag(FLB_NATB);
# uncomment next line to do SIP NAT pinging
setbflag(FLB_NATSIPPING);
}
if (!save("location"))
sl_reply_error();
exit;
}
}
# USER location service
route[LOCATION] {
#!ifdef WITH_SPEEDIAL
# search for short dialing - 2-digit extension
if($rU=~"^[0-9][0-9]$")
if(sd_lookup("speed_dial"))
route(SIPOUT);
#!endif
#!ifdef WITH_ALIASDB
# search in DB-based aliases
if(alias_db_lookup("dbaliases"))
route(SIPOUT);
#!endif
$avp(oexten) = $rU;
if (!lookup("location")) {
$var(rc) = $rc;
route(TOVOICEMAIL);
t_newtran();
switch ($var(rc)) {
case -1:
case -3:
send_reply("404", "Not Found");
exit;
case -2:
send_reply("405", "Method Not Allowed");
exit;
}
}
# when routing via usrloc, log the missed calls also
if (is_method("INVITE"))
{
setflag(FLT_ACCMISSED);
}
}
# Presence server route
route[PRESENCE] {
if(!is_method("PUBLISH|SUBSCRIBE"))
return;
#!ifdef WITH_PRESENCE
if (!t_newtran())
{
sl_reply_error();
exit;
};
if(is_method("PUBLISH"))
{
handle_publish();
t_release();
}
else
if( is_method("SUBSCRIBE"))
{
handle_subscribe();
t_release();
}
exit;
#!endif
# if presence enabled, this part will not be executed
if (is_method("PUBLISH") || $rU==$null)
{
sl_send_reply("404", "Not here");
exit;
}
return;
}
# Authentication route
route[AUTH] {
#!ifdef WITH_AUTH
if (is_method("REGISTER"))
{
# authenticate the REGISTER requests (uncomment to enable auth)
if (!www_authorize("$td", "subscriber"))
{
www_challenge("$td", "0");
exit;
}
if ($au!=$tU)
{
sl_send_reply("403","Forbidden auth ID");
exit;
}
} else {
#!ifdef WITH_IPAUTH
if(allow_source_address())
{
# source IP allowed
return;
}
#!endif
# authenticate if from local subscriber
if (from_uri==myself)
{
if (!proxy_authorize("$fd", "subscriber")) {
proxy_challenge("$fd", "0");
exit;
}
if (is_method("PUBLISH"))
{
if ($au!=$fU || $au!=$tU) {
sl_send_reply("403","Forbidden auth ID");
exit;
}
if ($au!=$rU) {
sl_send_reply("403","Forbidden R-URI");
exit;
}
#!ifdef WITH_MULTIDOMAIN
if ($fd!=$rd) {
sl_send_reply("403","Forbidden R-URI domain");
exit;
}
#!endif
} else {
if ($au!=$fU) {
sl_send_reply("403","Forbidden auth ID");
exit;
}
}
consume_credentials();
# caller authenticated
} else {
# caller is not local subscriber, then check if it calls
# a local destination, otherwise deny, not an open relay here
if (!uri==myself)
{
sl_send_reply("403","Not relaying");
exit;
}
}
}
#!endif
return;
}
# Caller NAT detection route
route[NATDETECT] {
#!ifdef WITH_NAT
force_rport();
if (nat_uac_test("19")) {
if (is_method("REGISTER")) {
fix_nated_register();
} else {
fix_nated_contact();
}
setflag(FLT_NATS);
}
#!endif
return;
}
# RTPProxy control
route[NATMANAGE] {
#!ifdef WITH_NAT
if (is_request()) {
if(has_totag()) {
if(check_route_param("nat=yes")) {
setbflag(FLB_NATB);
}
}
}
if (!(isflagset(FLT_NATS) || isbflagset(FLB_NATB)))
return;
rtpproxy_manage();
if (is_request()) {
if (!has_totag()) {
add_rr_param(";nat=yes");
}
}
if (is_reply()) {
if(isbflagset(FLB_NATB)) {
fix_nated_contact();
}
}
#!endif
return;
}
# Routing to foreign domains
route[SIPOUT] {
if (!uri==myself)
{
append_hf("P-hint: outbound\r\n");
route(RELAY);
}
}
# PSTN GW routing
route[PSTN] {
#!ifdef WITH_PSTN
# check if PSTN GW IP is defined
if (strempty($sel(cfg_get.pstn.gw_ip))) {
xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
return;
}
# route to PSTN dialed numbers starting with '+' or '00'
# (international format)
# - update the condition to match your dialing rules for PSTN routing
if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
return;
# only local users allowed to call
if(from_uri!=myself) {
sl_send_reply("403", "Not Allowed");
exit;
}
$ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);
route(RELAY);
exit;
#!endif
return;
}
# XMLRPC routing
#!ifdef WITH_XMLRPC
route[XMLRPC] {
# allow XMLRPC from localhost
if ((method=="POST" || method=="GET")
&& (src_ip==127.0.0.1)) {
# close connection only for xmlrpclib user agents (there is a bug in
# xmlrpclib: it waits for EOF before interpreting the response).
if ($hdr(User-Agent) =~ "xmlrpclib")
set_reply_close();
set_reply_no_connect();
dispatch_rpc();
exit;
}
send_reply("403", "Forbidden");
exit;
}
#!endif
# route to voicemail server
route[TOVOICEMAIL] {
#!ifdef WITH_VOICEMAIL
if(!is_method("INVITE"))
return;
# check if VoiceMail server IP is defined
if (strempty($sel(cfg_get.voicemail.srv_ip))) {
xlog("SCRIPT: VoiceMail rotuing enabled but IP not defined\n");
return;
}
if($avp(oexten)==$null)
return;
$ru = "sip:" + $avp(oexten) + "@" + $sel(cfg_get.voicemail.srv_ip)
+ $sel(cfg_get.voicemail.srv_port);
route(RELAY);
exit;
#!endif
return;
}
# manage outgoing branches
branch_route[MANAGE_BRANCH] {
xdbg("new branch [$T_branch_idx] to $ru\n");
route(NATMANAGE);
}
# manage incoming replies
onreply_route[MANAGE_REPLY] {
xdbg("incoming reply\n");
if(status=~"[12][0-9][0-9]")
route(NATMANAGE);
}
# manage failure routing cases
failure_route[MANAGE_FAILURE] {
route(NATMANAGE);
if (t_is_canceled()) {
exit;
}
#!ifdef WITH_BLOCK3XX
# block call redirect based on 3xx replies.
if (t_check_status("3[0-9][0-9]")) {
t_reply("404","Not found");
exit;
}
#!endif
#!ifdef WITH_VOICEMAIL
# serial forking
# - route to voicemail on busy or no answer (timeout)
if (t_check_status("486|408")) {
route(TOVOICEMAIL);
exit;
}
#!endif
}
--------------------------------------------------------------------------------------------------------------
Espero que alguien pueda echarme una mano. Gracias.
Hola, mejor de momento mantenemos el hilo en la lista. Más info abajo:
El día 23 de marzo de 2012 16:41, magnusadilsom(a)gmail.com
<magnusadilsom(a)gmail.com> escribió:
> # -----------------------------------------------------------------
> # Handle Handle NAT
> # -----------------------------------------------------------------
>
> route[4]{
>
> force_rport();
> if (nat_uac_test("19")) {
> xlog("L_INFO", "NAT detected1");
> if (method=="REGISTER") {
> fix_nated_register();
> } else {
> fix_nated_contact();
> fix_nated_sdp("1");
> xlog("L_INFO", "NAT detected2");
> };
> setflag(5);
> return;
> };
No sólo hay que "corregir" el Contact en el INVITE sino que también en
las respuestas 180/183/200 que tengan SDP (on_reply_route y tal). Y lo
mismo a la hora de aplicar rtpproxy.
--
Iñaki Baz Castillo
<ibc(a)aliax.net>
Estimados:
Tengo un escenario armado con un Kamailio como balanceador de carga
(CALL STATEFUL PROXY) y dos asterisk abajo, ofreciendo servicios de
IPPBX.
Los teléfonos se registran contra el Kamailio, y este ultimo deriva
las llamadas a uno u otro asterisk según corresponda...
En único problema que estoy teniendo es el siguiente.
Cuando A lllama a B, esta primera llamada es procesada en el Asterisk 1.
Ahora cuando por ejemplo B quiere transferir la llamada a C (REFER),
se pone la primera llamada en espera, se negocia una segunda llamada y
depende en que asterisk cae esta llamada, la transferencia es exitosa
o no.
Por lo que estuve trazeando, el INVITE de la segunda llamada, cae en
este ejemplo en el asterisk2 y cuando el teléfono envia el REFER-TO al
asterisk1, este no tiene el dialogo de la llama referida.. entonces
falla...
Se podrá hacer fork del Refer para que me responda el que tiene el
dialogo? o es una locura?
Saludos
EDU
--
Jorge Eduardo Silva Jackson
CCNA - dCAP
SysCon
+598 99665783