VLAN s en PfSense 1.2 y 3Com 2924-SFP Plus. Configurando teléfonos IP Cisco. Parte 2.
En esta segunda parte vamos a ver como hacer funcionar teléfonos IP Cisco 7906G con nuestro servidor Elastix. Parte del artículo podría estar desfasado por la nueva tendencia de Cisco a fabricar terminales con soporte SIP completo y que ya no requieren de provisionamiento por TFTP.
Configurando el Switch.
Como vimos en el artículo anterior, en nuestro switch vamos a definir suficientes puertos pertenecientes a la VLAN de VoIP como para conectar los teléfonos IP y el servidor Asterisk. Este podría ser un ejemplo visual:
El puerto 11 tiene conectado el servidor, y del 13 al 19 tenemos conectados los teléfonos IP. El 24 está tagged y es el que se conecta al PFSense.
Configurando PFSense.
Sencillamente debemos crear una VLAN con el mismo ID que en el switch, en este caso el 7. Después de crear la VLAN veremos que aparece como si de una interfaz física se tratase. El siguiente paso consiste en definir las reglas que queramos para esta nueva red. Podemos restringir al máximo permitiendo tan solo tráfico hacia Internet desde la IP del Asterisk, en caso de tener un proveedor IP y de no querer usar softphones, ya que de esta manera sólo los teléfonos IP “verían” el Asterisk. Esto es a gusto de cada uno y dependiendo de su nivel de paranoia.
Cisco y Asterisk.
Existen varias webs donde podemos encontrar información acerca de como conectar equipos Cisco a nuestro servidor Asterisk, pero en pocas nos dan una explicación completa o global de como mezclar estos dos mundos. Para hacer entender este asunto a lo que vienen de nuevas intentaré resumirlo lo máximo posible de manera realista:
Mundo Cisco:
- Trabaja por defecto con su protocolo SCCP (Skinny Client Control Protocol), aunque soporta SIP (pagando claro).
- Soporta los códecs más conocidos, pero cerrados, como alaw, ulaw, g729… (porque has pagado).
- Usa hardware propietario para conectar a la PSTN, RDSI… (evidentemente tendrás que pagar un plus para esto).
- Se lleva bien con entornos Windows Active Directory (que baratos no son).
- Cualquier soporte que necesites es aconsejable que lo recibas de Técnicos y Administradores Cisco Certificados (prepara la chequera).
- Te ha costado una pasta y te has casado con ellos, pero es que hay que reconocer son los mejores en lo suyo.
Mundo Asterisk:
- Trabaja con prácticamente cualquier protocolo que tenga una versión abierta. Yo lo he usado con SIP, IAX2, H323, incluso con SCCP.
- Soporta los codecs cerrados más conocidos pero también otros tantos libres que funcionan de maravilla como iLBC.
- Puede funcionar con un amplísimo abanico de hardware que va desde tarjetas FXO de 20€ o BRI de 40€ hasta carísimos interfaces PRI o GSM de gama alta.
- Se lleva bien con casi todo que cumpla los estándares, ya sea Linux, Windows o Mac.
- Siempre que necesites ayuda puedes acudir a técnicos certificados por Digium o darte una vuelta por los miles de foros, blogs y listas de correo que ayudan a la gente desinteresadamente.
- No te has gastado mucho dinero, pero seguro que vas a invertir gran cantidad de tiempo y esfuerzo en poner en marcha tu sistema si empiezas desde cero.
Lo que intento en mis proyectos es conocer cuanto puedo de ambos mundos y fusionar lo mejor de cada uno. Me pasa como a Joey, el de Friends. Cuando le preguntan sobre si prefiere el sexo o la comida, el pobre tiene un cortocircuito mental y grita… ¡PAN CON CHICAS! No hay porqué montar un entorno 100% open source o propietario, hay que aprovechar lo mejor de cada mundo. Yo me quedo con el servidor Asterisk y con los teléfonos Cisco.
El entorno de nuestro sistema requiere los siguientes componentes:
- Servicio TFTP (en el servidor Asterisk). Los teléfonos son “tontos”. Cualquier configuración o archivo que necesiten lo pedirán “bajo demanda” a sus servidores TFTP. Viene activado y listo para funcionar en Elastix.
- Servicio DCHP (en el servidor Asterisk). El DHCP del PFSense parece que no se lleva muy bien con los teléfonos Cisco. Yo he conseguido mejores resultados configurando a mano el dhcpd3 que viene por defecto en Elastix y que además tiene gestión web.
Eligiendo protocolo: SIP o SCCP.
A la hora de conectar los teléfonos Cisco a nuestro Asterisk tenemos que tomar una decisión: SIP o SCCP. Ambos funcionan bien, pero SIP es un estándar y SCCP requiere configuración manual extra, por lo que la primera opción gana bastante puntos. Si queremos cargar el firmware SIP en un terminal Cisco tendremos que hacernos con el paquete de software necesario. Esto se puede hacer descargándolo de la web de Cisco (si tenemos cuenta autorizada para ello) o por otros medios. Existen algunas webs desde donde podremos descargar este software sin mucho esfuerzo, tan solo hay que buscar el nombre del archivo.
Elegir SCCP puede ser una opción en algunos casos. Asterisk viene con un canal llamado chan_skinny cuya configuración reside en /etc/asterisk/skinny.conf. También existe un canal más completo y con buena fama llamado chan_sccp, pero no he tenido el gusto de ponerlo en marcha.
Entendiendo el Servicio de Provisionamiento.
Una vez solventado este asunto, lo que vamos a hacer es replicar en nuestro servidor Asterisk todos los servicios que nos interesan de un Call Manager y que usan estándares. Los teléfonos Cisco funciona básicamente con plantillas XML y descargando archivos por TFTP, lo cuál no es nada raro y puede ser montado en cualquier equipo. Por ejemplo, cuando nuestro teléfono IP quiere consultar los sonidos de llamada disponibles, pide a su servidor TFTP un listado XML que tiene un nombre por defecto donde está la lista de sonidos. Lo mismo hace cuando queremos cambiar la imagen de fondo o consultamos la agenda.
El proceso de arranque de un teléfono IP consiste en solicitar IP y dirección de servidor TFTP por defecto a través de DHCP. A partir de este momento pedirá a ese servidor de TFTP todo lo necesario para funcionar.
Montando el Entorno.
Puedes arrancar el servicio DHCPD desde la web del Elastix, pero para añadir el parámetro de servidor TFTP deberás editar a mano el archivo /etc/dhcpd.conf e introducir la siguiente línea
next-server 1.1.1.1; #IP SERVIDOR TFT
La carpeta donde colocaremos los archivos que pedirán los teléfono es /tftpboot, situada en la raíz del servidor Elastix. En el caso de los archivos de provisionamiento tenemos dos opciones, usar un artchivo por defecto relativo a todos los terminales del mismo modelo, o especificar por MAC. Por ejemplo, si queremos que todos los teléfonos de un departamento usen SIP y todos los demás utilicen SCCP, crearemos un archivo de provisionamiento por defecto con la versión SCCP y a parte haremos archivos específicos para cada MAC de los de este departamento concretando el uso del firmware SIP. Este tipo de configuraciones tan solo las comento para que quede constancia de que son posibles de realizar, pero no me voy a extender más ya que no es el caso del ejemplo. Los archivos comunes a todos los terminales como ringtones o imágenes de background usan rutas estándar, solo diferenciadas en el caso de los archivos de background por carpetas con nombres definidos por el tamaño en píxeles.
Para las imágenes de background deberemos crear las carpetas:
/tftpboot/Desktops/95×34x1 (teléfonos con LCD pequeña monocromo)
/tftpboot/Desktops/320×212x12 (teléfonos con LCD grande en color)
El listado de imágenes disponibles (List.xml) debe residir en cada uno de estos directorios, conteniendo en su estructura los nombres de las imágenes y sus thumbnails:
<CiscoIPPhoneImageList> <Image Item Image="TFTP:Desktops/320x212x12/thumb-imagen01.png" URL="TFTP:Desktops/320x212x12/imagen01.png"/> </CiscoIPPhoneImageList>
Los thumbnails tienen un tamaño inferior en proporción 4 a 1.
En el caso de los sonidos de llamada la estructura es:
/tftpboot/ringlist.xml (común para todos los terminales)
Con la siguiente sintaxis:
<CiscoIPPhoneRingList> <Ring> <DisplayName>Analog 1</DisplayName> <FileName>Analog1.raw</FileName> </Ring> </CiscoIPPhoneRingList>
Las especificaciones de los archivos de sonido son:
Raw PCM
- 8000 samples por segundo.
- 8 bits por sample.
- Compresión uLaw.
- Tamaño máximo — 16080 samples.
- Tamaño mínimo — 240 samples.
Otro archivo necesario que reside en la raíz del TFTP es el dialplan.xml. Define los tiempos de espera para diferentes longitudes de numeración, entre otras cosas. Este es un ejemplo que funciona:
<dialtemplate> <template match="..." timeout="1" user="Phone"><!-- Llamadas de servicios -->
</template>
<template match="...." timeout="0" user="Phone"> <!-- Llamadas internas -->
</template>
<template match="0........." timeout="1" user="Phone"> <!-- Llamadas nacionales -->
</template>
<template match="000*" timeout="3" user="Phone"> <!-- Llamadas internacionales -->
</template>
</dialtemplate>
Existen otros muchos servicios que podemos replicar en nuestro entorno, como la agenda o un servicio de avisos automáticos. Dada la extensión que está tomando este artículo lo dejaré para otros más específicos.
Cargando Firmware SIP.
Para modificar el firmware por uno SIP, deberemos colocar el contenido del zip que distribuye Cisco en la raíz del servidor tftp. Por ejemplo, la versión 8-3-1 de los terminales 7906G/7911S (utilizan el mismo firmware) se compone de los siguientes ficheros:
- apps11.8-3-0-50.sbn
- cnu11.8-3-0-50.sbn
- cvm11sip.8-3-0-50.sbn
- dsp11.8-3-0-50.sbn
- jar11sip.8-3-0-50.sbn
- SIP11.8-3-1S.loads
- term06.default.loads
- term11.default.loads
Si tecleamos la secuencia de actualización en los teléfonos IP, éstos se reiniciarán, pedirán IP y dirección del TFTP por DHCP y solicitarán:
- Archivo de firmware por defecto para su modelo (termXX.default.loads).
- Archivos incluidos en el archvo anterior (carga y posterior reinicio).
- Archivo de provisionamiento por defecto (no es necesario. Se llama SEPDefault.cnf.XML).
- Archivo de provisionamiento para su MAC (SEPMAC.cnf.XML).
- Archivo de plan de numeración (dialplan.xml).
La secuencia de actualización consiste en encender el teléfono con la tecla # pulsada. Se encenderá el led rojo de llamada, pero el teléfono no iniciará. A continuación deberemos pulasr la secuencia 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8 – 9 – * – 0 – #.
El archivo de provisionamiento de un terminal Cisco 7906G para firmware SIP tiene esta pinta (sacado de http://quetzalnet.es/index.php?id=1313):
<device xsi:type=”axl:XIPPhone” ctiid=”1566023366″>
<deviceprotocol>SIP</deviceprotocol> <!– Protocolo de conexión –>
<sshuserid>usuario</sshuserid> <!– Usuario y contraseña para acceder al teléfono vía SSH –>
<sshpassword>mipassword</sshpassword>
<devicepool>
<datetimesetting>
<datetemplate>D-M-YA</datetemplate> <!– Formato de la fecha –>
<timezone>UTC Standard/Daylight Time</timezone> <!– Zona horaria –>
</datetimesetting>
<callmanagergroup>
<members>
<member priority=”0″>
<callmanager>
<ports>
<ethernetphoneport>2000</ethernetphoneport>
<sipport>5060</sipport> <!– Puerto de comunicación del servidor –>
<securedsipport>5061</securedsipport></ports>
<processnodename>Asterisk</processnodename> <!– Nombre del servidor –>
</callmanager>
</member>
</members>
</callmanagergroup>
</devicepool>
<sipprofile>
<sipproxies>
<backupproxy>dirección_IP_servidor</backupproxy> <!– IMPORTANTE!!! –>
<backupproxyport>puerto_de_comunicación</backupproxyport> <!– Por defecto el 5060 –>
<registerwithproxy>true</registerwithproxy>
</sipproxies>
<sipcallfeatures>
<cnfjoinenabled>true</cnfjoinenabled>
<callforwarduri>x–serviceuri-cfwdall</callforwarduri>
<callpickupuri>x-cisco-serviceuri-pickup</callpickupuri>
<callpickuplisturi>x-cisco-serviceuri-opickup</callpickuplisturi>
<callpickupgroupuri>x-cisco-serviceuri-gpickup</callpickupgroupuri>
<meetmeserviceuri>x-cisco-serviceuri-meetme</meetmeserviceuri>
<abbreviateddialuri>x-cisco-serviceuri-abbrdial</abbreviateddialuri>
<rfc2543hold>false</rfc2543hold>
<callholdringback>2</callholdringback>
<localcfwdenable>true</localcfwdenable>
<semiattendedtransfer>true</semiattendedtransfer>
<anonymouscallblock>2</anonymouscallblock>
<calleridblocking>2</calleridblocking>
<dndcontrol>0</dndcontrol>
<remoteccenable>true</remoteccenable>
</sipcallfeatures>
<sipstack>
<sipinviteretx>6</sipinviteretx>
<sipretx>10</sipretx>
<timerinviteexpires>180</timerinviteexpires>
<timerregisterexpires>3600</timerregisterexpires>
<timerregisterdelta>5</timerregisterdelta>
<timerkeepaliveexpires>120</timerkeepaliveexpires>
<timersubscribeexpires>120</timersubscribeexpires>
<timersubscribedelta>5</timersubscribedelta>
<timert1>500</timert1>
<timert2>4000</timert2>
<maxredirects>70</maxredirects>
<remotepartyid>false</remotepartyid>
<userinfo>None</userinfo>
</sipstack>
<autoanswertimer>1</autoanswertimer>
<autoansweraltbehavior>false</autoansweraltbehavior>
<autoansweroverride>true</autoansweroverride>
<transferonhookenabled>false</transferonhookenabled>
<enablevad>false</enablevad>
<preferredcodec>g729a</preferredcodec> <!– Codecs preferidos –>
<dtmfavtpayload>101</dtmfavtpayload>
<dtmfdblevel>3</dtmfdblevel>
<dtmfoutofband>avt</dtmfoutofband>
<alwaysuseprimeline>false</alwaysuseprimeline>
<alwaysuseprimelinevoicemail>false</alwaysuseprimelinevoicemail>
<kpml>3</kpml>
<phonelabel>Etiqueta_del_telefono</phonelabel> <!– Texto de la esquina superior derecha –>
<startmediaport>10000</startmediaport> <!– Puertos de comunicación RTP, IMPORTANTE –>
<stopmediaport>20000</stopmediaport>
<siplines> <!– Dentro de este apartado configuraremos nuestras lineas SIP –>
<line button=”1″>
<featureid>9</featureid>
<featurelabel>200</featurelabel>
<proxy>dirección_IP_servidor_asterisk</proxy> <!– IMPORTANTE!!! –>
<port>puerto_comunicacion_servidor</port> <!– IMPORTANTE!!! –>
<name>nombre_usuario_SIP</name> <!– IMPORTANTE!!! –>
<displayname>nombre_usuario</displayname> <!– Para el Caller ID –>
<autoanswer>
<autoanswerenabled>2</autoanswerenabled>
</autoanswer>
<callwaiting>3</callwaiting>
<authname>nombre_usuario_SIP</authname> <!– Nombre del usuario de nuevo SIP –>
<authpassword>contraseña_usuario_SIP</authpassword> <!– Contraseña del usuario SIP –>
<sharedline>false</sharedline>
<messagewaitinglamppolicy>1</messagewaitinglamppolicy>
<messagesnumber>extensión_voicemail</messagesnumber> <!–nº de acceso a voicemail –>
<ringsettingidle>4</ringsettingidle>
<ringsettingactive>5</ringsettingactive>
<contact>nombre_usuario</contact> <!– Nombre del usuario de nuevo –>
<forwardcallinfodisplay>
<callername>true</callername>
<callernumber>false</callernumber>
<redirectednumber>false</redirectednumber>
<dialednumber>true</dialednumber>
</forwardcallinfodisplay></line>
</siplines>
<voipcontrolport>5060</voipcontrolport> <!– IMPORTANTE –>
<dscpforaudio>184</dscpforaudio>
<ringsettingbusystationpolicy>0</ringsettingbusystationpolicy>
<dialtemplate>dialplan.xml</dialtemplate> <!– IMPORTANTE !!!–>
</sipprofile>
<commonprofile>
<backgroundimageaccess>true</backgroundimageaccess>
<calllogblfenabled>2</calllogblfenabled>
</commonprofile>
<vendorconfig>
<disablespeaker>false</disablespeaker>
<disablespeakerandheadset>false</disablespeakerandheadset>
<pcport>0</pcport> <!– IMPORTANTE!!! Si es 0 el puerto habilitado si es 1 deshabilitado–>
<settingsaccess>1</settingsaccess>
<webaccess>1</webaccess> <!– IMPORTANTE!!! –>
<spantopcport>1</spantopcport>
<loggingdisplay>1</loggingdisplay>
</vendorconfig>
<transportlayerprotocol>4</transportlayerprotocol>
<capfauthmode>0</capfauthmode>
<capflist>
<capf>
<phoneport>3804</phoneport>
</capf>
</capflist>
<encrconfig>false</encrconfig>
</device>
Tan solo hay que completarlo con la configuración específica de cada uno y ponerle como nombre SEPmac.cnf.xml.
Creando las extensiones en FreePBX.
El siguiente paso consiste en dar de alta las extensiones que necesitemos en nuestro servidor Asterisk. Este proceso no tiene ningún secreto. Crearemos extensiones SIP dándoles un número y una contraseña y pondremos el soporte nat en no. Todo lo demás es opcional a gusto del usuario.









