logo_rev.gifDespué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:

netmap011.png
Para conseguir hacerlo funcionar he necesitado un proxy SIP para la oficina A. He encontrado un par, pero Pof me habló de Siproxd y la verdad es que es sencillo de usar y la docu es muy buena.
Para la configuración de Asterisk, el fichero sip.conf necesita que se especifique el uso de NAT y las direcciones interna y externa que deben llevar las cabeceras:

[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 :)