Asterisk y el maldito SIP NAT
Septiembre 18th, 2006
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
Archivado en
