Asterisk y el maldito SIP NAT
Después de muchos dolores de cabeza por fin he conseguido hacer funcionar una centralita Asterisk con algunos problemas de enrutamiento. Es sabido que SIP da problemas cuando las terminales se encuentran detrás de un router o firewall, debido a que las cabeceras de los paquetes incluyen la dirección original de la petición, con lo cual el servidor no sabe como enrutar las respuestas. Existen varias soluciones según el mapa de la instalación, que comunmente cuenta con un servidor conectado directamente a Internet y varas terminales enrutadas por el firewall/router de una oficina.
En este caso, el mapa consta de dos oficinas cuyos dispositivos están enrutados por firewalls con Netfilter. La oficina B hospeda el servidor Asterisk y varias terminales SIP. La oficina A hospeda sólamente terminales. De momento las terminales son ordenadores con SJphone o Twinkle, pero ahora vamos a sustituirlos por hardphones. Los firewalls están a su vez enrutados por los routers ADSL correspondientes, configurados en modo DMZ (NAT de todos los puertos, que no es lo mismo que un Bridge). Así, las terminales de la oficina B no tienen problemas para registrarse contra el servidor ni para establecer llamadas entre ellos. El problema lo tienen las terminales de la oficina A, que deben pasar 4 NAT’s antes de registrarse o hablar con el destino.
Aquí el mapa:

[general] context=from-sip bindport=5060 bindaddr=0.0.0.0 srvlookup=yes disallow=all allow=gsm allow=ulaw allow=ilbc language=es nat=yes insecure=very relaxdtmf=yes dtmfmode=info externip=111.222.333.444 localnet=192.168.2.0/255.255.255.0
El campo externip es la IP externa del router que hospeda el Asterisk (el de la oficina B). EL campo localnet es la red interna de la oficina, a la que está conectado el servidor.
En el fichero rtp.conf, especifico el rango de puertos que se usará para la transmisión de audio:
[general] rtpstart=7000 rtpend=20000
Instalo siproxd en la oficina A, y siguiendo la docu especifico los parametros necesarios en la configuración (/etc/siproxd.conf):
if_inbound = eth1 if_outbound = eth0 hosts_allow_reg = 192.168.1.0/24 sip_listen_port = 5060 daemonize = 1 silence_log = 1 log_calls = 1 user = siproxd registration_file = /var/lib/siproxd/siproxd_registrations pid_file = /var/run/siproxd/siproxd.pid rtp_proxy_enable = 1 rtp_port_low = 7000 rtp_port_high = 20000 rtp_timeout = 300 default_expires = 600 debug_level = 0 debug_port = 0
Lanzo siproxd habilitando el nivel 1 de debug:
siproxd -d -1
Añado al firewall de la oficina A (donde está el proxy) las reglas de iptables que redirigen las peticiones SIP a modo de proxy transparente. Es lo mismo que cuando se monta por ejemplo un proxy web transparente con Squid:
# Siproxd iptables -t nat -A PREROUTING -m udp -p udp -i eth1 --destination-port 5060:5082 -j REDIRECT iptables -A INPUT -m udp -p udp -i ppp0 --dport 5060:5082 -j ACCEPT iptables -A INPUT -m udp -p udp -i ppp0 --dport 7000:20000 -j ACCEPT
Y ya está. Las extensiones SIP las configuro como de costumbre:
[110] type=friend context=from-sip secret=xxx language=es username=110 host=dynamic reinvite=no canreinvite=no
Y en el dialplan no hay nada especial que especificar. Así funciona perfectamente, la receta la he encontrado dando vueltas por Asteriskguru, pero no me pregunteis dónde porque la verdad es que ya no recuerdo todo lo que he leído.
Por cierto, que todo esto lo he montado en Slackware, y he creado los paquetes TGZ para instalar Siproxd por si alguien los requiere. Están aquí:
libosip2-2.2.2-i686-1.tgz
siproxd-0.5.13-i686-1.tgz
Espero que a alguien pueda servirle. Desde luego a mí me ha traído de culo, y como las configuraciones cambian según el mapa de cada instalación es difícil encontrar una ayuda personalizada para solventarlo.
Ahora tengo que cambiar los softphones por hardphones, y espero no encontrarme ninguna sorpresa más. He pensado usar Grandstream BT101 para los terminales corrientes, y un GXP-2000 para la operadora, pero si a alguien se le ocurre un hardware más apropiado a un precio similar agradecería que me lo recomiende

