Asterisk y el maldito SIP NAT

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

9 thoughts on “Asterisk y el maldito SIP NAT”

  1. 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

  2. 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

  3. 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…

  4. 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

  5. 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

  6. 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!

  7. Hola por favor ayudame!!!
    Resulta que yo tengo el caso de la oficina en la que se encuentra el servidor asterisk con los tlfs detras de un nat. Es decir yo tengo mis 2 pcs, incluyendo al servidor detras de un router TPLINK wr543g que tiene una ip publica y las ips tanto de las pcs como del servidor estan en el rango de 192.168.1.100-192.168.1.199.
    Ayudame indicandome como configuraste tu router o tu archivo sip.conf
    OJO: con ping si se alcanzan entre ellos

  8. Hola y mi problema es similiar,

    Tengo el elastix instalado en oficina A donde también se encuentra el troncal (sip trunking) que lo recibo por un interface Ethernet con un ip y Gateway independiente. este esta conectado en eth0. (186.200.30.x)

    Utilizo eth1 para la coneccion a la LAN. 192.168.2.x

    El problema esta que el servidor solo puede tener un Gateway configurado y cuando pongo el del SIP trunking funciona todo en la oficina A pero las remotas se caen.

    Si pongo el Gateway de la LAN entonces las remotas se conectan pero solo tengo comunicación de extensión a extensión.

    que debo de hacer exactamente

  9. Muy buenas tardes, primero que todo quiero felicitarlos por toda la interacción que han tenido con sus seguidores. Mi duda es la siguiente, desde hace una semana estoy intentando conectar un call center. Tengo un servidor elastiks-asterisk, tengo un Gateway Openvox para Sim y tengo un Gateway sangoma vega 50 para línea analógicas de 8 puertos FXO, lo que quisiera saber es como conectar, los dos Gateway y el servidor a una Red LAN y a mi router, ya que hasta los momentos mi servidor no ha reconocido estos dos Gateway.

Leave a Reply

Your email address will not be published.