<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gonzalo Marcote &#124; Open source, open mind</title>
	<atom:link href="http://www.gonzalomarcote.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gonzalomarcote.com</link>
	<description>Página personal</description>
	<lastBuildDate>Tue, 15 May 2012 10:22:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Convertir locuciones a los diferentes formatos de Asterisk</title>
		<link>http://www.gonzalomarcote.com/2012/convertir-locuciones-a-los-diferentes-formatos-de-asterisk/</link>
		<comments>http://www.gonzalomarcote.com/2012/convertir-locuciones-a-los-diferentes-formatos-de-asterisk/#comments</comments>
		<pubDate>Tue, 15 May 2012 09:47:52 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[voip]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=571</guid>
		<description><![CDATA[Una utilidad de Digium que está un poco escondida es este conversor que convierte a los formatos más usados en asterisk. Lo bueno es que incluye g729. http://www.digium.com/en/products/ivr/audio-converter.php Otras formas de convertir las locuciones es con la utilidad del propio CLI: rasterisk -x 'file convert /var/lib/asterisk/sounds/es/prueba.wav /var/lib/asterisk/sounds/es/prueba.gsm' O con el comando sox, lame y mpg123 [...]]]></description>
			<content:encoded><![CDATA[<p>Una utilidad de Digium que está un poco escondida es este conversor que convierte a los formatos más usados en asterisk. Lo bueno es que incluye g729.</p>
<p><a href="http://www.digium.com/en/products/ivr/audio-converter.php">http://www.digium.com/en/products/ivr/audio-converter.php</a></p>
<p>Otras formas de convertir las locuciones es con la utilidad del propio CLI:<br />
<code><br />
rasterisk -x 'file convert /var/lib/asterisk/sounds/es/prueba.wav /var/lib/asterisk/sounds/es/prueba.gsm'<br />
</code></p>
<p>O con el comando sox, lame y mpg123<br />
<code><br />
# apt-get install sox mpg123 lame</p>
<p>Convertir de mp3 a wav:<br />
# mpg123 -b 10000 -s sample.mp3 > sample.raw<br />
# sox -r 44100 -2 -s -c 2 sample.raw -r 8000 -c 2 sample.wav<br />
# rm sample.raw</p>
<p>Convertir de wav a mp3:<br />
# aptitude install lame<br />
# lame -h -m s -b 128 sample.wav sample.mp3</p>
<p>Convertir de wav a alaw:<br />
# sox entrada.wav -t raw -r 8000 -c 1 -b 8 -A salida.alaw</p>
<p>Convertir de wav a gsm:<br />
# sox entrada.wav -t gsm -r 8000 -c 1 -b salida.gsm</p>
<p>Convertir WAV a G.729:<br />
# sox entrada.wav -t raw -r 8000 -c 1 -b 8 -A salida.alaw &#038;&#038; asterisk -rx 'file convert salida.alaw salida.g729'<br />
(es necesario disponer de una licencia disponible en Asterisk de G.729 para poder convertir el archivo)</p>
<p>Convertir WAV a SLIN:<br />
# sox entrada.wav -t raw -r 8000 -c 1 -w -s salida.slin<br />
</code></p>
<p>Sin embargo como podéis ver, la más útil y simple es la herramienta online de Digium.<br />
De esta forma servimos las locuciones en el formato adecuado y evitamos sobrecargar la CPU al hacer transcoding.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2012/convertir-locuciones-a-los-diferentes-formatos-de-asterisk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalar un ndb cluster de mysql en Ubuntu</title>
		<link>http://www.gonzalomarcote.com/2011/instalar-un-ndb-cluster-de-mysql-en-ubuntu/</link>
		<comments>http://www.gonzalomarcote.com/2011/instalar-un-ndb-cluster-de-mysql-en-ubuntu/#comments</comments>
		<pubDate>Thu, 24 Nov 2011 09:59:49 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[clustering]]></category>
		<category><![CDATA[php/mysql]]></category>
		<category><![CDATA[sistemas]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=495</guid>
		<description><![CDATA[A medida que nuestros servicios crecen (buena señal ) veremos que uno de los primeros servicios con el que tenemos problemas de redimensionamiento es con las BBDD MySQL. A mucha gente no se le ocurre otra solución que poner más y más RAM y CPU&#8217;s. Aunque llega un momento que obviamente ya no podemos poner [...]]]></description>
			<content:encoded><![CDATA[<p>A medida que nuestros servicios crecen (buena señal <img src='http://www.gonzalomarcote.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ) veremos que uno de los primeros servicios con el que tenemos problemas de redimensionamiento es con las BBDD MySQL.<br />
A mucha gente no se le ocurre otra solución que poner más y más RAM y CPU&#8217;s. Aunque llega un momento que obviamente ya no podemos poner más.<br />
En estos casos la solución pasa por montar un cluster de MySQL, que nos permite redimensionar introduciendo nuevos nodos a medida que necesitamos más recursos.<br />
Este cluster obviamente también tiene sus limitaciones y llegados a un punto en el que también se nos quede corto y necesitemos una BBDD para mover un mounstruo tipo Facebook o algo muy grande, creo que ya os prodiais permitir pagar a un experto en el tema o simplemente no necesitaríais estar leyendo esto.</p>
<p>Para hacernos una idea de que va la cosa podemos empezar por leer:<br />
<a href="http://dev.mysql.com/doc/refman/5.0/es/ndbcluster.html" title="http://dev.mysql.com/doc/refman/5.0/es/ndbcluster.html" target="_blank">http://dev.mysql.com/doc/refman/5.0/es/ndbcluster.html</a><br />
y<br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication.html" title="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication.html</a></p>
<p>Como véis hay un MGM o Management node (que ejecuta el demonio &#8220;ndb_mgmd&#8221;) y los Nodos (ejecutando el servicio ndbd).<br />
Después de un tiempo leyendo y habiendo aprendido los conceptos generales, empezamos:<br />
<span id="more-495"></span></p>
<h3>Instalación MGM o Management node</h3>
<p>Para instalar el MGM en ubuntu, teóricamente tendría que ser tan fácil como hacer:<code><br />
# apt-get install mysql-server<br />
# apt-get install mysql-cluster-server<br />
</code></p>
<p>No obstante instalar el paquete &#8216;mysql-cluster-server&#8217; en Lucid 10.04 LTS3 (a día de hoy) es tarea de locos por temas de dependencias incumplidas.<br />
Si hacemos eso, al instalar mysql-cluster-server-5.1 nos sale este error:</p>
<pre>
dpkg: error al procesar /var/cache/apt/archives/mysql-cluster-client-5.1_7.0.9-1ubuntu7_amd64.deb (--unpack):
 intentando sobreescribir `/usr/bin/mysql', que está también en el paquete mysql-client-core-5.1 0:5.1.41-3ubuntu12.10
dpkg-deb: el subproceso copiado fue terminado por la señal (Tubería rota)
Seleccionando el paquete mysql-cluster-server-5.1 previamente no seleccionado.
Desempaquetando mysql-cluster-server-5.1 (de .../mysql-cluster-server-5.1_7.0.9-1ubuntu7_amd64.deb) ...
dpkg: error al procesar /var/cache/apt/archives/mysql-cluster-server-5.1_7.0.9-1ubuntu7_amd64.deb (--unpack):
 intentando sobreescribir `/usr/bin/my_print_defaults', que está también en el paquete mysql-server-core-5.1 0:5.1.41-3ubuntu12.10
dpkg-deb: el subproceso copiado fue terminado por la señal (Tubería rota)
Seleccionando el paquete ssl-cert previamente no seleccionado.
Desempaquetando ssl-cert (de .../ssl-cert_1.0.23ubuntu2_all.deb) ...
Seleccionando el paquete postfix previamente no seleccionado.
Desempaquetando postfix (de .../postfix_2.7.0-1ubuntu0.2_amd64.deb) ...
Seleccionando el paquete bsd-mailx previamente no seleccionado.
Desempaquetando bsd-mailx (de .../bsd-mailx_8.1.2-0.20090911cvs-2ubuntu1_amd64.deb) ...
Seleccionando el paquete mysql-cluster-client previamente no seleccionado.
Desempaquetando mysql-cluster-client (de .../mysql-cluster-client_7.0.9-1ubuntu7_all.deb) ...
Seleccionando el paquete mysql-cluster-server previamente no seleccionado.
Desempaquetando mysql-cluster-server (de .../mysql-cluster-server_7.0.9-1ubuntu7_all.deb) ...
Procesando disparadores para ureadahead ...
Se encontraron errores al procesar:
 /var/cache/apt/archives/mysql-cluster-client-5.1_7.0.9-1ubuntu7_amd64.deb
 /var/cache/apt/archives/mysql-cluster-server-5.1_7.0.9-1ubuntu7_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
</pre>
<p>&#8230;que no se soluciona ni con un &#8216;apt-get -f install&#8217; tal y como dice.<br />
No se porque sucede esto y si alguien sabe por que pasa o sabe solucionarlo mejor agradecería que me lo comentase <img src='http://www.gonzalomarcote.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
Como lo slucioné yo fue haciendo un: &#8216;dpkg -l mysql*&#8217; y &#8220;purgando&#8221; todos los paquetes relacionados con mysql instalados o a medio instalar:<code><br />
# apt-get purge mysql-client-core-5.1 mysql-cluster-client mysql-cluster-client-5.1 mysql-cluster-server mysql-cluster-server-5.1 mysql-common mysql-server-5.1 mysql-server-core-5.1 libmysqlclient16 libdbd-mysql-perl<br />
</code></p>
<p>Luego un:<code><br />
# apt-get autoremove<br />
</code></p>
<p>y ya finalmente nos deja instalarlo correctamente:<code><br />
# apt-get install mysql-cluster-server<br />
</code></p>
<p>Una vez instalado configuramos el MGM. Creamos el archivo /etc/mysql/ndb_mgmd.cnf y ponemos:</p>
<pre>
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=256M    # How much memory to allocate for data storage
IndexMemory=18M   # How much memory to allocate for index storage
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough for
# this example Cluster setup.
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Section for the cluster management node
[NDB_MGMD]
# IP address of the management node (this system)
HostName=192.168.2.210

# Section for the storage nodes
[NDBD]
# IP address of the first storage node
HostName=192.168.2.211
DataDir=/var/lib/mysql-cluster
BackupDataDir=/var/lib/mysql-cluster/backup
DataMemory=512M

[NDBD]
# IP address of the second storage node
HostName=192.168.2.212
DataDir=/var/lib/mysql-cluster
BackupDataDir=/var/lib/mysql-cluster/backup
DataMemory=512M

# one [MYSQLD] per storage node
[MYSQLD]
[MYSQLD]
</pre>
<p>Como véis definimos la ip del mgm (la 2.210) y la de los dos nodos que vamos a poner (2.211 y 2.212).</p>
<p>Creamos los dirs de los backups:<code><br />
# mkdir -p /var/lib/mysql-cluster/backup<br />
# chown -R mysql:mysql /var/lib/mysql-cluster<br />
</code></p>
<h3>Nodos</h3>
<p>Instalamos 2 máquinas virtuales mínimas para los 2 Nodos.<br />
Instalamos mysql-server con soporte ndb en cada uno de los nodos:<code><br />
# apt-get install mysql-server<br />
# apt-get install mysql-cluster-server<br />
</code></p>
<p>Si da el error de arriba de dependencias, ya sabéis&#8230;</p>
<p>Confuguramos los nodos. Editamos el archivo /etc/mysql/my.cnf de cada uno de ellos y añadimos:<br />
- En la sección [mysqld] añandimos:<code><br />
ndbcluster<br />
# IP address of the cluster management node<br />
ndb-connectstring=192.168.2.210<br />
</code></p>
<p>- Y al final del archivo añadimos:<code><br />
[MYSQL_CLUSTER]<br />
ndb-connectstring=192.168.2.210<br />
</code></p>
<h3>Iniciamos el cluster</h3>
<p>En el admin iniciamos el demonio ndb-mgmd:<code><br />
# /etc/init.d/mysql-ndb-mgm restart<br />
</code></p>
<p>En cada uno de los nodos el demonio ndbd:<code><br />
# /etc/init.d/mysql restart<br />
# /etc/init.d/mysql-ndb restart<br />
</code></p>
<h3>Comprobaciones</h3>
<p>Comprobamos que todo ha ido bien.<br />
En el manager &#8216;mgm&#8217; ejecutamos:<code><br />
# ndb_mgm<br />
</code></p>
<p>y en el prompt ejecutamos:<code><br />
ndb_mgm> show;<br />
</code></p>
<p>Tendríamos que ver que los dos nodos están conectados:</p>
<pre>
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @192.168.2.211  (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0, Master)
id=3    @192.168.2.212  (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @192.168.2.210  (mysql-5.1.39 ndb-7.0.9)

[mysqld(API)]   2 node(s)
id=4    @192.168.2.211  (mysql-5.1.39 ndb-7.0.9)
id=5    @192.168.2.212  (mysql-5.1.39 ndb-7.0.9)
</pre>
<h3>Probando el cluster</h3>
<p>Creamos una database por ejemplo en el nodo1:<br />
<code><br />
# mysqladmin -u username -p create mysqlclustertest<br />
</code></p>
<p>Hay que tener en cuenta que las tablas que se creen en la database han de ser creadas con el parámetro &#8216;ENGINE=NDBCLUSTER&#8217; para que puedan ser replicadas entre los nodos</p>
<pre>
mysql>
USE mysqlclustertest;
CREATE TABLE testtable (I INT) ENGINE=NDBCLUSTER;
INSERT INTO testtable () VALUES (1);
SELECT * FROM testtable;
quit;
</pre>
<p>Al momento si vamos al nodo2 y hacemos un show databases; veremos que ya está creada.</p>
<p>Ahora una prueba de fuego. Vamos al nodo1 y lo paramos:<code><br />
/etc/init.d/mysql-ndb stop<br />
</code></p>
<p>Si vamos a la consola del mgm y hacemos un show veremos que ese nodo está parado:</p>
<pre>
ndb_mgm> show;
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=2 (not connected, accepting connect from 192.168.2.211)
id=3	@192.168.2.212  (mysql-5.1.39 ndb-7.0.9, Nodegroup: 0, Master)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.2.210  (mysql-5.1.39 ndb-7.0.9)

[mysqld(API)]	2 node(s)
id=4	@192.168.2.211  (mysql-5.1.39 ndb-7.0.9)
id=5	@192.168.2.212  (mysql-5.1.39 ndb-7.0.9)
</pre>
<p>Ahora en el nodo dos si hacemos un:</p>
<pre>
mysql> SELECT * FROM testtable;
+------+
| I    |
+------+
|    1 |
+------+
1 rows in set (0.00 sec)
</pre>
<p>Veremos que la tabla sigue disponible aunque el primer nodo esté caído.<br />
Vamos a insertar un campo mas en el nodo2 con el uno caído:<code><br />
mysql> INSERT INTO testtable () VALUES (2);<br />
</code></p>
<p>Si volvemos a hacer una consulta:</p>
<pre>
mysql> SELECT * FROM testtable;
+------+
| I    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)
</pre>
<p>Ahora arrancamos el nodo1 de nuevo:<code><br />
# /etc/init.d/mysql-ndb start<br />
</code></p>
<p>&#8230;veremos que en la consola del mgm ya aparecerá como disponible y si hacemos una consulta veremos que ya están los datos replicados:</p>
<pre>
mysql> SELECT * FROM testtable;
+------+
| I    |
+------+
|    2 |
|    1 |
+------+
2 rows in set (0.00 sec)
</pre>
<h3>Apagando o reiniciando el cluster</h3>
<p>Para apagarlo en orden, en la consola del mgm ejecutamos:</p>
<pre>
ndb_mgm> shutdown;
Node 2: Cluster shutdown initiated
Node 3: Cluster shutdown initiated
Node 3: Node shutdown completed.
Node 2: Node shutdown completed.
2 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.
</pre>
<p>Y vemos como apaga el servicio ndb de los dos nodos. De echo si vamos a cada nodo y ejecutamos un:<code><br />
# ps aux | grep ndbd | grep -iv grep<br />
</code></p>
<p>&#8230;veremos que no hay ningún servicio corriendo. (Ojo, mysql si que sigue corriendo en cada nodo pero sin soporte &#8216;ndbcluster&#8217;).</p>
<p>Ahora ya podríamos hacer un shutdown de los nodos y del mgm.</p>
<p>La forma de reinicio de los servers, sería primero el mgm y luego ir iniciando los nodos</p>
<p>Si no hemos reinciiado las máquinas, para volver a conectar los nodos iniciamos primero en ndb-mgm en el mgm:<code><br />
# /etc/init.d/mysql-ndb-mgm start<br />
</code></p>
<p>Y luego los servicios ndb en cada nodo:<code><br />
# /etc/init.d/mysql-ndb start<br />
</code></p>
<p>Nuevamente con un show en el mgm comprobamos que todo ha ido bien y veulvan a estar conectados.</p>
<h3>Dimensionamiento</h3>
<p>Hay que leer la documentación para ver cuantos nodos podemos poner hasta que el sistema se degrade, ya que no podemos poner nodos infinitamente. Aunque repito que si esto os pasa seguramente es que no necesitéis leer esto.<br />
También hay que tener en cuenta que todos los datos de los nodos van sobre RAM, así que hace falta mucha RAM. Se puede aplicar esta ecuación:<code><br />
(SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes<br />
</code><br />
Así que si tienes una database de 1GB, necesitarás 1.1GB de RAM en cada nodo.</p>
<h3>Para acabar</h3>
<p>IMPORTANTE: Ojo, esta arquitectura es mínima. El LoadBalancer y el MGM son dos puntos de fallo crítico, así que estos servidores deberían de ir en HA con por ejemplo Heartbeat + Drdb y si cae alguno de los dos  se levante el secundario. Así que una instalación fiable de un cluster mysql sería como mínimo 6 máquinas (2xLoadBalancer + 2xMGM + 1xNodo + 1xNodo).</p>
<p>Y todo esto está muy bien, pero con esta arquitectura cada servicio tendría que atacar a cada nodo mysql por separado y estamos en las mismas. Así que nos quedaría configurar un LoadBalancer con una ip virtual a la que atacar desde nuestro servicio y este reparta las peticiones entre los nodos disponibles.</p>
<p>El Lodabalancer y heartbeat están explicados en otros posts, aunque siempre podéis contratar los servicios de consultoría de servidor, que vive de esto <img src='http://www.gonzalomarcote.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  &#8230;</p>
<p>Fuentes:<br />
<a href="http://dev.mysql.com/doc/refman/5.0/es/ndbcluster.html" title="http://dev.mysql.com/doc/refman/5.0/es/ndbcluster.html" target="_blank">http://dev.mysql.com/doc/refman/5.0/es/ndbcluster.html</a><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication.html" title="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication.html" target="_blank">http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-replication.html</a><br />
<a href="http://bieg.wordpress.com/2008/08/03/mysql-clustering-ubuntu/" title="http://bieg.wordpress.com/2008/08/03/mysql-clustering-ubuntu/" target="_blank">http://bieg.wordpress.com/2008/08/03/mysql-clustering-ubuntu/</a><br />
<a href="http://www.awven.com/q141-crear-un-cluster-mysql-ubuntu-server-1104/" title="http://www.awven.com/q141-crear-un-cluster-mysql-ubuntu-server-1104/" target="_blank">http://www.awven.com/q141-crear-un-cluster-mysql-ubuntu-server-1104/</a><br />
<a href="http://www.monkeedev.co.uk/blog/2009/04/01/setting-up-mysql-50-cluster-on-debian-and-ubuntu/" title="http://www.monkeedev.co.uk/blog/2009/04/01/setting-up-mysql-50-cluster-on-debian-and-ubuntu/" target="_blank">http://www.monkeedev.co.uk/blog/2009/04/01/setting-up-mysql-50-cluster-on-debian-and-ubuntu/</a><br />
<a href="http://www.howtoforge.com/loadbalanced_mysql_cluster_debian" title="http://www.howtoforge.com/loadbalanced_mysql_cluster_debian" target="_blank">http://www.howtoforge.com/loadbalanced_mysql_cluster_debian</a><br />
<a href="http://www.howtoforge.com/setting-up-a-loadbalanced-mysql-cluster-with-mysql5.1-p2" title="http://www.howtoforge.com/setting-up-a-loadbalanced-mysql-cluster-with-mysql5.1-p2" target="_blank">http://www.howtoforge.com/setting-up-a-loadbalanced-mysql-cluster-with-mysql5.1-p2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2011/instalar-un-ndb-cluster-de-mysql-en-ubuntu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Proteger Asterisk de ataques con fail2ban &#8211; Actualizado a 1.8</title>
		<link>http://www.gonzalomarcote.com/2011/proteger-asterisk-de-ataques-con-fail2ban/</link>
		<comments>http://www.gonzalomarcote.com/2011/proteger-asterisk-de-ataques-con-fail2ban/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 17:34:12 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[sistemas]]></category>
		<category><![CDATA[voip]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=482</guid>
		<description><![CDATA[Si tienes un Asterisk abierto hacia afuera por tener un troncal o extensiones SIP que se logueen desde fuera, estarás acostumbrado a recibir ataques de intentos de logueo por fuerza bruta de este tipo (casi siempre desde China): ... '"9994"' failed for 'XXX.XXX.XXX.XXX' - No matching peer found [Nov 10 15:51:37] NOTICE[2979]: chan_sip.c:XXXXX handle_request_register: Registration [...]]]></description>
			<content:encoded><![CDATA[<p>Si tienes un Asterisk abierto hacia afuera por tener un troncal o extensiones SIP que se logueen desde fuera, estarás acostumbrado a recibir ataques de intentos de logueo por fuerza bruta de este tipo (casi siempre desde China):</p>
<pre>
...
'"9994"<sip:9994@XXX.XXX.XXX.XXX>' failed for 'XXX.XXX.XXX.XXX' - No matching peer found
[Nov 10 15:51:37] NOTICE[2979]: chan_sip.c:XXXXX handle_request_register: Registration from '"9995"<sip:9995@XXX.XXX.XXX.XXX>' failed for 'XXX.XXX.XXX.XXX' - No matching peer found
[Nov 10 15:51:37] NOTICE[2979]: chan_sip.c:XXXXX handle_request_register: Registration from '"9996"<sip:9996@XXX.XXX.XXX.XXX>' failed for 'XXX.XXX.XXX.XXX' - No matching peer found
[Nov 10 15:51:37] NOTICE[2979]: chan_sip.c:XXXXX handle_request_register: Registration from '"9997"<sip:9997@XXX.XXX.XXX.XXX>' failed for 'XXX.XXX.XXX.XXX' - No matching peer found
[Nov 10 15:51:37] NOTICE[2979]: chan_sip.c:XXXXX handle_request_register: Registration from '"9998"<sip:9998@XXX.XXX.XXX.XXX>' failed for 'XXX.XXX.XXX.XXX' - No matching peer found
[Nov 10 15:51:37] NOTICE[2979]: chan_sip.c:XXXXX handle_request_register: Registration from '"9999"<sip:9999@XXX.XXX.XXX.XXX>' failed for 'XXX.XXX.XXX.XXX' - No matching peer found
[Nov 10 15:51:37] NOTICE[2979]: chan_sip.c:XXXXX handle_request_register: Registration from '"10000"<sip:10000@XXX.XXX.XXX.XXX>' failed for 'XXX.XXX.XXX.XXX' - No matching peer found
</pre>
<p>Es por eso que hay que tener cuidado de tener bien configurado el dialplan y las extensiones para no llevarte una sorpresita algún día de una factura de miles de euros.</p>
<p>Para prevenir estos ataques podemos usar fail2ban para que cuando detecte un cierto nº de registros erróneos banee esa ip.<br />
<span id="more-482"></span><br />
Instalmos fail2ban:<code><br />
# apt-get install fail2ban<br />
</code></p>
<p>Esto ya te instala iptables.<br />
Los archivos de config están en /etc/fail2ban<br />
Editamos /etc/fail2ban/jail.conf que es donde se definen los diferentes servicios que queremos banear y lo que queremos hacer en caso de que intenten atacar ese servicio. Podemos echar un vistazo al de ssh para crear el nuestro.<br />
Yo he definido al final uno tal que así:</p>
<pre>
# Asterisk
[asterisk-iptables]
enabled  = true
filter   = asterisk
action   = iptables-allports[name=ASTERISK, protocol=all]
           sendmail-whois[name=ASTERISK, dest=gonzalo@loquesea.com, sender=loquesea.com]
logpath  = /var/log/asterisk/messages
maxretry = 5
bantime = 259200
</pre>
<p>omo veis es muy simple. Define una regla que bloquea el acceso por iptables a esa ip si lo intenta de forma errónea mas de 5 veces (maxretry) y la banea durante 72 horas (259200 secs).<br />
También nos envía un mail con el whois de la ip y lo guarda en los logs.</p>
<p>Al prinicpio de este archivo quizás queramos definir también las ip&#8217;s que no serán baneadas, por si algún día banea la nuestra propia (separadas por espacios):<code><br />
ignoreip = 127.0.0.1 192.168.1.10 192.168.1.2<br />
</code></p>
<p>A continuación editamos las reglas del servicio asterisk en el archivo /etc/fail2ban/filter.d/asterisk.conf<br />
<strong>ACTUALIZACION para Asterisk 1.8. La configuración que ponen en la mayoría de los sitios NO FUNCIONA</strong>. Incluso no funciona la del libro oficial de Asterisk <em>Asterisk &#8211; The definitive guide</em>. Si no, pruébalo tu mismo desde casa. Así que porque no te estén llegando mails de avisos del servicio fail2ban no es porque todo vaya bien y se hayan olvidado de ti. De echo, todo lo contrario, es muy mala señal. Así que ahí va un filter que realmente funciona en Asterisk 1.8:</p>
<pre>
[INCLUDES]

# Read common prefixes. If any customizations available -- read them from
# common.local
#before = common.conf                                                                                 

[Definition]

#_daemon = asterisk                                                                                   

# Option:  failregex
# Notes.:  regex to match the password failures messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>\S+)
# Values:  TEXT
#                                                                                                     

failregex = NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>(:[0-9]{1,5})?' - No matching peer found
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>(:[0-9]{1,5})?' - Wrong password
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>(:[0-9]{1,5})?' - Username/auth name mismatch
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>(:[0-9]{1,5})?' - Device does not match ACL
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>(:[0-9]{1,5})?' - Peer is not supposed to register
            NOTICE.* .*: Registration from '\".*\".*' failed for '<HOST>(:[0-9]{1,5})?' - ACL error (permit/deny)
            NOTICE.* .*: Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - No matching peer found
            NOTICE.* .*: Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Wrong password
            NOTICE.* .*: Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Username/auth name mismatch
            NOTICE.* .*: Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Device does not match ACL
            NOTICE.* .*: Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - Peer is not supposed to register
            NOTICE.* .*: Registration from '.*' failed for '<HOST>(:[0-9]{1,5})?' - ACL error (permit/deny)
            NOTICE.* <HOST> failed to authenticate as '.*'$
            NOTICE.* .*: No registration for peer '.*' \(from <HOST>\)
            NOTICE.* .*: Host <HOST> failed MD5 authentication for '.*' (.*)
            NOTICE.* .*: Failed to authenticate user .*@<HOST>.*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =
</pre>
<p>Esta nueva configuración es porque ahora Asterisk 1.8 incluye el puerto &#8217;192.168.200.100:36998&#8242; y las expresiones regulares de la antigua config no las matchea bien.</p>
<p>De hecho fail2ban no es del todo fiable para un sistema &#8220;muy&#8221; crítico y donde se busca la seguridad ante todo (ver explicación en <a href="http://www.fail2ban.org/wiki/index.php/Talk:Asterisk" target="_blank">info sobre fail2ban</a> y en <a href="http://forums.asterisk.org/viewtopic.php?p=159984" target="_blank">más info</a>). Por eso recomiendo al final de este post que siempre que sea posible denegar todas las IP&#8217;s con iptables y habilitar solo las extrictamente necesarias.<br />
O utilizar otros métodos&#8230;</p>
<p>Antes de reiniciar asterisk, hay que cambiar el formato de la fecha que se pone en los logs, si no fail2ban será incapáz de parsearla y hacer un matching. Para ello editamos el archivo de asterisk /etc/asterisk/logger.conf y descomentamos en la sección [general] la línea:<br />
dateformat=%F %T<br />
y:<br />
console => notice,warning,error<br />
messages => notice,warning,error</p>
<p>y ejecutamos en el CLI> de asterisk:<br />
<code><br />
CLI> logger reload<br />
</code></p>
<p>Ahora ya podemos reiniciar el servicio:<code><br />
# service fail2ban restart<br />
 * Restarting authentication failure monitor fail2ban                                          [ OK ]<br />
</code></p>
<h3>Ups!, un cliente cojonero se ha baneado, ¿cómo lo desbaneo?</h3>
<p>Comprobamos que ip&#8217;s están bloquedadas con iptables:</p>
<pre>
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
fail2ban-ASTERISK  tcp  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
DROP       0    --  loquesea.net         anywhere
RETURN     0    --  anywhere             anywhere
</pre>
<p>Podemos ver que loquesea.net está bloqueada, así que para desbloquearla ejecutaremos:<code><br />
# iptables -D fail2ban-ASTERISK 1<br />
</code></p>
<p>Si ejecutamos iptables -L de nuevo veremos que ya no está.</p>
<h3>Bloquear todo lo que no venga de mi troncal de vozip</h3>
<p>Aunque si no tenemos ningún cliente externo, seguramente lo mas seguro sea banear a todo el mundo que no sea la IP de nuestro troncal SIP. Para ello nada mejor que iptables, donde cerraríamos todo y habilitamos tan solo la conexión de nuestro proveedor o del troncal:<code><br />
iptables -I INPUT 10 -p tcp --dport 5060 -s XX.XX.XX.XX -j ACCEPT<br />
</code></p>
<p>También estaría bien seguir otras directrices de seguridad tales y como se comenta en el libro de <em>&#8220;Asterisk 3rd Ed &#8211; The definitive guide&#8221;</em> o en el blog de Elío <a href="http://www.sinologic.net/blog/" target="_blank">http://www.sinologic.net/blog/</a><br />
Avisados estáis. Estamos hablando de un tema serio que puede acarrear un grave problema económico a la empresa&#8230;</p>
<p>Fuentes:<br />
<a href="http://www.voip-info.org/wiki/view/Fail2Ban+(with+iptables)+And+Asterisk" title="http://www.voip-info.org/wiki/view/Fail2Ban+(with+iptables)+And+Asterisk" target="_blank">http://www.voip-info.org/wiki/view/Fail2Ban+(with+iptables)+And+Asterisk</a><br />
<a href="http://www.fail2ban.org/wiki/index.php/Asterisk" title="http://www.fail2ban.org/wiki/index.php/Asterisk" target="_blank">http://www.fail2ban.org/wiki/index.php/Asterisk</a><br />
<a href="http://hgeorge123.blogspot.com/2011/01/seguridad-en-asterisk-fail2ban.html" title="http://hgeorge123.blogspot.com/2011/01/seguridad-en-asterisk-fail2ban.html" target="_blank">http://hgeorge123.blogspot.com/2011/01/seguridad-en-asterisk-fail2ban.html</a><br />
<a href="http://www.voip-info.org/wiki/view/Asterisk+firewall+rules" title="http://www.voip-info.org/wiki/view/Asterisk+firewall+rules" target="_blank">http://www.voip-info.org/wiki/view/Asterisk+firewall+rules</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2011/proteger-asterisk-de-ataques-con-fail2ban/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Monitorizar servidores con Munin</title>
		<link>http://www.gonzalomarcote.com/2011/monitorizar-servidores-con-munin/</link>
		<comments>http://www.gonzalomarcote.com/2011/monitorizar-servidores-con-munin/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 16:07:08 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[sistemas]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=464</guid>
		<description><![CDATA[En el siguiente post voy a hablar de como monitorizar nuestros servidores con Munin. Munin nos muestra gráficos con estadísticas de nuestro servidor (CPU, load average, RAM usada, tráfico de red, etc). Monit nos muestra la disponibilidad y el uso de diferentes servicios (Apache, MySQL, Postfix, etc) y acciones a tomar bajo determinadas circustancias. La [...]]]></description>
			<content:encoded><![CDATA[<p>En el siguiente post voy a hablar de como monitorizar nuestros servidores con Munin.<br />
Munin nos muestra gráficos con estadísticas de nuestro servidor (CPU, load average, RAM usada, tráfico de red, etc).<br />
Monit nos muestra la disponibilidad y el uso de diferentes servicios (Apache, MySQL, Postfix, etc) y acciones a tomar bajo determinadas circustancias.<br />
La conbinación de los dos nos permite detectar en nuestros servidores cuando necesitamos dimensionar o que acciones debemos tomar cuando ciertos servicios no funcionan o rinden como se esperaba.<br />
Aunque en este post solo voy a explicar munin y monit quizás lo deje para otro post.<br />
<span id="more-464"></span></p>
<h3>Servidor Munin</h3>
<p>Funciona ﻿con arquitectura cliente/servidor. Hay dos paquetes &#8216;munin&#8217; y &#8216;munin-node&#8217;. El primero lo instalaremos en el servidor y el segundo en los diferentes nodos/servers que queremos que monitorice.<br />
Instalamos munin en el que va a hacer de servidor:<br />
<code><br />
# apt-get install munin<br />
</code></p>
<p>Editamos /etc/munin/munin.conf y ponemos:<br />
<code><br />
dbdir   /var/lib/munin<br />
htmldir /var/cache/munin/www<br />
logdir /var/log/munin<br />
rundir  /var/run/munin<br />
#<br />
# Where to look for the HTML template<br />
tmpldir /etc/munin/templates</code></p>
<p><code> </code></p>
<p><code># a simple host tree<br />
[services.loquesea.com]<br />
address 127.0.0.1<br />
use_node_name yes<br />
</code></p>
<p>En htmldir definimos que el dir de apache va a ir en /var/cache/munin/www y definimos también el nombre de dominio de nodo (porque el server va a hacer como nodo y servidor) dentro del servicdor de munin [services.loquesea.com]</p>
<p>También deberíamos editar el propio archivo del servidor para que cuando actúe como nodo (de si mismo) solo escuche de si mismo (loopback) y no en todas las interfaces de red. Editamos el archivo munin-node.conf y ponemos y cambiamos el valor &#8216;host&#8217; a:<br />
<code><br />
host 127.0.0.1<br />
</code></p>
<p>A continuación editamos el archivo apache.conf para definir el alias que le vamos a dar y darle protección para que nos pida usuario y contraseña:<br />
<code><br />
Alias /munin /var/cache/munin/www</code></p>
<p><code> </code></p>
<p><code>Order allow,deny<br />
# Allow from localhost 127.0.0.0/8 ::1<br />
Allow from all<br />
Options None</code></p>
<p><code># This file can be used as a .htaccess file, or a part of your apache<br />
# config file.<br />
#<br />
# For the .htaccess file option to work the munin www directory<br />
# (/var/cache/munin/www) must have "AllowOverride all" or something<br />
# close to that set.<br />
#</code></p>
<p><code>AuthUserFile /etc/munin/munin-htpasswd<br />
AuthName "admin"<br />
AuthType Basic<br />
require valid-user</code></p>
<p><code># This next part requires mod_expires to be enabled.<br />
#</code></p>
<p><code># Set the default expiration time for files to 5 minutes 10 seconds from<br />
# their creation (modification) time.  There are probably new files by<br />
# that time.<br />
#<br />
ExpiresActive On<br />
ExpiresDefault M310</code></p>
<p>Yo he definido que el username sea &#8216;admin&#8217;, así que creamos este usuario con htpasswd:<br />
<code><br />
# htpasswd -c munin-htpasswd admin<br />
</code></p>
<p>Otro parámetro que queramos definir es el acceso. Yo he puesto:<br />
<code><br />
# Allow from localhost 127.0.0.0/8 ::1<br />
Allow from all<br />
</code></p>
<p>Que permite acceder desde cualquier sitio. Si solo quisiésemos acceder desde uestra red local podríamos poner algo así:<br />
<code><br />
Allow from localhost 192.168.1.0/24 ::1<br />
</code></p>
<p>Por último reiniciamos munin y apache:<br />
<code><br />
# service munin-node restart<br />
# service apache2 restart<br />
</code></p>
<p>Ahora ya podemos acceder a las estadísticas en services.loquesea.com/munin<br />
Tardarán un tiempo en estar llenas.</p>
<h3>Cliente Munin</h3>
<p>Ya tenemos el servidor corriendo con si mismo como el primer cliente. Para añadir nuevos clientes instalmos tan solo el paquete munin-node en otro servidor:<br />
<code><br />
# apt-get install munin-node<br />
</code></p>
<p>Ahora tan solo tenemos que editar el archivo munin-node.conf y definir:<br />
<code><br />
#<br />
# Example config-file for munin-node<br />
# </code></p>
<p><code>log_level 4<br />
log_file /var/log/munin/munin-node.log<br />
pid_file /var/run/munin/munin-node.pid</code></p>
<p><code>background 1<br />
setsid 1</code></p>
<p><code>user root<br />
group root</code></p>
<p><code># Regexps for files to ignore</code></p>
<p><code>ignore_file ~$<br />
#ignore_file [#~]$  # FIX doesn't work. '#' starts a comment<br />
ignore_file DEADJOE$<br />
ignore_file \.bak$<br />
ignore_file %$<br />
ignore_file \.dpkg-(tmp|new|old|dist)$<br />
ignore_file \.rpm(save|new)$<br />
ignore_file \.pod$</p>
<p># Set this if the client doesn't report the correct hostname when<br />
# telnetting to localhost, port 4949<br />
#<br />
host_name maquina1.loquesea.com</p>
<p># A list of addresses that are allowed to connect.  This must be a<br />
# regular expression, since Net::Server does not understand CIDR-style<br />
# network notation unless the perl module Net::CIDR is installed.  You<br />
# may repeat the allow line as many times as you'd like</p>
<p>#allow ^127\.0\.0\.1$<br />
allow ^192\.168\.XX\.XXX$</p>
<p># If you have installed the Net::CIDR perl module, you can use<br />
# multiple cidr_allow and cidr_deny address/mask patterns.  A<br />
# connecting client must match any cidr_allow, and not match any<br />
# cidr_deny.  Example:</p>
<p># cidr_allow 127.0.0.1/32<br />
# cidr_allow 192.0.2.0/24<br />
# cidr_deny  192.0.2.42/32</p>
<p># Which address to bind to;<br />
#host *<br />
host 192.168.XX.XXX</p>
<p># And which port<br />
port 4949<br />
</code></p>
<p>Descomentamos &#8216;host_name&#8217; y ponemos el nombre de dominio de este nodo.<br />
En &#8216;allow&#8217; ponemos la ip del servidor munin<br />
En &#8216;host&#8217; ponemos la ip de este nodo</p>
<p>Ahora vamos de vuelta otra vez al servidor y definimos en el archivo munin.conf este nodo:<br />
<code><br />
[nombre.loquesea.com]<br />
address 192.168.XX.XXX<br />
use_node_name yes<br />
</code></p>
<p>Reiniciamos munin en el servidor y en el nodo:<br />
<code><br />
# service munin-node restart<br />
</code></p>
<p>Y ya nos aparecerá en unos segundos en el interfaz web.</p>
<p>Es extensible con plugins y demás.<br />
Los plugins se activan mediante enlaces en el dir /etc/munin/plugins a /usr/share/munin/plugins<br />
Si vemos que es demasiada información y tan solo nos interesa el espacio en disco, red y dos cosas mas, podemos borrar los enlaces que queramos de /etc/munin/plugins y reiniciar el nodo (siempre tarda unos secs en actualizarse).</p>
<p>Como véis es un poco cutre y minimalista, pero muy útil si administras unas decenas de servidores.</p>
<p><a href="http://www.gonzalomarcote.com/wp-content/uploads/2011/11/Pantallazo.png"><img class="size-thumbnail wp-image-468 alignleft" title="munin" src="http://www.gonzalomarcote.com/wp-content/uploads/2011/11/Pantallazo-150x150.png" alt="" width="150" height="150" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2011/monitorizar-servidores-con-munin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Como cortar una variable en el dialplan de Asterisk</title>
		<link>http://www.gonzalomarcote.com/2011/como-cortar-una-variable-en-el-dialplan-de-asterisk/</link>
		<comments>http://www.gonzalomarcote.com/2011/como-cortar-una-variable-en-el-dialplan-de-asterisk/#comments</comments>
		<pubDate>Tue, 22 Nov 2011 15:24:27 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[voip]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=456</guid>
		<description><![CDATA[Me preguntan como cortar una variable en el dialplan de Asterisk para hacer algo tan sencillo como que si el número es un fijo nacional (de España) y empieza por 9 lo mande por un troncal y si es un móvil que empieza por 6 lo mande por otro troncal (enlaces gsm). Esto en Asterisk [...]]]></description>
			<content:encoded><![CDATA[<p>Me preguntan como cortar una variable en el dialplan de Asterisk para hacer algo tan sencillo como que si el número es un fijo nacional (de España) y empieza por 9 lo mande por un troncal y si es un móvil que empieza por 6 lo mande por otro troncal (enlaces gsm).<br />
Esto en Asterisk es muy fácil.<br />
Supongamos que previamente en el dialplan hemos definido la variable de número a llamar en la variable TELF, like así:<br />
<code><br />
exten => [69]XXXXXXXX,n,Set(TELF=${EXTEN})<br />
</code></p>
<p>Luego podríamos quedarnos con el primer número de la variable $TELF y decidir si sale por un lado o por otro:</p>
<pre>
exten => s,1,NoOp(Definimos si es una llamada a la exten SIP/moviles o SIP/fijos)
   same => n,ExecIf($[${TELF:0:1} = 9]?Set(SIPTRUNK=SIP/fijos):Set(SIPTRUNK=SIP/moviles))
   same => n,Dial(${SIPTRUNK}/${TELF},20)
</pre>
<p>Explico:</p>
<li>same => &#8211; es la nueva forma (mucho más cómoda) de especificar extensiones en el dialplan desde la 1.6</li>
<li>${TELF:0:1} &#8211; tómalo como un array. Empezando por el primer elemento de la variable (0) cogen el siguiente número de elementos (solo 1 en este caso). Osea el primer número. Si pusiésemos ${TELF:0:3}, serían los tres primeros (por ej el prefijo 981) y si pusiésemos ${TELF:-9:1} sería el primer número también, ya que empezaría por el final hasta el 9º elemento y cogería a partir de ahí el primero.</li>
<li>ExecIf($[${TELF:0:1} = 9] &#8211; Si el primer número de la variable $TELF es 0 =9 ejecuta&#8230;</li>
<li>Set(SIPTRUNK=SIP/fijos):Set(SIPTRUNK=SIP/moviles) &#8211; &#8230;ejecuta que definas la variable SIPTRUNK=SIP/fijos o si no es = 9 que la variable SIPTRUNK=SIP/móviles</li>
<li>Dial(${SIPTRUNK}/${TELF},20) &#8211; Haz la llamada por el troncal adecuado</li>
<p>Fácil, no?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2011/como-cortar-una-variable-en-el-dialplan-de-asterisk/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalar un guest windows en KVM con virtio drivers</title>
		<link>http://www.gonzalomarcote.com/2011/instalar-un-guest-windows-en-kvm-con-virtio-drivers/</link>
		<comments>http://www.gonzalomarcote.com/2011/instalar-un-guest-windows-en-kvm-con-virtio-drivers/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 17:12:28 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[kvm]]></category>
		<category><![CDATA[sistemas]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[virtualizacion]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=410</guid>
		<description><![CDATA[Los controladores para-virtualizados aumentan el rendimiento de los huéspedes totalmente para- virtualizados. Con los controladores para-virtualizados la latencia de E/S disminuye y el rendimiento aumenta los niveles a casi bare-metal. Es recomendable utilizar controladores para-virtualizados para huéspedes completamente virtualizados ejecutando tareas pesadas de E/S y aplicaciones como las BBDD. Estos son cargados automáticamente en distros [...]]]></description>
			<content:encoded><![CDATA[<p>Los controladores para-virtualizados aumentan el rendimiento de los huéspedes totalmente para-<br />
virtualizados. Con los controladores para-virtualizados la latencia de E/S disminuye y el rendimiento<br />
aumenta los niveles a casi bare-metal. Es recomendable utilizar controladores para-virtualizados para<br />
huéspedes completamente virtualizados ejecutando tareas pesadas de E/S y aplicaciones como las BBDD.<br />
Estos son cargados automáticamente en distros nuevas de Ubuntu, RHEL y CentOS, así como en teoría cualquier distro con un kernel superior a 2.6.27. Así que no habría que hacer nada para poder usar aplicaciones con mucha I/O como las BBDD sobre Ubuntu, tan solo indicar con el parametro &#8216;os-variant&#8217; la distro que usamos o en su defecto (si no la encontramos), &#8216;virtio26&#8242;<br />
Para usar BBDD en windows hay que instalar estos drivers que mejoran en mucho la velocidad la la red y escritura a disco.<br />
Las versiones de windows que soportan estos drivers son:<br />
• Windows XP (solo 32 bits)<br />
• Windows Server 2003 (versiones de 32 y de 64 bits)<br />
• Windows Server 2008 (versiones de 32 y de 64 bits)<br />
• Windows Vista/7 (versiones de 32 y de 64 bits)</p>
<p>La última iso de estos drivers se puede encontrar aqui:</p>
<p>http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/</p>
<p>En concreto me bajo las versiones:<br />
- virtio-win-1.1.16.iso<br />
- virtio-win-1.1.16.vfd</p>
<p>Para hacer una instalación de Windows con estos drivers por ej en un Windows XP haremos así:</p>
<pre>
virt-install -c qemu:///system --virt-type kvm --name winxp --vcpus 1 --ram 1024 --os-variant winxp \
--disk /var/lib/libvirt/images/guests/winxp.img,size=30,sparse=false,bus=virtio \
--disk /var/lib/libvirt/images/isos/windows/virtio-win-1.1.16.vfd,device=floppy \
--cdrom /var/lib/libvirt/images/isos/windows/virtio-win-1.1.16.iso \
--cdrom /var/lib//libvirt/images/isos/windows/winxp.iso \
--network bridge:br0,model=virtio \
--vnc
</pre>
<p>Y en la instalación nos instalará estos drivers.</p>
<p>Mas fuentes sobre el tema:<br />
<a href="http://cloud.ubuntu.com/2011/03/fast-win7-kvm-virtiodisk-net-install/">http://cloud.ubuntu.com/2011/03/fast-win7-kvm-virtiodisk-net-install/</a><br />
<a href="http://www.todosconsoftwarelibre.es/instalacion-de-windows-7-sobre-kvm-en-ubuntu-server-10-04-1/">http://www.todosconsoftwarelibre.es/instalacion-de-windows-7-sobre-kvm-en-ubuntu-server-10-04-1/</a><br />
<a href="http://bderzhavets.wordpress.com/2011/01/20/virtio-install-windows-7-kvm-x64x86-on-ubuntu-10-04-1-server-via-dnjl-ppa/">http://bderzhavets.wordpress.com/2011/01/20/virtio-install-windows-7-kvm-x64x86-on-ubuntu-10-04-1-server-via-dnjl-ppa/</a><br />
<a href="http://blog.allanglesit.com/2011/03/kvm-guests-install-virtio-drivers-for-windows-guests/">http://blog.allanglesit.com/2011/03/kvm-guests-install-virtio-drivers-for-windows-guests/</a><br />
<a href="http://kahdev.wordpress.com/2011/05/30/using-virtio-drivers-in-a-kvm-windows-guest-vm/">http://kahdev.wordpress.com/2011/05/30/using-virtio-drivers-in-a-kvm-windows-guest-vm/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2011/instalar-un-guest-windows-en-kvm-con-virtio-drivers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La importancia de usar los virtio drivers en los guest KVM</title>
		<link>http://www.gonzalomarcote.com/2011/la-importancia-de-usar-los-virtio-drivers-en-los-guest-kvm/</link>
		<comments>http://www.gonzalomarcote.com/2011/la-importancia-de-usar-los-virtio-drivers-en-los-guest-kvm/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 07:24:38 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[kvm]]></category>
		<category><![CDATA[sistemas]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[virtualizacion]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=405</guid>
		<description><![CDATA[Vuelvo a repetirme sobre la importancia de crear nuestras máquinas virtuales en KVM con los drivers virtio, tanto en linux como mas aún en Windows (sobre todo para tareas con mucho I/O como BBDD). La mayoría de las distros de linux desde el kernel 2.6 ya soportan estos drivers, pero es importante indicarle que los [...]]]></description>
			<content:encoded><![CDATA[<p>Vuelvo a repetirme sobre la importancia de crear nuestras máquinas virtuales en KVM con los drivers virtio, tanto en linux como mas aún en Windows (sobre todo para tareas con mucho I/O como BBDD).<br />
La mayoría de las distros de linux desde el kernel 2.6 ya soportan estos drivers, pero es importante indicarle que los use a la hora de instalar el guest.<br />
Lo hacemos a la hora de instalar el guest con &#8216;virt-install&#8217; indicándole la opción &#8216;&#8211;os-variant=&#8217; a nuestra distro (por ej: ubuntulucid, consultar el man)&#8230; o en su defecto:<br />
<code><br />
--os-variant=virtio26<br />
</code></p>
<p>Si hacemos un &#8216;lspci&#8217; en nuestra máquina virtual, debemos ver un que los interfaces de red y de los discos son &#8216;virtio&#8217;:<br />
<code><br />
00:03.0 Ethernet controller: Qumranet, Inc. Virtio network device<br />
00:04.0 SCSI storage controller: Qumranet, Inc. Virtio block device<br />
</code></p>
<p>y nuestro disco duro aparecerá como &#8216;/dev/vda&#8217; en vez de &#8216;/dev/sda&#8217;.</p>
<p>La diferencia es abismal. Si hacemos un &#8216;iperf&#8217; en el guest en modo servidor:<br />
<code><br />
# iperf -s<br />
</code></p>
<p>y otro en el host apuntando a la ip del guest:<br />
<code><br />
# iperf -c 192.168.x.x -i2<br />
</code><br />
Las tasas son superiores al gigabit, de host a guest y de gigabit de guest a guest (ojo, también depende de la calidad del servidor que estéis usando como host).</p>
<p>Y si los drivers virtio para un guest linux son muy importantes, para los guest windows, son vitales!. Sobre todo si se nos ha ocurrido la mala idea de virtualizar un sql server por ej y queremos que se menee.<br />
Eso en el próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2011/la-importancia-de-usar-los-virtio-drivers-en-los-guest-kvm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apagar un guest linux en KVM correctamente con virsh</title>
		<link>http://www.gonzalomarcote.com/2011/apagar-un-guest-linux-en-kvm-correctamente-con-virsh/</link>
		<comments>http://www.gonzalomarcote.com/2011/apagar-un-guest-linux-en-kvm-correctamente-con-virsh/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 13:04:56 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[kvm]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[virtualizacion]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=399</guid>
		<description><![CDATA[Para que las VM&#8217;s Linux apaguen correctamente hay que instalar el demonio &#8216;acpid&#8217;: # aptitude install acpid Ahora ya puedes hacer desde consola para que apague correctamente un: # virsh shutdown guest]]></description>
			<content:encoded><![CDATA[<p>Para que las VM&#8217;s Linux apaguen correctamente hay que instalar el demonio &#8216;acpid&#8217;:<br />
# aptitude install acpid</p>
<p>Ahora ya puedes hacer desde consola para que apague correctamente un:<br />
# virsh shutdown guest</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2011/apagar-un-guest-linux-en-kvm-correctamente-con-virsh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cambiar nombre a un guest en KVM &#8211; Change KVM guest name</title>
		<link>http://www.gonzalomarcote.com/2011/cambiar-nombre-a-un-guest-en-kvm-change-kvm-guest-name/</link>
		<comments>http://www.gonzalomarcote.com/2011/cambiar-nombre-a-un-guest-en-kvm-change-kvm-guest-name/#comments</comments>
		<pubDate>Thu, 21 Jul 2011 13:00:39 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[kvm]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[virtualizacion]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=395</guid>
		<description><![CDATA[Supongamos que queremos cambiar el nombre a un guest de &#8216;winxp&#8217; a &#8216;windozer&#8217;. Hacemos: 1- Primero hacemos un volcado del archivo xml de ese guest guardando ya el nuevo xml como queramos que se llame: # virsh dumpxml winxp > windozer.xml 2- Editamos el nuevo xml y ponemos al principio en el tag el nuevo [...]]]></description>
			<content:encoded><![CDATA[<p>Supongamos que queremos cambiar el nombre a un guest de &#8216;winxp&#8217; a &#8216;windozer&#8217;. Hacemos:</p>
<p>1- Primero hacemos un volcado del archivo xml de ese guest guardando ya el nuevo xml como queramos que se llame:<br />
# virsh dumpxml winxp > windozer.xml</p>
<p>2- Editamos el nuevo xml y ponemos al principio en el tag <name> el nuevo nombre.</p>
<p>3- Desgraciadamente tenemos que apagar la máquina. Así que ya podemos aprovechar para cambiar el nombre de host dentro del guest si también era necesario:<br />
# virsh shutdown winxp</p>
<p>Una vez apagado el guest ya podemos cambiar el nombre del disco (normalmente está en /var/lib/libvirt/images/), en mi caso de winxp.img a windozer.img y editamos nuevamente el nuevo xml y cambiamos el nombre en el tag donde se defina ese disco.</p>
<p>4- Hacemos un undefine del nombre del guest antiguo para que lo borre de /etc/libvirt/qemu. Este &#8216;undefine&#8217; no nos borrará el disco que acabamos de renombrar en /var/lib/libvirt/images/:<br />
# virsh undefine winxp</p>
<p>5- Ahora hacemos un define de nuestro nuevo archivo xml para que lo coloque en /etc/libvirt/qemu:<br />
# virsh define windozer.xml</p>
<p>6- Por último ya podemos arrancar el nuevo guest:<br />
# virsh start windozer</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2011/cambiar-nombre-a-un-guest-en-kvm-change-kvm-guest-name/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Guest Asterisk sobre KVM con timing res_timing_timerfd</title>
		<link>http://www.gonzalomarcote.com/2011/guest-asterisk-sobre-kvm-con-timing-res_timing_timerfd/</link>
		<comments>http://www.gonzalomarcote.com/2011/guest-asterisk-sobre-kvm-con-timing-res_timing_timerfd/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 13:02:24 +0000</pubDate>
		<dc:creator>Gonzalo</dc:creator>
				<category><![CDATA[asterisk]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[virtualization]]></category>
		<category><![CDATA[voip]]></category>
		<category><![CDATA[virtualizacion]]></category>

		<guid isPermaLink="false">http://www.gonzalomarcote.com/?p=293</guid>
		<description><![CDATA[Últimamente estoy haciendo pruebas de virtualizar Asterisk sobre KVM. La verdad es que estoy sorprendido por el que el rendimiento es mucho mejor de lo que esperaba (mejor incluso que las pruebas que hice hace un año con VMware). Un problema que tenía era usar una fuente de timing fiable para asterisk (para poder uasr [...]]]></description>
			<content:encoded><![CDATA[<p>Últimamente estoy haciendo pruebas de virtualizar Asterisk sobre KVM. La verdad es que estoy sorprendido por el que el rendimiento es mucho mejor de lo que esperaba (mejor incluso que las pruebas que hice hace un año con VMware).<br />
Un problema que tenía era usar una fuente de timing fiable para asterisk (para poder uasr MOH, iax trunking y MeetMe), ya que al ser una máquina virtual no podía usar el dahdy_dummy.<br />
Como ya hay algo escrito sobre esto, os recomiendo que leáis este Post de saghul para entender de que va el tema:<br />
<a href="http://saghul.net/blog/2009/12/15/asterisk-1-6-y-las-nuevas-fuentes-de-timing/">href=&#8221;http://saghul.net/blog/2009/12/15/asterisk-1-6-y-las-nuevas-fuentes-de-timing</a></p>
<p>En el cual comenta que la mas fiable para usar en mi caso sería la nueva fuente (de la 1.6.2 en adelante) res_timing_timerfd.<br />
Para poder usarla debemos cumplir estos requisitos:<br />
asterisk > 1.6.2<br />
kernel > 2.6.27<br />
glibc > 2.8 </p>
<p>y comprobar que tememos el módulo cargado:<br />
ompruebo que lo tengo cargado:<br />
<code><br />
*CLI> module show like timing<br />
Module<br />
Description                              Use Count<br />
res_timing_timerfd.so          Timerfd Timing   Interface                 1<br />
res_timing_dahdi.so             DAHDI Timing    Interface                 0<br />
res_timing_pthread.so          pthread Timing   Interface                 0<br />
3 modules loaded<br />
</code></p>
<p>Si no está cargado nos aseguramos que lo tenemos en /usr/lib/asterisk/modules<br />
Pues bien, ahora tan solo tenemos que indicarle a asterisk que use el timing interno descomentando la siguiente línea en el archivo asterisk.conf:<br />
<code><br />
internal_timing = yes<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gonzalomarcote.com/2011/guest-asterisk-sobre-kvm-con-timing-res_timing_timerfd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