Martes, 28 Noviembre 2006, a las 11:56 pm
Gracias hermano, por lo menos me das una luz más claro que yo no puedo poner un servidor proxy en cada punto de mis clientes, Sigo buscando como solucionar ese problemita!!! pero hay voy creo que esta guia ne da algo de por donde seguir!!
YEPS
Martes, 18 Diciembre 2007, a las 9:58 pm
Primero que todo muchas gracias por la información … y en segundo lugar aprovecho para hacerle una pregunta ….
Mi servidor asterisk se encuentra en la “sede A” detrás de un firewall que hace NAT a las peticiones que vengan por determinados puertos (10001-2000, 5060, 4569, 5060-5082) al servidor asterisk.
Mi firewall tiene la IP 172.24.1.1, mi servidor asterisk tiene las IP 172.24.1.3 - 125.123.1.97 y mis terminales SIP se encuentran en el segmento 125.123.1.X, y tambien tengo otras terminales SIP que se conectan desde afuera (usuarios de internet sin ningun firewall)
Lo que he logrado es lo siguiente:
- Al llamar desde mis terminales SIP internas (125.123.1.X) a las externas (las que se conectan desde internet) tengo audio y video de forma normal. - Las llamdas entre dos terminales internas funciona bien
- Las llamadas entre dos terminales externas bien.
Mi problema es el siguiente:
- Al llamar desde una terminar externa a una terminal interna recibo marcaciòn pero al recibir la llamada se pierde completamente la comunicaciòn.
Por su experiencia … cree usted que sea problemas de con el NAt y sea necesario instalar siproxy??
Caballero de antemano agradezco su atenciòn y le pido su ayuda …. soy un newbie en asterisk y llevo realmente 3 meses tratando de solucionar este problema sin encontrar solucion …. agradecería infinitamente su ayuda indicandome el posible caminio que pueda tomar.
Att:
Miguel Angel Moreno
Miércoles, 19 Diciembre 2007, a las 1:31 am
Iván, con tu permiso déjame probar suerte en contestar.
hola Miguel Angel… se me ocurre la posibilidad de que sea un problema de puertos RTP… SIP como su nombre indica es un Protocolo de Inicio de Sesion (Session Initation Protocol, en inglés). Todo lo referente a la transmisión de voz se realiza a través del protocolo RTP.
Consulta el fichero rtp.conf ahí deberías encontrar el rango de puerto que debes abrir (por defecto, del 10000 al 20000, si no recuerdo mal).
Ya nos dirás si era eso…
Miércoles, 19 Diciembre 2007, a las 1:31 pm
Hola Quetzal …
creo que cometí un error al digitar … los puertos en realidad son: 10001 - 20000 y estos están especificados en el “rtp.conf”:
rtpstart=10001
rtpend=20000
Así que no creo que ese sea el inconveniente
Miércoles, 19 Diciembre 2007, a las 2:46 pm
Hola Miguel Angel
Quetzal está en lo cierto. Tu problema es RTP.
Aunque siproxd suliciona algunos problemas de enrutamiento RTP, en tu caso no te solucionará nada.
Tu problema es tener 2 NIC’s en Asterisk. No entiendo por qué lo haces…. estás conectando unas terminales a una NIC y otras a otra. Por narices tienen que hacerse un lío para comunicarse…
Yo quitaría la 2a NIC, pondría el asterisk pinchado en el switch del backbone y conectaría las terminales internas al mismo switch con el mismo rango. Si configuras bien el router de salida para que haga forwarding del tráfico SIP y RTP, problema resuelto.
Salu2!
Iván
Miércoles, 19 Diciembre 2007, a las 8:17 pm
Miguel Angel,
Es dificil diagnosticar más profundamente sin tener algun archivo de log o traza de asterisk. Con los datos que nos das, lo que me parece más probable es lo de los puertos RTP…
Mirate este enlace http://www.voip-info.org/wiki-RTP
Y concrétamente mírate de donde habla de RTP y NAT…
Suerte!