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.
El día 9 de octubre de 2012 18:01, Victor Torre Antunez victor.torre@stoneworksolutions.net escribió:
Buenas,
Hola, entre líneas:
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)
Te refieres a la cabecera Route del ACK ;)
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?
Un proxy detrás de NAT hablando con un nodo SIP fuera del NAT es sinónimo de todo el dolor que estás experimentando. Honestamente en mi vida me he esforzado por hacer funcionar ese escenario.
Si quieres pega una traza de un INVITE entrante, sustituyendo la IP pública del router por IP_PUBLICA_ROUTER, la IP privada de kamailio por IP_PRIVADA_KAMAILIO, la IP privada del Asterisk por IP_PRIVADA_ASTERISK y la IP de tu proveedor SIP por IP_PROVEEDOR. Yo lo veo complicado pero se le puede echar un vistazo.
Gracias por la aclaración, porque es cierto que da dolor de cabeza mezclar NAT y SIP ;)
He pegado la captura en pastebin: http://pastebin.com/Q5Y372PW
Si te fijas el ultimo ACK (linea 162) lo envia a IP_PRIVADA_ROUTER cuando en realidad deberia reenviarlo al Asterisk.
Aqui tienes la configuracion de Kamailio: http://pastebin.com/akDUC5y7
Creo que la linea donde hace ese reenvio es la 686 (justo donde tengo un log ("Within dialog, with loose route....") y no se como puedo decir a Kamailio que lo envie a uno de los Asterisk.
¿Como sabe el modulo dispatcher a que nodo tiene que mandarlo? No me queda claro como funciona este modulo exactamente, particularmente como sabe a donde tiene que enviar los ACK de las transacciones. En el primer INVITE queda claro que es mediante la funcion "ds_select_dst" pero ¿en el resto de los paquetes?
Gracias de nuevo!
El 9 de octubre de 2012 23:13, Iñaki Baz Castillo ibc@aliax.net escribió:
El día 9 de octubre de 2012 18:01, Victor Torre Antunez victor.torre@stoneworksolutions.net escribió:
Buenas,
Hola, entre líneas:
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)
Te refieres a la cabecera Route del ACK ;)
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?
Un proxy detrás de NAT hablando con un nodo SIP fuera del NAT es sinónimo de todo el dolor que estás experimentando. Honestamente en mi vida me he esforzado por hacer funcionar ese escenario.
Si quieres pega una traza de un INVITE entrante, sustituyendo la IP pública del router por IP_PUBLICA_ROUTER, la IP privada de kamailio por IP_PRIVADA_KAMAILIO, la IP privada del Asterisk por IP_PRIVADA_ASTERISK y la IP de tu proveedor SIP por IP_PROVEEDOR. Yo lo veo complicado pero se le puede echar un vistazo.
-- Iñaki Baz Castillo ibc@aliax.net
SR-Users-ES mailing list SR-Users-ES@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users-es
El 10 de octubre de 2012 10:15, Victor Torre Antunez < victor.torre@stoneworksolutions.net> escribió:
Gracias por la aclaración, porque es cierto que da dolor de cabeza mezclar NAT y SIP ;)
He pegado la captura en pastebin: http://pastebin.com/Q5Y372PW
Si te fijas el ultimo ACK (linea 162) lo envia a IP_PRIVADA_ROUTER cuando en realidad deberia reenviarlo al Asterisk.
El problema es que Asterisk está respondiendo con un Contact así (línea 104):
Contact: sip:931111111@IP_PUBLICA_ROUTER:5060
por lo que el ACK tendrá en el Request-URI esa IP (IP_PUBLICA_ROUTER:5060) y por lo tanto Kamailio lo rutará a IP_PUBLICA_ROUTER:5060.
Haz que Asterisk ponga su IP privada en el Contact (parámetro externip de sip.conf donde has metido a machete la IP pública de tu router, quita esa opción).
Con esa modificación la señalización se soluciona, pero aparece un problema en el audio.
A nivel SDP aparece la IP_PRIVADA_ASTERISK, con lo que el proveedor manda el audio a esa ip privada. Sin embargo el audio en el otro sentido (asterisk->proveedor) funciona correctamente.
¿Es posible decir a Asterisk que escriba en el SDP de la IP_PRIVADA_ROUTER sin cambiar la directiva "externip"? ¿Es necesario un RTP Proxy?
El escenario que tengo montado es mas complejo, puesto que el Firewall que hace de NAT esta publicando una IP Publica a los Asterisk aparte de la privada, y es como esta funcionando ahora mismo, sin proxy ni balanceo de carga.
Gracias de nuevo!
El 10 de octubre de 2012 11:02, Iñaki Baz Castillo ibc@aliax.net escribió:
El 10 de octubre de 2012 10:15, Victor Torre Antunez < victor.torre@stoneworksolutions.net> escribió:
Gracias por la aclaración, porque es cierto que da dolor de cabeza mezclar
NAT y SIP ;)
He pegado la captura en pastebin: http://pastebin.com/Q5Y372PW
Si te fijas el ultimo ACK (linea 162) lo envia a IP_PRIVADA_ROUTER cuando en realidad deberia reenviarlo al Asterisk.
El problema es que Asterisk está respondiendo con un Contact así (línea 104):
Contact: sip:931111111@IP_PUBLICA_ROUTER:5060
por lo que el ACK tendrá en el Request-URI esa IP (IP_PUBLICA_ROUTER:5060) y por lo tanto Kamailio lo rutará a IP_PUBLICA_ROUTER:5060.
Haz que Asterisk ponga su IP privada en el Contact (parámetro externip de sip.conf donde has metido a machete la IP pública de tu router, quita esa opción).
-- Iñaki Baz Castillo ibc@aliax.net
SR-Users-ES mailing list SR-Users-ES@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users-es
El 10 de octubre de 2012 12:46, Victor Torre Antunez < victor.torre@stoneworksolutions.net> escribió:
Con esa modificación la señalización se soluciona, pero aparece un problema en el audio.
A nivel SDP aparece la IP_PRIVADA_ASTERISK, con lo que el proveedor manda el audio a esa ip privada. Sin embargo el audio en el otro sentido (asterisk->proveedor) funciona correctamente.
Ejecuta fix_contact() en Kamailio cuando proceses un INVITE o un 200 OK (a un INVITE) desde Asterisk, de tal forma que sustituya la IP del Contact por la IP privada desde la que se recibe el INVITE o el 200, y entonces deja el externip puesto con la IP pública.
No obstante, me extraña que vuestro proveedor SIP no haga "fix NAT" en el lado server...
¿Es posible decir a Asterisk que escriba en el SDP de la IP_PRIVADA_ROUTER sin cambiar la directiva "externip"? ¿Es necesario un RTP Proxy?
Puede que en 1.8 sea posible, ni idea, nos metemos ya demasiado en temas de Asterisk y aquí no procede ;)
Muchas gracias, he estado probando y parece que funciona !
Por cierto sin hacer fix_contact() y poniendo la directiva: "media_address" en Asterisk con la IP publica y sin "externip" tambien funciona.
Un saludo.
El 10 de octubre de 2012 13:26, Iñaki Baz Castillo ibc@aliax.net escribió:
El 10 de octubre de 2012 12:46, Victor Torre Antunez < victor.torre@stoneworksolutions.net> escribió:
Con esa modificación la señalización se soluciona, pero aparece un problema en el audio.
A nivel SDP aparece la IP_PRIVADA_ASTERISK, con lo que el proveedor manda el audio a esa ip privada. Sin embargo el audio en el otro sentido (asterisk->proveedor) funciona correctamente.
Ejecuta fix_contact() en Kamailio cuando proceses un INVITE o un 200 OK (a un INVITE) desde Asterisk, de tal forma que sustituya la IP del Contact por la IP privada desde la que se recibe el INVITE o el 200, y entonces deja el externip puesto con la IP pública.
No obstante, me extraña que vuestro proveedor SIP no haga "fix NAT" en el lado server...
¿Es posible decir a Asterisk que escriba en el SDP de la IP_PRIVADA_ROUTER sin cambiar la directiva "externip"? ¿Es necesario un RTP Proxy?
Puede que en 1.8 sea posible, ni idea, nos metemos ya demasiado en temas de Asterisk y aquí no procede ;)
-- Iñaki Baz Castillo ibc@aliax.net
SR-Users-ES mailing list SR-Users-ES@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users-es
sr-users-es@lists.kamailio.org