Perdonad si la pregunta no es exactamente de kamailio....
Tengo un kamailio en ha con heartbeat. Kamailio escucha en sendas ips virtuales de una red privada y una pública. No escucha en las ips reales porque el servicio de kamailio y las ips virtuales se balancean.
El problema viene cuando tengo que hacer el t_relay. Kamailio intenta mandar el paquete desde la ip real en vez de la virtual y el tm me dice que ni hablar.
Entre los resources de kamailio he encontrado uno llamado IPsrcaddr que permite poner la ip de origen en las rutas del host de tal forma que me soluciona la papeleta al setear la ip virtual como dirección de origen.
Lo malo es que este haresource sólo me permite setear la ip de origen en la ruta por defecto. Parece que internamente hace un "ip route add 0.0.0.0/0 src ip_como_paramentro". Esto es, no me permite hacer lo mismo con la ip virtual interna.
¿Alguien conoce un haresource o una forma elegante de hacer esto? Estoy haciendo mi propio script de haresource para soucionarlo, pero no sé si es la mejor solución.
El día 27 de abril de 2010 11:47, Jon Bonilla manwe@aholab.ehu.es escribió:
El problema viene cuando tengo que hacer el t_relay. Kamailio intenta mandar el paquete desde la ip real en vez de la virtual y el tm me dice que ni hablar.
Si en "listen" pones *sólo* las IP's virtuales en las que escucha Kamailio nunca se intentará usar una IP real ni ninguna otra que no esté en el listen. Así de fácil.
Por defecto Kamailio usará como interfaz de salida el *mismo* que en el que se recibió el request, salvo que lo fuerces con "force_socket()" en el script (o algo así, no recuerdo el nombre de la función). También cambia en el caso de que sea un request a un usuario registrado (tras hacer el lockup()) en cuyo caso se envía el request por el socket desde el que se registró el usuario destino.
El Tue, 27 Apr 2010 13:25:42 +0200 Iñaki Baz Castillo ibc@aliax.net escribió:
El día 27 de abril de 2010 11:47, Jon Bonilla manwe@aholab.ehu.es escribió:
El problema viene cuando tengo que hacer el t_relay. Kamailio intenta mandar el paquete desde la ip real en vez de la virtual y el tm me dice que ni hablar.
Si en "listen" pones *sólo* las IP's virtuales en las que escucha Kamailio nunca se intentará usar una IP real ni ninguna otra que no esté en el listen. Así de fácil.
Por defecto Kamailio usará como interfaz de salida el *mismo* que en el que se recibió el request, salvo que lo fuerces con "force_socket()" en el script (o algo así, no recuerdo el nombre de la función). También cambia en el caso de que sea un request a un usuario registrado (tras hacer el lockup()) en cuyo caso se envía el request por el socket desde el que se registró el usuario destino.
He hecho algunas pruebas:
Mi kamailio:
eth0: 89.0.0.20 (real) eth0:0 192.168.0.13 (real) eth0:1 89.0.0.19 (virtual) eth0:2 192.168.0.12 (virtual)
Escuchando únicamente localhost y las virtuales: listen=udp:89.0.0.19:5060 listen=udp:192.168.0.12:5060 listen=udp:127.0.0.1:5060
1: Llamada desde un usuario por la ip pública virtual a otro usuario registrado en la ip pública virtual. Funciona. Como dices, parece que tras el lookup escoge el socket correcto.
2: Llamada desde un usuario por la ip pública virtual a un gw de internet con ip 77.77.77.115: No funciona. El tm me dice:
ERROR: <core> [forward.c:148]: ERROR: get_out_socket: no socket found ERROR: tm [ut.h:324]: no corresponding socket for af 2 ERROR: tm [t_fwd.c:417]: ERROR: can't fwd to af 2, proto 1 (no corresponding listening socket) ERROR: tm [t_fwd.c:1385]: ERROR: t_forward_nonack: failure to add branches
3: Seteo la ip de origen mediante el comando "ip route" a ser la ip vitual Vuelvo a probar el caso 2 con este cambio: Funciona correctamente.
4: llamada de un usuario por la ip pública virtual a un gw de la red interna 192.168.0.10. Falla igual que en el caso 2.
ERROR: <core> [forward.c:148]: ERROR: get_out_socket: no socket found ERROR: tm [ut.h:324]: no corresponding socket for af 2 ERROR: tm [t_fwd.c:417]: ERROR: can't fwd to af 2, proto 1 (no corresponding listening socket) ERROR: tm [t_fwd.c:1385]: ERROR: t_forward_nonack: failure to add branches
5: Seteo en las rutas hacia 192.168.0.0/24 el src addr 192.168.0.12 (la virtual) y repito la prueba del caso 4. Funciona correctamente.
Respecto a la elección del socket de kamailio en el caso de varias redes, tengo puesto en el kamailio.cfg mhomed=1 que creo que servía para que kamailio escogiera la iface más adecuada en cada caso.
He buscado por force_socket y lo único que he visto es una función de nathelper para forzar el proxy de comunicación con rtpproxy.
El día 27 de abril de 2010 15:55, Jon Bonilla manwe@aholab.ehu.es escribió:
Respecto a la elección del socket de kamailio en el caso de varias redes, tengo puesto en el kamailio.cfg mhomed=1 que creo que servía para que kamailio escogiera la iface más adecuada en cada caso.
Nunca he usado mhomed=1. Lo que hace es que Kamailio escoja el interfaz adecuado en función de la IP destino. Tal vez en este caso hace una consulta a las rutas IP del sistema y obtiene el interfaz/IP asignado a cada ruta destino, lo intenta setear y falla puesto que kamailio no escucha en dicha IP. Es posible que el workaround de fijar la IP origen para cada ruta sea la solución, no lo sé, ya te digo que podría ser tema del mhomed=1 (apuesto lo que sea). Tiene sentido puesto que en modo normal (mhomed=0) kamailio no intenta averiguar el interfaz de salida sino que lo saca, por defecto, por el mismo interfaz de llegada (salvo casos de usuarios registrados por otro socket y cosas así).
He buscado por force_socket y lo único que he visto es una función de nathelper para forzar el proxy de comunicación con rtpproxy.
http://www.kamailio.org/dokuwiki/doku.php/core-cookbook:1.5.x#force_send_soc...
El Tue, 27 Apr 2010 15:58:51 +0200 Iñaki Baz Castillo ibc@aliax.net escribió:
El día 27 de abril de 2010 15:55, Jon Bonilla manwe@aholab.ehu.es escribió:
Respecto a la elección del socket de kamailio en el caso de varias redes, tengo puesto en el kamailio.cfg mhomed=1 que creo que servía para que kamailio escogiera la iface más adecuada en cada caso.
Nunca he usado mhomed=1. Lo que hace es que Kamailio escoja el interfaz adecuado en función de la IP destino. Tal vez en este caso hace una consulta a las rutas IP del sistema y obtiene el interfaz/IP asignado a cada ruta destino, lo intenta setear y falla puesto que kamailio no escucha en dicha IP. Es posible que el workaround de fijar la IP origen para cada ruta sea la solución, no lo sé, ya te digo que podría ser tema del mhomed=1 (apuesto lo que sea). Tiene sentido puesto que en modo normal (mhomed=0) kamailio no intenta averiguar el interfaz de salida sino que lo saca, por defecto, por el mismo interfaz de llegada (salvo casos de usuarios registrados por otro socket y cosas así).
Sí, estoy convencido de que no habría problema con mandar por la ip virtual sin el mhomed. De hecho ya tengo otra instalación de pruebas funcionando de esa manera. Lo que pasa es que esa instalación sólo escucha la ip pública, no tiene que mandar requests de una red a otra.
En este caso no poner mhomed creo que es inviable porque no podría mandar paquetes de una red a la otra.
He buscado por force_socket y lo único que he visto es una función de nathelper para forzar el proxy de comunicación con rtpproxy.
http://www.kamailio.org/dokuwiki/doku.php/core-cookbook:1.5.x#force_send_soc...
Sí, lo había visto justo un minuto después de contestarte. He mandado otro correo. Creo que no me sirve ya que he de mandar por dos sockets distintos en función del destino de la llamada.
Creo que me veo abocado a crearme un script en haresources que me setee la ip src addr de ambas redes. Lo malo es que el haresource que ya existe sólo lo permite en la ruta por defecto. :(
Gracias!
El Tue, 27 Apr 2010 13:25:42 +0200 Iñaki Baz Castillo ibc@aliax.net escribió:
Por defecto Kamailio usará como interfaz de salida el *mismo* que en el que se recibió el request, salvo que lo fuerces con "force_socket()" en el script (o algo así, no recuerdo el nombre de la función).
Nota: He encontrado lo de forzar el socket:
force_send_socket()
Lo que pasa es que en este caso no me sirve ya que sería para mandar siempre por un mismo socket y no es el caso, ya que tengo dos redes en las que escuchar.
sr-users-es@lists.kamailio.org