<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5189027816427515351</id><updated>2012-02-16T03:43:39.294-08:00</updated><category term='Unix'/><category term='Red Hat'/><category term='OpenBoot'/><category term='DNS'/><category term='LVM'/><category term='Debian'/><category term='SPARC'/><category term='Zones'/><category term='CentOS'/><category term='Unix.'/><category term='modules'/><category term='FreeBSD'/><category term='SELinux'/><category term='SAK'/><category term='DTrace'/><category term='IPTables'/><category term='ALTQ'/><category term='SysRq'/><category term='NAT'/><category term='TCP Wrappers'/><category term='Virtualización'/><category term='XEN'/><category term='KVM'/><category term='Sun'/><category term='Superblock'/><category term='Backup'/><category term='IPFilter'/><category term='FTP'/><category term='Linux'/><category term='kernel'/><category term='Networking'/><category term='Solaris'/><category term='Debug'/><category term='HP-UX'/><category term='Storage'/><category term='Apache'/><category term='OK'/><category term='PROM'/><category term='AIX'/><category term='Packet Filter'/><category term='Filesystem'/><category term='ZFS'/><category term='proc'/><category term='Bind'/><category term='OpenBSD'/><title type='text'>Codigo Unix</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-5036224259672603851</id><published>2012-01-01T15:38:00.000-08:00</published><updated>2012-01-01T15:47:00.102-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='KVM'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtualización'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenBoot'/><category scheme='http://www.blogger.com/atom/ns#' term='OK'/><title type='text'>OpenBSD: Enabling serial console for KVM/libvirt utilization</title><content type='html'>Tengo un &lt;a href="http://www.openbsd.org/" target="_blank"&gt;OpenBSD 5.0&lt;/a&gt; con el que estoy realizando una serie de pruebas en una máquina virtual sobre &lt;a href="http://www.linux-kvm.org/page/Main_Page" target="_blank"&gt;KVM&lt;/a&gt; en &lt;a href="http://www.centos.org/" target="_blank"&gt;CentOS 6&lt;/a&gt;. KVM en conjunto con &lt;a href="http://libvirt.org/" target="_blank"&gt;libvirt&lt;/a&gt;, provee una serie de herramientas para administrar el host virtualizado, una de ella es virt-manager, una herramienta escrita utilizando GTK que obviamente necesita tener X&amp;nbsp;ejecutándose. La otra es virsh, una CLI para administración de hosts virtuales.&lt;br /&gt;&lt;br /&gt;Virsh tiene la interesante opción de poder attachear una consola virtual, la cual previamente debe estar configurada en el sistema operativo guest. Esto es importante para poder realizar con la VM todo el trabajo que no podemos hacer de manera remota utilizando SSH y así tener que evitar abrir virt-manager cada vez que tengamos que&amp;nbsp;agregar&amp;nbsp;algún&amp;nbsp;parámetro&amp;nbsp;al booteo, por ejemplo.&lt;br /&gt;&lt;br /&gt;Cabe destacar que esta configuración no solo aplica a hosts virtuales, sino también a hosts físicos que tienen la posibilidad o se conectan mediante consola serie.&amp;nbsp;Los pasos para realizar esto son bastante sencillos:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Vamos a dividir las consolas en dos partes:&lt;/u&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;La utilizada durante el booteo.&lt;/li&gt;&lt;li&gt;La utilizada durante el login.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Para poder ver los mensajes del booteo en la consola serie, podemos hacer esto de dos formas, la primera añadiendo el paramétro al momento del booteo, en el boot prompt, esta configuración será dinámica y se perderá la próxima vez que haga un reboot del equipo, para ello bajo x86 o x86_64 añadimos el parámetro&amp;nbsp;&lt;b style="background-color: white;"&gt;set tty com0&lt;/b&gt;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="background-color: white;"&gt;boot&amp;gt; &lt;/span&gt;&lt;span style="background-color: white;"&gt;set tty com0&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;/blockquote&gt;Siendo com0 nuestra consola serie. Si estamos bajo una arquitectura Sun/SPARC, y no hay un teclado conectado al equipo, se utilizará la consola serie por default. Caso contrario en el OK prompt añadimos:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;ok setenv input-device ttya&lt;br /&gt;ok setenv output-device ttya&lt;br /&gt;ok reset&lt;/span&gt;&lt;/blockquote&gt;Ahora bien, esta configuración es dinámica, y como dije anteriormente, se perderá durante el booteo, caso que necesitemos hacerla permanente, con el equipo una vez booteado editamos o creamos el archivo /etc/boot.conf con la siguiente línea dentro:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;set tty com0&lt;/span&gt;&lt;/blockquote&gt;Esto activará la consola serie al momento del booteo del equipo y todos los mensajes serán impresa utilizando el device com0. Pero para poder utilizar esto durante el login y la administración normal del sistema operativo tenemos que añadir una configuración adicional, editando el archivo /etc/ttys, reemplazamos la siguiente línea:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;tty00 &amp;nbsp; "/usr/libexec/getty std.9600" &amp;nbsp; unknown off&lt;/span&gt;&lt;/blockquote&gt;Por esta, que nos iniciara /usr/libexec/getty en el dispositivo char tty00:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;tty00 &amp;nbsp; "/usr/libexec/getty std.9600" &amp;nbsp; vt220 &amp;nbsp; on &amp;nbsp;secure&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;Ahora si, es importante tener un emulador de terminal como Minicom configurado en 9600 baudios 8 bits, sin paridad y 1 de Stop (9600 8N1). Ahora si hacemos un virsh console "OpenBSD-5.0-test", obtendremos la siguiente salida:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;virsh # console OpenBSD-5.0-test&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Connected to domain OpenBSD-5.0-test&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Escape character is ^]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;gt;&amp;gt; OpenBSD/i386 BOOT 3.17&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;boot&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;booting hd0a:/bsd: 8192892+1088776 [61+367888+353319]=0x98a398&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;entry point at 0x200120&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Copyright (c) 1995-2011 OpenBSD. All rights reserved. &amp;nbsp;http://www.OpenBSD.org&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;OpenBSD 5.0 (GENERIC) #43: Wed Aug 17 10:10:52 MDT 2011&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; deraadt@i386.openbsd.org:/usr/src/sys/arch/i386/compile/GENERIC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;---- Output ommited ----&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;starting network daemons: sshd sendmail inetd.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;starting local daemons: cron.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Sun Jan &amp;nbsp;1 20:33:02 ART 2012&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;OpenBSD/i386 (fwl-dmz.foobar.net) (tty00)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;login: root&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Password:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;OpenBSD 5.0 (GENERIC) #43: Wed Aug 17 10:10:52 MDT 2011&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Welcome to OpenBSD: The proactively secure Unix-like operating system.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;You have mail.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;fwl-dmz ~:# &amp;nbsp;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-5036224259672603851?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/5036224259672603851/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2012/01/openbsd-enabling-serial-console-for.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5036224259672603851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5036224259672603851'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2012/01/openbsd-enabling-serial-console-for.html' title='OpenBSD: Enabling serial console for KVM/libvirt utilization'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-4787096346773109153</id><published>2011-12-31T00:36:00.000-08:00</published><updated>2011-12-31T00:39:19.126-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='FreeBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Packet Filter'/><title type='text'>PF: OS based redirection</title><content type='html'>Supongamos que tenemos en nuestra red dos servidores web, a uno solo pueden entrar los clientes que corran Windows, a los otros los que usan GNU/Linux. ¿Es posible hacer esto de alguna manera sencilla?, la respuesta es si!. Utilizando PF, OS Fingerprints y una regla de redirección.&lt;br /&gt;&lt;br /&gt;OS Fingerprints es un mecanismo que tiene PF para determinar el sistema operativo que esta utilizando un host en concreto que pasa por el firewall, lo hace mediante la examinación de algunos campos del header del paquete, como por ejemplo el TTL, y acorde a lo establecido en el archivo /etc/pf.os determina el sistema operativo al que corresponde el paquete.&lt;br /&gt;&lt;br /&gt;Supongamos que el servidor web para Windows corre un IIS en el host 10.0.0.10, puerto 8080/TCP y el servidor Linux 2.6 un Apache en 10.0.0.20, puerto 8081/TCP.&lt;br /&gt;Simplemente deberiamos utilizar estas:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;$ext_if = "em0"&lt;br /&gt;$webwin="10.0.0.10"&lt;br /&gt;$weblinux="10.0.0.20"&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;pass in on $ext_if proto tcp from any os "Windows" to any port 80 modulate state flags S/SA rdr-to $webwin port 8081&lt;br /&gt;pass in on $ext_if proto tcp from any os "Linux 2.6" to any port 80 modulate state flags S/SA rdr-to $weblinux port 8081&lt;/blockquote&gt;Esto se consigue mediante la clave OS, a la que debe indicarsele el sistema operativo a evaluar el fingerprint, y rdr-to que nos permite realizar una redirección a un host determinado acompañado de su número de puerto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-4787096346773109153?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/4787096346773109153/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/12/pf-os-based-redirection.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/4787096346773109153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/4787096346773109153'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/12/pf-os-based-redirection.html' title='PF: OS based redirection'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-7601986251113158573</id><published>2011-12-30T23:53:00.000-08:00</published><updated>2012-01-12T21:37:26.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Hat'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='CentOS'/><category scheme='http://www.blogger.com/atom/ns#' term='FreeBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='IPTables'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><category scheme='http://www.blogger.com/atom/ns#' term='Networking'/><category scheme='http://www.blogger.com/atom/ns#' term='Packet Filter'/><title type='text'>Unix: Stateful firewalls vs. Non-Stateful firewalls</title><content type='html'>Hace unos días tuve una interesante discusión en &lt;a href="http://twitter.com/_tty0" target="_blank"&gt;Twitter&lt;/a&gt; sobre las ventajas de utilizar como firewall &lt;b&gt;&lt;a href="http://www.openbsd.org/faq/pf/" target="_blank"&gt;Packet Filter&lt;/a&gt;&lt;/b&gt; contra &lt;b&gt;&lt;a href="http://www.netfilter.org/" target="_blank"&gt;Netfilter&lt;/a&gt; &lt;/b&gt;(IPTables). Cabe destacar que tengo mas conocimientos de PF que de IPTables, por lo cual conozco más las ventajas prácticas del primero que del último.&lt;br /&gt;&lt;br /&gt;En teoría de firewalls, encontramos los denominados &lt;b&gt;stateful firewalls&lt;/b&gt;, son firewalls que actúan en &lt;b&gt;layer 3&lt;/b&gt; del modelo OSI/ISO (network) donde su punto fuerte es el poder de inspeccionar estados, y saber si los mismos corresponden a una conexión ya existente o no. Esto es posible lograrlo en Linux mediante connectrion tracking utilizando los módulos &lt;b&gt;conntrack&lt;/b&gt;, y &amp;nbsp;así mantener un record de los estados existentes en el sistema operativo.&lt;br /&gt;&lt;br /&gt;Tanto Packet Filter como IP Filter utilizan una estructura denominada&lt;b&gt; tabla de estados&lt;/b&gt; (o status table), para mantener dicha información. Si un paquete IP ingresa al firewall, se va a buscar mediante una previa inspección del header si el mismo forma parte de una conexión ya existente, y si esto es cierto no se van a inspeccionar reglas de filtrado, sino que el paquete va a pasar directamente. Si un paquete llega por primera vez al firewall, el mismo si matchea con alguna regla, entonces va a crear una entrada en la tabla de estados del firewall, y ya, mientras la conexión siga viva no va a pasar por dicha inspección de reglas.&lt;br /&gt;&lt;br /&gt;Por su parte IPTables, trabaja distinto. Cada vez que un paquete llega (sea nuevo o no), va a pasar por las reglas de filtrado, si matchea con alguna regla se aplicará esta, en caso contrario se aplica la policy por default previamente definida. Pero como dije anteriormente, mediante la utilización de los módulos conntrack es posible logar esto. Como se muestra a continuación:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT&lt;/span&gt;&lt;/blockquote&gt;En esta regla de filtrado todos los paquetes que ingresen al firewall con estado ESTABLISHED y RELATED van a ser aceptados, los cuales forman parte de una conexión ya existente posiblemente inicializada por un equipo de la red interna y de esta manera, por ejemplo es capaz mantener conexiones mediante NAT.&lt;br /&gt;&lt;br /&gt;Esto puede ser realizado con una sintaxis más clara utilizando PF, y con la posibilidad de usar macros ;-)&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;wan_if='10.0.0.1'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;lan_net='192.168.1.0/24'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;pass in on $wan_if from any to $lan_net flags S/SA keep state&lt;/span&gt;&lt;/blockquote&gt;O mediante IP Filter:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;pass in on em0 from any to 192.168.1.0/24 flags S/SA keep state&lt;/span&gt;&lt;/blockquote&gt;A modo resumen de lo visto hasta ahora podemos decir que todo firewall basado en estados se compone de dos elementos, ellos son: El conjunto de reglas de filtrado y la tabla de estados.&lt;br /&gt;&lt;br /&gt;Esta tabla de estados en PF es una estructura en formato de&amp;nbsp;árbol&amp;nbsp;binario balanceado denominado AVL. Como sabemos la utilización de un&amp;nbsp;árbol&amp;nbsp;binario tiene un coste computacional un poco superior al de utilizar arboles hash, la decisión de utilizar un&amp;nbsp;árbol&amp;nbsp;binario en PF se basa en que fue concebido como parte del proyecto &lt;a href="http://www.openbsd.org/" target="_blank"&gt;OpenBSD&lt;/a&gt; donde la principal preocupación al momento del diseño es la seguridad. Los hashes pueden provocar colisiones, esto es, dada distintas entradas obtener una misma salida, conociendo que a mayor cantidad de entradas en la tabla de estados, existe mayor posibilidad de colisiones, se opto por elegir un árbol binario como método de almacenar dichos estados.&lt;br /&gt;Algoritmos de hashing como SHA1/SHA2 han demostrado tener casi nulas colisiones, pero el costo computacional de procesar búsquedas mediante estos algoritmos es bastante mas alto que el de utilizar algoritmos mas sencillos como MD4/MD5 que son fácilmente&amp;nbsp;colisionables. Por lo cual, en la teoría, un atacante podría generar paquetes maliciosos para provocar colisiones en la tabla de estados y de esta manera realizar un ataque del tipo spoofing contra la red interna o DMZ y ganar acceso a equipos de acceso restringido.&lt;br /&gt;&lt;br /&gt;Sabemos que el estado es una parte importante de los paquetes TCP, por cada paquete que matchee van a ser verificados varios campos por parte del firewall, esto es ISN (Initial Sequence Number), el origen (SRC), el destino (DST), puerto de origen (SRC PORT), y puerto de destino (DST PORT). PF computa el ISN añadiendo un valor aleatorio y de esta manera evitar ataques donde se altera el ISN y de esta manera evitar los ya conocidos SYN Flood que pueden provocar DoS/DDoS. IPTables no es capaz de realizar esta acción, aunque el costo computacional de no realizarlo es mucho menor del utilizado por PF.&lt;br /&gt;&lt;br /&gt;Por su parte UDP, es conocido que es un protocolo sin estado por naturaleza, PF, también tiene la capacidad de manejar estados en conexiones UDP, ¿como lo consigue?. Las conexiones solo conocen dos pseudo estados, START y STOP, PF añade a esto un tiempo de&amp;nbsp;expiración&amp;nbsp;(acorde al nivel optimización seteado en el firewall), por lo cual mientras no haya expirado la conexión el paquete no va a tener que pasar por las reglas de filtrado, sino que simplemente se va a realizar una búsqueda en la tabla de estados.&lt;br /&gt;Es importante conocer que para poder manejar esto, el tiempo de expiración se va a ir incrementando gradualmente a medida que lleguen paquetes que formen parte de la misma conexión hasta alcanzar su tope máximo. De esta manera se evitan que múltiples estados UDP sean creados y queden muertos a la espera de nuevos paquetes.&lt;br /&gt;&lt;br /&gt;Los paquetes ICMP se dividen en dos categorías, ICMP-error e ICMP-querys (por ejemplo echo request/echo reply o más conocido como ping). Ambos tipos tienen la posibilidad de crear estados y ser manejados por el firewall, por ejemplo, si llega un ICMP-error al firewall, que es parte de una conexión existente, este matchea en la tabla de estados y puede pasar para notificar a la aplicación de que un error&amp;nbsp;ocurrió. Lo mismo se aplica con los ICMP-querys.&lt;br /&gt;&lt;br /&gt;Las posibles formas de mantener estados de PF, son las siguientes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;keep state&lt;/u&gt;: Trabaja con TCP, UDP e ICMP, es el default en las reglas de filtrado.&lt;/li&gt;&lt;li&gt;&lt;u&gt;modulate state&lt;/u&gt;: Trabaja solo con TCP, recalcula el ISN.&lt;/li&gt;&lt;li&gt;&lt;u&gt;synproxy state&lt;/u&gt;: Crea un proxy SYN para las conexiones TCP entrantes a fin de evitar conexiones spoofeadas. Combina las ventajas de modulate state y keep state.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;u&gt;non state&lt;/u&gt;:&amp;nbsp;Funciona con TCP, UDP e ICMP. Ningún estado es creado.&lt;/li&gt;&lt;/ul&gt;El costo de evaluación de reglas de firewall puede ser calculado mediante &lt;b&gt;O(n)&lt;/b&gt;, donde n es el número total de reglas por las que debe pasar el paquete. Mientras que el costo de evaluación de la existencia de estados es &lt;b&gt;O(log m)&lt;/b&gt;, donde m es el número de estados. Mediante esto podemos concluir, que la evaluación de reglas tiene un coste parecido a la evaluación de estados.&lt;br /&gt;&lt;br /&gt;Es interesante la posibilidad que tiene PF de crear &lt;b&gt;TCP SYN Proxies&lt;/b&gt; (mediante synproxy state), de manera, si un cliente quiere contactar a un host remoto, le pasa un SYN al firewall, el firewall crea una entrada en la tabla de estados, y es el propio firewall el que inicializa el trheeway-handshake con el host remoto, pasandole la conexión una vez establecida al cliente. Con esto se busca evitar TCP Syn Floods que pueden terminar en DoS/DDoS.&lt;br /&gt;&lt;br /&gt;Por su parte PF, también optimiza el conjunto de evaluación de reglas, mediante un algoritmo denominado &lt;b&gt;skip-steps&lt;/b&gt;, el cual utiliza un puntero en cada parámetro de la regla apuntando a la siguiente regla a ser evaluada, que especifica un valor diferente para el parámetro; Si la regla no matchea con algún parámetro el puntero es utilizado para saltar a la siguiente regla que puede llegar a matchear. Esta optimización es totalmente transparente, debido a que no se modifica el ruleset, sino que se genera una estructura que simplemente mejora la performance del firewall, obviamente acorde a como esté escrito el ruleset cargado.&lt;br /&gt;&lt;br /&gt;La performance de un firewall esta dada por varios factores, tanto de hardware como de software. Por parte del hardware, es determinante el tipo de NIC utilizada, el bus al que se conecta esta NIC (ISA/PCI/PCIe), la memoria. Pero paradojimanete, múltiples CPU's o cores no ayudan a PF, ya que únicamente trabaja con un solo procesador.&lt;br /&gt;&lt;br /&gt;Por su lado, a nivel software, es factor determinante la complejidad con que fue configurado el ruleset, mientras mas complejo sea, más lento es. Por su parte, la utilización de la tabla de estados por parte de PF puede ser optimizado para actuar de diferentes formas; Esto puede ser establecido mediante el parámetro set, en el archivo /etc/pf.conf, como se muestra a continuación:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: 'Courier New',Courier,monospace;"&gt;set ruleset-optimization aggresive&lt;/span&gt;&lt;/blockquote&gt;Las distintas optimizaciones posibles del ruleset pueden ser:&lt;br /&gt;&lt;br /&gt;&lt;dd style="background-color: white;"&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;normal:&lt;/u&gt; Utilizable para la mayoría de las redes.&lt;/li&gt;&lt;li&gt;&lt;u&gt;high-latency:&lt;/u&gt; Para redes de alta latencia, como conexiones satélitales.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;u&gt;aggresive:&lt;/u&gt; Expiración agresiva de conexiones de la tabla de estados, puede ayudar a reducir el uso de memoria en firewalls de alta carga, eliminando las conexiones inactivas.&lt;/li&gt;&lt;li&gt;&lt;u&gt;conservative:&lt;/u&gt; Configuración extremadamente conservativa de recursos, puede aumentar la carga de la CPU debido al coste computacional utilizado para eliminar entradas de la tabla de estado.&lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;br /&gt;El monitoreo de la tabla de estados, puede hacerse en tiempo real, de manera totalmente transparente, con herramientas disponibles tanto en packages como en ports, tales como pftop, o el propio pfctl ( pfctl -ss / pfctl -si), etc.&lt;br /&gt;&lt;br /&gt;Los siguientes gráficos fueron extraidos del papper de Daniel Hartmeier &lt;b&gt;"Design and Performance of the OpenBSD Stateful Packet Filter (pf)"&lt;/b&gt; y demuestran de manera clara y concisa lo expresado aquí. Las pruebas se basaron utilizando dos equipos 486, con dos NIC cada uno conectadas entre sí, un firewall utilizando PF, IPF e IPTables (de a uno por vez), y otro generando paquetes enviandolos a dicho Firewall. Como sistemas operativos se utilizaron OpenBSD 3.0 (Para PF tanto como para IPF), y Red Hat 7.2 con IPTables.&lt;br /&gt;&lt;br /&gt;El primer test, se realiza el envío de paquetes de 256 bytes para un set de 100 reglas sin utilizar estados. La degradación de PF parece peor que la de IPTables y la de IPF.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-rYWTWwOxrNs/Tv63UIa_WrI/AAAAAAAAGJw/NCAkjkFOoX0/s1600/Imagen1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="296" src="http://1.bp.blogspot.com/-rYWTWwOxrNs/Tv63UIa_WrI/AAAAAAAAGJw/NCAkjkFOoX0/s640/Imagen1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;En el segundo test se realiza la misma prueba con paquetes de 256 bytes, un set de 100 reglas y la utilización de estados. IPTables gana incrementalmente a mayor número de paquetes este test.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-b7oz1anj2Po/Tv66LC8I3hI/AAAAAAAAGJ8/3wfWQVYel0I/s1600/Imagen2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="314" src="http://3.bp.blogspot.com/-b7oz1anj2Po/Tv66LC8I3hI/AAAAAAAAGJ8/3wfWQVYel0I/s640/Imagen2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;En el tercer test se intenta obtener el throughput máximo incrementando el número de reglas. El test es ganado por iptabales, debido a que tanto PF como IPF tienen un doble esfuerzo debido al filtrado de reglas inicial, y la búsqueda en la tabla de estados (y la creación de un estado si este aún no existe).&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-LTt8Ndd2o9Y/Tv67cEKySII/AAAAAAAAGKI/lXw9nQ9SOUY/s1600/Imagen3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-LTt8Ndd2o9Y/Tv67cEKySII/AAAAAAAAGKI/lXw9nQ9SOUY/s640/Imagen3.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;El cuarto test, es una comparativa de filtrado y utilización de estados entre PF e IPF, se puede notar que el throughput de PF decae mucho después que el de IPF a medida que se incrementa el número de paquetes.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-R93RMcJgAcI/Tv68bGeNdzI/AAAAAAAAGKU/TtBSsi9mj8k/s1600/Imagen4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="304" src="http://3.bp.blogspot.com/-R93RMcJgAcI/Tv68bGeNdzI/AAAAAAAAGKU/TtBSsi9mj8k/s640/Imagen4.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;En el quinto test, se comparan las latencias entre PF e IPF, puede observarse que IPF tiene una latencia un poco más alta que la de PF a medida que se incrementa el número de paquetes.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2dkNxQcH3k0/Tv69FpTjrII/AAAAAAAAGKg/T1WEH1ri-LM/s1600/Imagen5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="304" src="http://2.bp.blogspot.com/-2dkNxQcH3k0/Tv69FpTjrII/AAAAAAAAGKg/T1WEH1ri-LM/s640/Imagen5.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Luego de esto, se puede concluir que la evaluación de reglas es bastante mas cara que la evaluación de estados. Durante los tests iniciales se nota que PF es bastante más lento evaluando reglas que IPF e IPTables, pero hace un triple trabajo, que es gradualmente menos costoso que el que realiza IPTables. La baja performance en estas pruebas es debida a la forma que PF utiliza para evaluar las reglas, lo que realiza tres veces por cada paquete que pasa por la interface de red. Dos veces para buscar reglas de scrubbing, que determinan la normalización IP y TCP, (cosa que netfilter no realiza de la mejor manera) y una vez para las reglas pass o block. Por lo cual, podemos determinar que evaluar reglas de filtrado, es mas caro computacionalmente, que la búsqueda de estados.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mi punto a favor de los firewalls basados en estados.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;u&gt;Material de referencia:&lt;/u&gt;&lt;br /&gt;Les recomiendo el siguiente material de lectura para ampliar lo expresado en este post.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.benzedrine.cx/pf-paper.html" target="_blank"&gt;Design and Performance of the OpenBSD Stateful Packet Filter (pf)&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://home.nuug.no/%7Epeter/pf/en/" target="_blank"&gt;Firewalling with OpenBSD's PF packet filter.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.openbsd.org/faq/pf/" target="_blank"&gt;PF: The OpenBSD Packet Filter&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-7601986251113158573?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/7601986251113158573/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/12/unix-stateful-firewalls-vs-non-stateful.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/7601986251113158573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/7601986251113158573'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/12/unix-stateful-firewalls-vs-non-stateful.html' title='Unix: Stateful firewalls vs. Non-Stateful firewalls'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-rYWTWwOxrNs/Tv63UIa_WrI/AAAAAAAAGJw/NCAkjkFOoX0/s72-c/Imagen1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-5811493319461300278</id><published>2011-12-25T14:06:00.000-08:00</published><updated>2011-12-25T14:34:37.254-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Hat'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='CentOS'/><category scheme='http://www.blogger.com/atom/ns#' term='TCP Wrappers'/><category scheme='http://www.blogger.com/atom/ns#' term='FreeBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='AIX'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='HP-UX'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><title type='text'>Linux: Determine if a program is using TCPWrappers</title><content type='html'>&lt;b&gt;TCP Wrappers&lt;/b&gt; es un sistema de ACL's basado en hosts y redes, multiplataforma; Que permite o deniega la acceso a un demonio en un sistema a ciertos hosts o redes, Su configuración se realiza editando los archivos /etc/hosts.allow y /etc/hosts.deny mediante el host o las redes que queremos permitir o denegar y las claves ALL, LOCAL, UNKNOW, KNOW y PARANOID.&lt;br /&gt;&lt;br /&gt;Que un demonio utilice TCP Wrappers significa que el mismo fue compilado y linkeado contra libwrap.so y podemos determinarlo simplemente haciendo uso de ldd. Por ejemplo, podemos ver que SSH utiliza TCP Wrappers:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# ldd $(which sshd) | grep libwrap&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;libwrap.so.0 =&amp;gt; /lib64/libwrap.so.0 (0x00002aae2628b000)&lt;/blockquote&gt;&lt;div&gt;Y que Apache (httpd) no:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;# ldd $(which httpd) | grep libwrap&lt;br /&gt;#&lt;/blockquote&gt;&lt;div&gt;A raíz de esto podemos determinar las reglas a escribir cuando queremos permitir o denegar el acceso a un servicio desde una porción de red o host determinado.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Por ejemplo si queremos denegar el acceso a SSH, excepto desde la red 192.168.10.0/24 podemos escribir en /etc/hosts.deny la siguiente regla:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;sshd: ALL EXCEPT 192.168.10.0/255.255.255.0&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-5811493319461300278?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/5811493319461300278/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/12/linux-determine-if-program-is-using.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5811493319461300278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5811493319461300278'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/12/linux-determine-if-program-is-using.html' title='Linux: Determine if a program is using TCPWrappers'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-3695209729350551930</id><published>2011-12-23T23:19:00.000-08:00</published><updated>2011-12-23T23:27:19.831-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FreeBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='ALTQ'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='Packet Filter'/><title type='text'>FreeBSD: Enabling ALTQ support for PF queues</title><content type='html'>Hace unos días, en &lt;b&gt;&lt;a href="http://www.dc-solutions.com.ar/" target="_blank"&gt;DC Solutions&lt;/a&gt;&lt;/b&gt; migramos en un cliente un Firewall que utilizaba FreeBSD/IPFilter, a FreeBSD/Packet Filter a fin de poder soportar queues para permitiri una priorización del tráfico VoIP y además aliviar el bug descrito en este post&amp;nbsp;&lt;a href="http://codigounix.blogspot.com/2011/09/freebsd-ipf-nat-entry-dupplication-on.html" target="_blank"&gt;IPF NAT entry causes kernel crash.&lt;/a&gt;&amp;nbsp;No voy a describir las ventajas de utilizar una tecnología como PF sobre IPF, sino que solo voy a comentarles como darle soporte a las queues dentro del kernel de FreeBSD, el cual no se encuentra soportado dentro del kernel instalado con el sistema operativo.&lt;br /&gt;&lt;br /&gt;Al intentar levantar las reglas de PF si no hay soporte a ALTQ en el kernel se puede encontrar el siguiente mensaje de error:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="background-color: white; font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px;"&gt;No ALTQ support in kernel&lt;/span&gt;&lt;br style="background-color: white; font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px;" /&gt;&lt;span style="background-color: white; font-family: verdana, geneva, lucida, 'lucida grande', arial, helvetica, sans-serif; font-size: 13px;"&gt;ALTQ related functions disabled&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Como primer punto, debemos tener las fuentes del kernel instaladas en el equipo, para ello pueden utilizar sysinstall (como describo en la primera parte de este &lt;a href="http://codigounix.blogspot.com/2011/11/freebsd-supporting-dtrace.html" target="_blank"&gt;post&lt;/a&gt;), y así tenerlas instaladas bajo /usr/src.&lt;br /&gt;&lt;br /&gt;Una vez instaladas procedemos a modificar el archivo de configuración del kernel, que debería encontrarse en&amp;nbsp;/usr/src/sys/$(uname -m)/conf/GENERIC. Lo que debemos hacer es copiar dicho archivo con un nuevo nombre, por ejemplo FIREWALL:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# cp /usr/src/$(uname -m)/conf/GENERIC&amp;nbsp;/usr/src/$(uname -m)/conf/FIREWALL&lt;/blockquote&gt;Y procedemos a parchear el archivo de configuración FILE, modificando la línea ident y añadiendo las siguientes líneas del tipo options, para dar soporte a los queues y sus diferentes tipos:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;------ BEGIN ALTQ.patch&amp;nbsp;------&lt;br /&gt;24c24&lt;br /&gt;&amp;lt; ident&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;GENERIC&lt;br /&gt;---&lt;br /&gt;&amp;gt; ident&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;FIREWALL&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;78a79,87&lt;br /&gt;&amp;gt; # Altq Support - added by FMDLC&lt;br /&gt;&amp;gt; options &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;ALTQ&lt;br /&gt;&amp;gt; options &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;ALTQ_CBQ&lt;br /&gt;&amp;gt; options &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;ALTQ_RED&lt;br /&gt;&amp;gt; options &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;ALTQ_RIO&lt;br /&gt;&amp;gt; options &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;ALTQ_HFSC&lt;br /&gt;&amp;gt; options &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;ALTQ_CDNR&lt;br /&gt;&amp;gt; options &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;ALTQ_PRIQ&lt;br /&gt;&amp;gt;&lt;br /&gt;------ EOF ALTQ.patch&amp;nbsp;------&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;# patch -p0 /usr/src/$(uname -m)/conf/FIREWALL &amp;lt; /tmp/ALTQ.patch&amp;nbsp;&lt;/blockquote&gt;Luego procedemos a recompilar el kernel indicandole la ubicación de el nuevo archivo de configuración.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# cd /usr/src&lt;br /&gt;# make buildkernel KERNCONF=FIREWALL&lt;/blockquote&gt;Una vez compilado procedemos a instalarlo y rebootear el equipo.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# make installkernel KERNCONF=FIREWALL &amp;amp;&amp;amp; reboot&lt;/blockquote&gt;Una vez booteado el nuevo kernel podemos hacer el pfctl sin errores:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# kldload pf &amp;amp;&amp;amp; pfctl -e -Fa -f /etc/pf.conf&lt;br /&gt;rules cleared&lt;br /&gt;nat cleared&lt;br /&gt;2 tables deleted.&lt;br /&gt;altq cleared&lt;br /&gt;0 states cleared&lt;br /&gt;source tracking entries cleared&lt;br /&gt;pf: statistics cleared&lt;br /&gt;pf: interface flags reset&lt;br /&gt;pfctl: pf already enabled&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-3695209729350551930?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/3695209729350551930/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/12/freebsd-enabling-altq-support-for-pf.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/3695209729350551930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/3695209729350551930'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/12/freebsd-enabling-altq-support-for-pf.html' title='FreeBSD: Enabling ALTQ support for PF queues'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-964223275481706672</id><published>2011-11-30T12:31:00.001-08:00</published><updated>2011-12-01T03:58:57.812-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Storage'/><category scheme='http://www.blogger.com/atom/ns#' term='Filesystem'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='HP-UX'/><category scheme='http://www.blogger.com/atom/ns#' term='LVM'/><title type='text'>HP-UX: Working with SAN LUN's and LVM</title><content type='html'>Las redes de storage se integran cada día más como una de las tecnologías que mas fuertemente se utilizan en los datacenters. HP-UX si bien es un OS horrible (a gusto personal), sigue teniendo gran repercusión en entornos enterprise. Muchos de estos equipos trabajan con LUN's exportadas desde un storage, como puede ser un HP EVA y más de una vez se me ha hecho necesario trabajar con ellas. En este texto, voy a comentarles como reescanear las LUN's exportadas (partiendo desde el principio que el equipo tiene una HBA), y como crear Physical Volumes, Volumen Groups y Logical Volumes con estas en HP-UX 11.31.&lt;br /&gt;&lt;br /&gt;Como consejo, si la LUN que queremos presentarle al server, es demasiado grande, y tenemos la intención de crear un solo LV con ella, es recomendable elegir un tamaño grande de LE, &amp;gt;= 8, o mas conveniente aún (para futuros resizes) &amp;gt;= 16, aunque esto puede impactar en la performance del filesystem creado en ella dependiendo el tipo de datos que contengamos. Si utilizamos tamaños chicos de LE (4 Mb.) y la LUN es demasiado grande, superaremos el límite establecido por el OS de LE máximos por LV y tendremos problemas (lo digo por experiencia :-P). Comenzemos:&lt;br /&gt;&lt;br /&gt;Como primera medida, tenemos que tener las LUN creadas y presentadas en el storage (suponiendo que estamos utilizando FCoE o FC-SW). Una vez que esto es realizado, procedemos a reescanear las LUN's que ve el equipo con ioscan:&lt;br /&gt;&lt;br /&gt;# ioscan -funC disk&lt;br /&gt;&lt;br /&gt;Class &amp;nbsp; &amp;nbsp; I &amp;nbsp;H/W Path &amp;nbsp; &amp;nbsp; &amp;nbsp;Driver &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; S/W State &amp;nbsp; H/W Type &amp;nbsp; &amp;nbsp; Description&lt;br /&gt;===============================================================================&lt;br /&gt;disk &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp;0/0/2/1.0.16 &amp;nbsp;UsbScsiAdaptor &amp;nbsp; CLAIMED &amp;nbsp; &amp;nbsp; DEVICE &amp;nbsp; &amp;nbsp; &amp;nbsp; USB SCSI Stack Adaptor&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/deviceFileSystem/Usb/MassStorage/dsk/disk@hp-1008+294=A60020000001&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/deviceFileSystem/Usb/MassStorage/rdsk/disk@hp-1008+294=A60020000001&lt;br /&gt;disk &amp;nbsp; &amp;nbsp; &amp;nbsp;2 &amp;nbsp;0/1/1/0.0.0.0.0 &amp;nbsp; &amp;nbsp; &amp;nbsp;sdisk &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CLAIMED &amp;nbsp; &amp;nbsp; DEVICE &amp;nbsp; &amp;nbsp; &amp;nbsp; HP &amp;nbsp; &amp;nbsp; &amp;nbsp;DG072BB975&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/dsk/c0t0d0 &amp;nbsp; &amp;nbsp; /dev/dsk/c0t0d0s2 &amp;nbsp; /dev/rdsk/c0t0d0 &amp;nbsp; &amp;nbsp;/dev/rdsk/c0t0d0s2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/dsk/c0t0d0s1 &amp;nbsp; /dev/dsk/c0t0d0s3 &amp;nbsp; /dev/rdsk/c0t0d0s1 &amp;nbsp;/dev/rdsk/c0t0d0s3&lt;br /&gt;disk &amp;nbsp; &amp;nbsp; &amp;nbsp;3 &amp;nbsp;0/1/1/0.0.0.1.0 &amp;nbsp; &amp;nbsp; &amp;nbsp;sdisk &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CLAIMED &amp;nbsp; &amp;nbsp; DEVICE &amp;nbsp; &amp;nbsp; &amp;nbsp; HP &amp;nbsp; &amp;nbsp; &amp;nbsp;DG072BB975&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/dsk/c0t1d0 &amp;nbsp; &amp;nbsp; /dev/dsk/c0t1d0s2 &amp;nbsp; /dev/rdsk/c0t1d0 &amp;nbsp; &amp;nbsp;/dev/rdsk/c0t1d0s2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/dsk/c0t1d0s1 &amp;nbsp; /dev/dsk/c0t1d0s3 &amp;nbsp; /dev/rdsk/c0t1d0s1 &amp;nbsp;/dev/rdsk/c0t1d0s3&lt;br /&gt;disk &amp;nbsp; &amp;nbsp; 37 &amp;nbsp;0/2/1/0.2.0.0.0.0.1 &amp;nbsp;sdisk &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CLAIMED &amp;nbsp; &amp;nbsp; DEVICE &amp;nbsp; &amp;nbsp; &amp;nbsp; HP &amp;nbsp; &amp;nbsp; &amp;nbsp;HSV200&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/dsk/c12t0d1 &amp;nbsp; /dev/rdsk/c12t0d1&lt;br /&gt;disk &amp;nbsp; &amp;nbsp; 39 &amp;nbsp;0/2/1/0.2.0.0.0.0.3 &amp;nbsp;sdisk &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CLAIMED &amp;nbsp; &amp;nbsp; DEVICE &amp;nbsp; &amp;nbsp; &amp;nbsp; HP &amp;nbsp; &amp;nbsp; &amp;nbsp;HSV200&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/dsk/c12t0d3 &amp;nbsp; /dev/rdsk/c12t0d3&lt;br /&gt;disk &amp;nbsp; &amp;nbsp; 40 &amp;nbsp;0/2/1/0.2.0.0.0.0.5 &amp;nbsp;sdisk &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CLAIMED &amp;nbsp; &amp;nbsp; DEVICE &amp;nbsp; &amp;nbsp; &amp;nbsp; HP &amp;nbsp; &amp;nbsp; &amp;nbsp;HSV200&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/dsk/c12t0d5 &amp;nbsp; /dev/rdsk/c12t0d5&lt;br /&gt;disk &amp;nbsp; &amp;nbsp; 33 &amp;nbsp;0/2/1/0.2.4.0.0.0.1 &amp;nbsp;sdisk &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CLAIMED &amp;nbsp; &amp;nbsp; DEVICE &amp;nbsp; &amp;nbsp; &amp;nbsp; HP &amp;nbsp; &amp;nbsp; &amp;nbsp;HSV200&lt;br /&gt;&lt;br /&gt;Bien, ya tenemos todo reescaneado, notesé que por cuestiones de comodidad de lectura acorte la salida que es muchísimo más larga y así de desprolija. Ahora tenemos que crear las entradas correspondientes en /dev/disk/, de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# insf -e&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora es posible que necesitemos identificar, los discos exportados, por lo cual podemos hacer esto mediante su WWN o World Wide Name, de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# scsimgr -p get_attr all_lun -a device_file -a wwid -a state&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/dev/rdisk/disk20:0x600508b40006d93d0000c000001c0000:ONLINE&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/dev/rdisk/disk21:0x600508b40006d93d0000c00000170000:ONLINE&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/dev/rdisk/disk22:0x600508b40006d93d0000c00000210000:ONLINE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este caso vemos que disk20, disk21, y disk22 son las LUNs, y podemos revisar en el storage su WWN para identificar cual es cada una.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;Si queremos escanear los adaptadores de Fiber Channel, hacemos:&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace, 'Courier New';"&gt;ioscan -fnC fc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En cambio si necesitamos consultar los WWN de las HBA's, podemos hacer:&lt;br /&gt;&lt;br /&gt;#&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: monospace, 'Courier New';"&gt;fcmsutil /dev/fcd0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ahora procederemos a trabajar con LVM, para ello, podemos utilizar SAM (o SMH) o hacerlo directamente desde la línea de comandos, nosotros elegimos esta última. Lo primero es inicializar a los discos como PV, para ello utilizaremos pvcreate:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# pvcreate /dev/dsk/dsk{20,21,22}&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Una vez creados los PV, vamos a crear el VolumenGroup que se va a llamar vgfoobar, para ello, tal como en Linux, vamos a utilizar vgcreate:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# vgcreate vgfoobar /dev/dsk/disk{20,21,22}&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si esto falla, probablemente necesitemos preparar el device file en /dev, de la siguiente forma&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# mkdir /dev/vgfoobar/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# cd /dev/vgfoobar/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# mknod group c 64 0x010000&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Ahora ya estamos en condiciones de crear los LV que hagan falta, una de las cosas que suckea de LVM en HP-UX es que tenemos que especificarle la capacidad de los LV en Mb o LE. Por lo cual por cuestiones de redondeo nosotros crearemos uno de 10.000 Mb.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# lvcreate -n lvexample -L 10000 vgfoobar&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Y listo ya tenemos nuestro LV creado, podremos crear todos los que hagan falta. Ahora solo nos queda darle formato, en este caso bajo VxFS:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# newfs -F vxfs /dev/vgfoobar/lvexample&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Nuestro LV debería montar en /mnt, en caso de elegir otro mountpoint debemos crearlo previamente (con mkdir), caso contrario, procedemos a montarlo directamente:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# mount /dev/vgfoobar/lvexample /mnt&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Si queremos que persista a los reboots, debemos agregarlo al /etc/fstab como se muestra a continuación:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: 12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;/dev/vgfoobar/lvexample /mnt vxfs delaylog 0 2&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-964223275481706672?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/964223275481706672/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/hp-ux-working-with-san-luns-and-lvm.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/964223275481706672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/964223275481706672'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/hp-ux-working-with-san-luns-and-lvm.html' title='HP-UX: Working with SAN LUN&apos;s and LVM'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-4367443991595367476</id><published>2011-11-29T21:40:00.001-08:00</published><updated>2011-12-23T23:30:01.090-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Hat'/><category scheme='http://www.blogger.com/atom/ns#' term='CentOS'/><category scheme='http://www.blogger.com/atom/ns#' term='modules'/><category scheme='http://www.blogger.com/atom/ns#' term='Filesystem'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='LVM'/><title type='text'>Linux: Enabling LVM devices from live CD.</title><content type='html'>Hoy en mi trabajo tuve que resizear un volumen group donde se encontraba como LV el root filesystem (/) de un equipo con CentOS 5.4. Esta tarea no puede ser realizada en caliente, ya que consistía en reducir de 1.5 Tb. a 300 Gb. el volumen lógico del root filesystem (LVRoot) para después reducir el Volumen Group (VolGroup00).&lt;br /&gt;&lt;br /&gt;Uno de los problemas con que es común encontrarse es que toda la metadata de LVM esta disponible, por ejemplo utilizando pvdisplay, vgdisplay y lvdisplay; Pero en /dev no tenemos las entradas correspondientes al device mapper creadas (/dev/mapper/VolGroup00 y /dev/VolGroup00).&lt;br /&gt;Los pasos a seguir son los siguientes:&lt;br /&gt;&lt;br /&gt;En primer lugar debemos bootear el equipo con algún LiveCD, para este caso yo usé el de ArchLinux.&lt;br /&gt;Una vez booteado el equipo, procedemos a hacer el pvscan para identificar todos los physical devices:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#: pvscan&lt;br /&gt;PV /dev/sda2 &amp;nbsp; VG VolGroup00 &amp;nbsp; lvm2 [1.55 TB / 0 &amp;nbsp; &amp;nbsp;free]&lt;br /&gt;Total: 1 [1.55 TB] / in use: 1 [1.55 TB] / in no VG: 0 [0]&lt;/span&gt; &amp;nbsp;&amp;nbsp;&lt;/blockquote&gt;Y luego el vgscan:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#: vgscan&lt;br /&gt;Reading all physical volumes. This may take a while...&lt;br /&gt;Found volume group "VolGroup00" using metadata type lvm2&lt;/span&gt;&lt;/blockquote&gt;Una véz identificados tenemos que cambiar el estado del VolGroup00 a active, esto nos creara las entradas correspondientes en el /dev&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#: vgchange -a y VolGroup00&lt;br /&gt;/proc/misc: No entry for device-mapper found   Is device-mapper driver missing from kernel?&lt;br /&gt;Failure to communicate with kernel device-mapper driver.&lt;br /&gt;0 logical volume(s) in volume group "VolGroup00" now active&lt;/span&gt;&lt;/blockquote&gt;Pero como vemos, esto falla, lo que está sucediendo es que no tenemos cargados los módulos de device-mapper, por lo cual debemos cargarlos manualmente.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#: modprobe -l | grep dm-&lt;br /&gt;/lib/modules/2.6.18-238.5.1.el5/kernel/drivers/md/dm-crypt.ko&lt;br /&gt;/lib/modules/2.6.18-238.5.1.el5/kernel/drivers/md/dm-mirror.ko&lt;br /&gt;/lib/modules/2.6.18-238.5.1.el5/kernel/drivers/md/dm-mod.ko&lt;br /&gt;/lib/modules/2.6.18-238.5.1.el5/kernel/drivers/md/dm-multipath.ko&lt;br /&gt;/lib/modules/2.6.18-238.5.1.el5/kernel/drivers/md/dm-snapshot.ko&lt;br /&gt;#: modprobe dm-mod&lt;br /&gt;#: modprobe dm-snapshot&lt;/span&gt;&lt;/blockquote&gt;Y ahora si repetimos el vgchange esto va a funcionar, y las entradas correspondientes en /dev van a ser creadas, para así poder trabajar:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#: vgchange -a y VolGroup00&lt;br /&gt;6 logical volume(s) in volume group "VolGroup00" now active&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-4367443991595367476?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/4367443991595367476/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/linux-enabling-lvm-devices-from-live-cd.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/4367443991595367476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/4367443991595367476'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/linux-enabling-lvm-devices-from-live-cd.html' title='Linux: Enabling LVM devices from live CD.'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-3918174618007067552</id><published>2011-11-10T21:27:00.001-08:00</published><updated>2011-11-10T22:00:53.542-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Hat'/><category scheme='http://www.blogger.com/atom/ns#' term='CentOS'/><category scheme='http://www.blogger.com/atom/ns#' term='FTP'/><category scheme='http://www.blogger.com/atom/ns#' term='modules'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='IPTables'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><title type='text'>Linux: Connection tracking with FTP and IPTables</title><content type='html'>Uno de los problemas más comunes con que se puede encontrar un admin utilizando IPTables es a la hora de levantar un servidor FTP (como por ejemplo vsftpd). El cliente puede conectar al servidor, pero no puede realizar ninguna operación en el (como listar, o transferir archivos). FTP por general utiliza dos puertos, el &lt;b&gt;TCP/20&lt;/b&gt; para datos y el &lt;b&gt;TCP/21&lt;/b&gt; para comandos; Aunque no siempre es de esa forma, sobre todo si se está detrás de un firewall.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;El modo activo:&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;El cliente se conecta desde un puerto no privilegiado (N &amp;gt;1023) al puerto de control del servidor (21).&lt;/li&gt;&lt;li&gt;El cliente comienza a escuchar el puerto N + 1.&lt;/li&gt;&lt;li&gt;El servidor se conectará al puerto N + 1 desde su puerto de datos (TCP/20).&lt;/li&gt;&lt;li&gt;El cliente responderá con un ACK al servidor.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;&lt;u&gt;El modo pasivo:&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;El cliente abre dos puertos aleatorios ( N &amp;gt; 1023 &amp;nbsp;y N + 1).&lt;/li&gt;&lt;li&gt;El primer puerto (utilizado para control) se conecta al puerto 21 del servidor y envía el comando PASV.&lt;/li&gt;&lt;li&gt;Luego el servidor abre un puerto no privilegiado ( P &amp;gt; 1023 ) y envía PORT P al cliente.&amp;nbsp;&lt;/li&gt;&lt;li&gt;El cliente inicia una conexión desde el puerto N + 1 al puerto P del servidor para transferir datos.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Como notaran, hacer un seguimiento de los estados de las conexiones es una tarea complicada, si solamente queremos mantener abierto el puerto 21 para todas las conexiones entrantes, y no abrir rangos de puertos innecesarios podemos hacer uso del &lt;b&gt;connection_tracking&lt;/b&gt; de Netfilter.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Bien sabemos que las conexiones pueden tener diferentes estados (podemos verlo en la salida de netstat):&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;NEW: Un cliente intentando establecer una nueva conexión.&lt;/li&gt;&lt;li&gt;ESTABLISHED: Una conexión ya establecida.&amp;nbsp;&lt;/li&gt;&lt;li&gt;RELATED: Una conexión haciendo un nuevo request pero que ya es parte de otra conexión establecida.&lt;/li&gt;&lt;li&gt;INVALID: Si no es ninguno de los tres estados anteriores, la conexión es invalida.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Desde kernels 2.4 connection_tracking es la habilidad que tiene Netfilter de mantener los estados de la conexión en memoria y recordar los estados de las conexiones como ESTABLISHED &amp;amp; NEW, como así también direcciones de origen y destino, como puertos.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Primero que nada debemos añadir la regla de IPTables necesaria para esto:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;-A INPUT -m state --state NEW,ESTABLISHED,RELATED --dport 21 -j ACCEPT&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;Para poder realizar el connection_tracking y evitar incluir múltiples reglas de firewall, podemos hacerlo utilizando dos módulos del kernel:&amp;nbsp;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# modprobe ip_conntrack&lt;br /&gt;# modprobe ip_conntrack_ftp&lt;/span&gt;&lt;/blockquote&gt;O podemos añadir esto de manera definitiva creando el archivo /etc/modprobe.d/conntrack.conf, con el siguiente contenido:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;alias conntrack ip_conntrack_ftp&lt;br /&gt;alias conntrack_ftp ip_conntrack_ftp&lt;/span&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-3918174618007067552?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/3918174618007067552/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/linux-connection-tracking-with-ftp-and.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/3918174618007067552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/3918174618007067552'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/linux-connection-tracking-with-ftp-and.html' title='Linux: Connection tracking with FTP and IPTables'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-5612293779343608115</id><published>2011-11-10T17:05:00.001-08:00</published><updated>2011-11-10T18:08:40.082-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FreeBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><category scheme='http://www.blogger.com/atom/ns#' term='DTrace'/><title type='text'>FreeBSD: Supporting DTrace</title><content type='html'>Hace unos días en marco del &lt;a href="http://www.bsdday.org/" target="_blank"&gt;BSDDay 2011&lt;/a&gt; asistí a una charla de&lt;b&gt; Fer Gleiser&lt;/b&gt; donde explicaba el uso de una herramienta increible como es DTracre. Así que partiendo de que tengo un FreeBSD instalado en mi notebook personal, decidí comenzar a aprender esta nueva herramienta.&lt;br /&gt;&lt;br /&gt;Como primera medida, es necesario tener instaladas las fuentes del kernel, por lo que para hacer esto, es necesario ejecutar sysinstall&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-mmcFWqb62VE/Trx1ZugMHwI/AAAAAAAAF_c/fbnw_qJ2mxA/s1600/Sysinstall1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="411" src="http://3.bp.blogspot.com/-mmcFWqb62VE/Trx1ZugMHwI/AAAAAAAAF_c/fbnw_qJ2mxA/s640/Sysinstall1.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Luego ingresar en Configure, seleccionar Distributions:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-2YGpaarn2g4/Trx1hWflWuI/AAAAAAAAF_k/fmAoXhON-P0/s1600/Sysinstall2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="504" src="http://2.bp.blogspot.com/-2YGpaarn2g4/Trx1hWflWuI/AAAAAAAAF_k/fmAoXhON-P0/s640/Sysinstall2.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Seleccionamos SRC:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Ll_fByp3bNQ/Trx1qW0vx6I/AAAAAAAAF_s/3HnUrKkrjMI/s1600/Sysinstall3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="462" src="http://4.bp.blogspot.com/-Ll_fByp3bNQ/Trx1qW0vx6I/AAAAAAAAF_s/3HnUrKkrjMI/s640/Sysinstall3.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Y finalmente sys, ya que base se encuentra instado por default:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-BOrIamqj6n0/Trx1zUJFJdI/AAAAAAAAF_0/vHyxLlwKY8s/s1600/Sysinstall4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="638" src="http://1.bp.blogspot.com/-BOrIamqj6n0/Trx1zUJFJdI/AAAAAAAAF_0/vHyxLlwKY8s/s640/Sysinstall4.jpg" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Una vez hecho esto damos OK, y comenzara a descomprimir las fuentes del kernel en /etc/src/sys&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-xpV0k_knyfc/Trx2ILKLfWI/AAAAAAAAF_8/-CBZovVL86g/s1600/Sysinstall5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="107" src="http://1.bp.blogspot.com/-xpV0k_knyfc/Trx2ILKLfWI/AAAAAAAAF_8/-CBZovVL86g/s400/Sysinstall5.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Una vez que este proceso está terminado, procedemos a compilar el kernel, al cual debemos modificarle algunos parámetros.&lt;br /&gt;&lt;br /&gt;En mi caso tengo instalado FreeBSD 8.2 sobre 64 bits, por lo cual debo editar su pertinente archivo de configuración que se encuentra en&amp;nbsp;/usr/src/sys/amd64/conf/GENERIC seteando los siguientes parámetros:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;options KDTRACE_HOOKS&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;options DDB_CTF&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;make&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;options DEBUG="-g"&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;makeoptions WITH_CTF=1&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;Guardamos el archivo de configuración bajo el nombre de DTRACE en el mismo directorio y procedemos a compilar el kernel.&amp;nbsp;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# make buildkernel KERNCONF=DTRACE&lt;br /&gt;# make installkernel KERNCONF=DTRACE&lt;br /&gt;# shutdown -r NOW&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;Una vez listo esto, y rebooteado el sistema, procedemos a cargar y verificar que los módulos de DTrace se encuentren funcionando&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;#&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;kldload dtraceall&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# kldstat | grep dtrace&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;0xffffffff81022000 396 &amp;nbsp; &amp;nbsp; &amp;nbsp;dtraceall.ko&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;0xffffffff81028000 131460 &amp;nbsp; dtrace.ko&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Ahora necesitamos setear unos parámetros en el /etc/make.conf para que el nuevo software compilado no sea strippeado y ademas sea compilado con &lt;b&gt;-f-no-omit-frame-pointer&lt;/b&gt;, para de esta manera mantener un registro de la posición del frame pointer, este es un registro de la CPU, que mantiene un record de la dirección de memoria donde se encuentra el último dato añadido al stack utilizando el método LIFO (Last In - Firt Out) (RSP en arquitecturas x86_64 y ESP en arquitecturas i386). Si make.conf no existe en /etc, copiamos un ejemplo de el:&amp;nbsp;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# cp&amp;nbsp;/usr/share/examples/etc/make.conf /etc/&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;Y añadimos las siguientes líneas al final:&lt;/div&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;STRIP=&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;CFLAGS+=-fno-omit-frame-pointer&lt;/span&gt;&lt;/blockquote&gt;Ahora, como paso opcional, podemos hacer un make buildworld. Lo primero es instalar cvsup:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# make search name=cvsup&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Port: cvsup-16.1h_4&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Path: /usr/ports/net/cvsup&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Info: File distribution system optimized for CVS&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Maint: &amp;nbsp;bzeeb+freebsdports@zabbadoz.net&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;B-deps:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;R-deps:&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;WWW: &amp;nbsp;http://www.cvsup.org/&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# cd /usr/port/net/cvsup &amp;amp;&amp;amp; make install clean&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una vez listo, si tenemos instalado el sistema base al hacer el cvsup es posible que fallé con el siguiente mensaje de error:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;cd: can't cd to /usr/src/usr.bin/make&lt;br /&gt;*** Error code 2&lt;br /&gt;&lt;br /&gt;Stop in /usr/src.&lt;br /&gt;*** Error code 1&lt;br /&gt;&lt;br /&gt;Stop in /usr/src.&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;Esto es debido a que el parámetro *default host del archivo de configuración de cvsup no se encuentra seteado, por lo cual reemplazamos este con la URI del mirror de que queremos descargar las fuentes:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# cp /usr/share/examples/cvsup/standard-supfile /root/standard-supfile&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# vi /root/standard-supfile&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Y modificamos el parámetro por la URI de un mirror de FreeBSD:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;*default host=cvsup4.us.FreeBSD.org&lt;/span&gt;&lt;/blockquote&gt;&lt;div&gt;Guardamos los cambios y procedemos a hacer el cvsup de la siguiente forma:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# cvsup /root/standard-supfile&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Una vez listo ya podemos hacer el make buildworld de la siguiente manera:&lt;br /&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# make WITH_CTF=1 buildworld&lt;br /&gt;# shutdown -r NOW&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Booteamos en single-user y ahora procedemos a instalar:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# boot -s&lt;br /&gt;# make installworld&lt;/span&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Listo, ya tenemos nuestr kernel y nuestro entorno con soporte a DTrace, ahora solo resta instalar el userland de la siguiente manera:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;# cd /usr/ports/sysutils/DTraceToolkit/ &amp;amp;&amp;amp; make install clean&lt;/span&gt;&lt;/blockquote&gt;Ahora si, ya podemos hacer uso de DTrace en nuestro sistema.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-5612293779343608115?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/5612293779343608115/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/freebsd-supporting-dtrace.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5612293779343608115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5612293779343608115'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/freebsd-supporting-dtrace.html' title='FreeBSD: Supporting DTrace'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-mmcFWqb62VE/Trx1ZugMHwI/AAAAAAAAF_c/fbnw_qJ2mxA/s72-c/Sysinstall1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-4025263195615882253</id><published>2011-11-08T21:00:00.000-08:00</published><updated>2011-11-08T21:48:48.321-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ZFS'/><category scheme='http://www.blogger.com/atom/ns#' term='FreeBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Filesystem'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><title type='text'>PoC: Playing with the ZFS compression</title><content type='html'>Como muchos sabrán, ZFS o ZettaByte filesystem es un sistema de 128 bits archivos diseñado por los ingenieros de Sun Microsystems para ser realmente grande,&amp;nbsp;Jeff Bonwick, el arquitecto jefe de Sun para ZFS, dijo&lt;b&gt; &lt;i&gt;"Llenar un sistema de archivos de 128 bits excedería los límites cuánticos de almacenamiento de la Tierra. No puedes rellenarlo sin hervir los océanos"&lt;/i&gt;&lt;/b&gt;. Una de las ventajas prácticas de ZFS es que integra el volume manager y el filesystem en un solo toolkit.&lt;br /&gt;&lt;br /&gt;En este post, trataré de hacer una prueba de conceptos sobre uno de los features más interesantes que tiene ZFS, que es la &lt;b&gt;compresión&lt;/b&gt;. Actualmente vivimos en una época en que el storage es un recurso barato, y el sentido de usar esta es mejorar de manera considerable el I/O del dataset, el dato al estar compreso ocupa menos, por lo cual se tienen que leer y escribir datos mas pequeños en el disco lo cual reduce la taza de I/O pero aumenta gradualmente la carga de las CPU's del equipo.&lt;br /&gt;&lt;br /&gt;Para este ejemplo sobre &lt;b&gt;FreeBSD 8.2&lt;/b&gt; 64 bits vamos a crear filedisks, iniciando un pool de discos con mdadm.&lt;br /&gt;Vamos manos a la obra:&lt;br /&gt;&lt;br /&gt;Como primera medida, vamos a darle soporte a ZFS en el sistema operativo (FreeBSD por default lo deshabilita), para ello tenemos que añadir el parámetro&amp;nbsp;vfs.zfs.prefetch_disable=0 en el /boot/loader.conf y rebootear el equipo.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;tokyo # echo "vfs.zfs.prefetch_disable=0" &amp;gt; /boot/loader.conf&lt;br /&gt;tokyo # reboot&lt;/blockquote&gt;Una vez hecho esto, vamos a crear los filedisk propiamente dichos, en este caso lo haremos en /tmp, y seran en total 5 con una capacidad de 200M cada uno (1GB en total de storage), lo que utilizando bloques de 1K, suman un total de 204800 bloques. Para ello utilizaremos dd. Repetimos lo siguiente para cada uno de los discos:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;tokyo # dd if=/dev/urandom of=/tmp/disk1 bs=1k count=204800&lt;br /&gt;204800+0 records in&lt;br /&gt;204800+0 records out&lt;br /&gt;209715200 bytes transferred in 4.909060 secs (42720032 bytes/sec)&lt;/blockquote&gt;Una vez listos los cinco filedisks, vamos a crear el pool usando mdadm, el parámetro -a hace un add del device dentro del pool, el parámetro -t indica el tipo de device (vnode: en este caso el filedisk), el parámetro -f indica la localización en el filesystem del vnode, y el parámetro -u el número de device a crear en /dev/.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;tokyo # mdconfig -a -t vnode -f /tmp/disk1 -u 1&lt;br /&gt;tokyo # mdconfig -a -t vnode -f /tmp/disk2 -u 2&lt;br /&gt;tokyo # mdconfig -a -t vnode -f /tmp/disk3 -u 3&lt;br /&gt;tokyo # mdconfig -a -t vnode -f /tmp/disk4 -u 4&lt;br /&gt;tokyo # mdconfig -a -t vnode -f /tmp/disk5 -u 5&lt;/blockquote&gt;Esto nos creara las correspondientes entradas de block devices bajo el nombre de /dev/mdX siendo X un número comprendido entre 1 y 5 correspondiente a los devices que inicializamos.&lt;br /&gt;&lt;br /&gt;Actualmente ya contamos todos los elementos para comenzar. &amp;nbsp;Lo primero que debemos hacer una vez que tenemos todo listo es crear un pool de ZFS, en este caso vamos a hacerlo utilizando RAIDZ 2; raidz es un esquema de redundancia integrada especial utilizado por ZFS, que es parecido a RAID 5 utilizando un stripe variable, esto es debido a que lo maneja el propio filesystem. RAIDZ 2 añade un bloque extra de paridad para dar aún mayor&amp;nbsp;redundancia&amp;nbsp;de datos. Creamos nuestro pool (llamado "foobar")&amp;nbsp;indicándole&amp;nbsp;los devices que estarán en el:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;tokyo # zpool create foobar raidz2 /dev/md{1,2,3,4,5}&lt;/blockquote&gt;Podemos verificar que todo fue creado de manera correcta utilizando zpool status:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;tokyo # zpool status&lt;br /&gt;pool: foobar&lt;br /&gt;state: ONLINE&lt;br /&gt;scrub: none requested&lt;br /&gt;config:&lt;br /&gt;&amp;nbsp; NAME &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;STATE &amp;nbsp; &amp;nbsp; READ WRITE CKSUM&lt;br /&gt;&amp;nbsp; foobar &amp;nbsp; &amp;nbsp; &amp;nbsp;ONLINE &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;&amp;nbsp; &amp;nbsp; raidz2 &amp;nbsp; &amp;nbsp;ONLINE &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; md1 &amp;nbsp; &amp;nbsp; ONLINE &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; md2 &amp;nbsp; &amp;nbsp; ONLINE &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; md3 &amp;nbsp; &amp;nbsp; ONLINE &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; md4 &amp;nbsp; &amp;nbsp; ONLINE &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; md5 &amp;nbsp; &amp;nbsp; ONLINE &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; 0&lt;br /&gt;errors: No known data errors&lt;/blockquote&gt;Bien, ahora procederemos a crear los filesystems utilizando los dos tipos de compresión soportados por ZFS: &lt;b&gt;lzjb&lt;/b&gt; y &lt;b&gt;gzip&lt;/b&gt;. En este ejemplo crearemos primero un filesystem sin compresión para poder diferenciar entre el uso de esta y el no uso. Para especificar la algoritmo de compresión a utilizar debemos pasarle con -o el parámetro compression=&amp;lt;lzjb|gzip-0-9|off&amp;gt;.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;tokyo # zfs create -o compression=off foobar/filesystem1&lt;br /&gt;tokyo # zfs create -o compression=lzjb foobar/filesystem2&lt;br /&gt;tokyo # zfs create -o compression=gzip-9 foobar/filesystem3&lt;/blockquote&gt;&lt;div&gt;En este caso, creamos los 3 filesystems. El primero (filesystem1) sin utilizar compresión alguna, el segundo (filesystem2) utilizando lzjb y el tercero (filesystem3) utilizando gzip un ratio de 9 (mayor compresión posible).&amp;nbsp;&lt;/div&gt;&lt;div&gt;Estos ya se encuentran montados y dentro del directorio /foobar (el nombre del pool) y no necesitan ser añadidos al /etc/fstab (FreeBSD) o /etc/vfstab (en el caso de Solaris).&amp;nbsp;&lt;/div&gt;&lt;div&gt;Podemos comprobar la correcta creación de los mismos haciendo un zfs list:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;tokyo # zfs list&lt;br /&gt;NAME &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; USED &amp;nbsp;AVAIL &amp;nbsp;REFER &amp;nbsp;MOUNTPOINT&lt;br /&gt;foobar &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 281K &amp;nbsp; 549M &amp;nbsp;42.9K &amp;nbsp;/foobar&lt;br /&gt;foobar/filesystem1 &amp;nbsp;37.5K &amp;nbsp; 549M &amp;nbsp;37.5K &amp;nbsp;/foobar/filesystem1&lt;br /&gt;foobar/filesystem2 &amp;nbsp;37.5K &amp;nbsp; 549M &amp;nbsp;37.5K &amp;nbsp;/foobar/filesystem2&lt;br /&gt;foobar/filesystem3 &amp;nbsp;37.5K &amp;nbsp; 549M &amp;nbsp;37.5K &amp;nbsp;/foobar/filesystem3&lt;/blockquote&gt;&lt;div&gt;En el directorio /tmp, cuento con un archivo llamado foobar.tar de unos 56Mb, vamos a copiar este a los tres filesystem que acabamos de crear para ver como se comportan:&lt;/div&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;tokyo # du -sh /tmp/foobar.tar&lt;br /&gt;&amp;nbsp;56M &amp;nbsp;foobar.tar&lt;br /&gt;tokyo # cp foobar.tar /foobar/filesystem1/&lt;br /&gt;tokyo # cp foobar.tar /foobar/filesystem2/&lt;br /&gt;tokyo # cp foobar.tar /foobar/filesystem3/&lt;/blockquote&gt;&lt;div&gt;Una vez listo esto, podemos mirar cuanto pesa cada filesystem con el mismo archivo copiado en cada uno.&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;tokyo # du -sh /foobar/filesystem{1,2,3}&lt;br /&gt;&amp;nbsp;56M &amp;nbsp;/foobar/filesystem1&lt;br /&gt;&amp;nbsp;18M &amp;nbsp;/foobar/filesystem2&lt;br /&gt;7.1M &amp;nbsp;/foobar/filesystem3&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;En el primer caso, sin compresión el filesystem pesa exactamente el tamaño del archivo foobar.tar &lt;b&gt;56M&lt;/b&gt;, en el segundo caso utilizando lzjb, pesa &lt;b&gt;18M&lt;/b&gt; (38M menos), y en el tercer caso utilizando gzip con un ratio de compresión de 9, el mismo pesa solo &lt;b&gt;7.1M&lt;/b&gt; (48.9M menos).&lt;/div&gt;&lt;div&gt;Ahora saquen sus propias conclusiones sobre uno de los increibles features con los que cuenta ZFS!.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-4025263195615882253?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/4025263195615882253/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/poc-playing-with-zfs-compression.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/4025263195615882253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/4025263195615882253'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/poc-playing-with-zfs-compression.html' title='PoC: Playing with the ZFS compression'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-8749821586617744327</id><published>2011-11-07T15:20:00.000-08:00</published><updated>2011-11-07T15:20:09.352-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Filesystem'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Superblock'/><title type='text'>Linux: Recovering a corrupt superblock</title><content type='html'>Una de las estructuras más básicas del filesystem son los bloques. Estos pueden ser utilizados para dos propósitos: El primero de ellos guardar datos, el segundo almacenar metadata que referencien a dichos datos.&lt;br /&gt;&lt;br /&gt;En otras palabras, la metadata, describe la estructura del filesystem como así también sus atributos.&lt;br /&gt;Existe un bloque muy importante en los filesystem denominado &lt;b&gt;superblock&lt;/b&gt;, este bloque contiene toda la información referida a dicho sistema de archivos, y es en quien se fija el sistema a la hora de montarlo. Por ejemplo el contendrá la cantidad de inodos, los grupos de bloques, el tipo del filesystem, el estado, el tamaño, etc. Su ubicación varía dependiendo del tamaño de bloque usado, por default este tamaño es de 1024 bytes, pero esto varía entre 2048, o 4096.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-d3rcO4vtJ54/Trhkt1F6_0I/AAAAAAAAF_U/OsbG8JNuMWk/s1600/SuperBlock.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="157" src="http://1.bp.blogspot.com/-d3rcO4vtJ54/Trhkt1F6_0I/AAAAAAAAF_U/OsbG8JNuMWk/s400/SuperBlock.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Al momento de crearse el filesystem, se guardan varias copias de este superblock primario en distintos grupos de bloques, que pueden ser accedidas para su posterior recuperación en caso de que el mismo se corrompa. &amp;nbsp;El comando &lt;b&gt;&lt;i&gt;dumpe2fs&lt;/i&gt;&lt;/b&gt; puede ayudarnos con esto, localizando donde se encuentran almacenados los distintos backups de el superblock:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# dumpe2fs /dev/sda1 | grep -i Backup&lt;br /&gt;dumpe2fs 1.41.14 (22-Dec-2010)&lt;br /&gt;Journal backup: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; inode blocks&lt;br /&gt;&amp;nbsp; Backup superblock at 32768, Group descriptors at 32769-32769&lt;br /&gt;&amp;nbsp; Backup superblock at 98304, Group descriptors at 98305-98305&lt;br /&gt;&amp;nbsp; Backup superblock at 163840, Group descriptors at 163841-163841&lt;br /&gt;&amp;nbsp; Backup superblock at 229376, Group descriptors at 229377-229377&lt;/blockquote&gt;En este caso vemos que existen backups de dicho superblock en los bloques 32768, 98304, 163840 y 229376, por lo cual, como dijimos si este superblock se corrompe podemos recuperarlo de manera relativamente sencilla.&lt;br /&gt;Para ello, booteamos con singleuser (en el caso de que sea el root filesystem el que se corrompio), y con el filesystem desmontado hacemos &lt;i&gt;fsck&lt;/i&gt;. elijiendo alguna copía de dicho superblock para restaurar:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# e2fsck &amp;nbsp;-f -b 98304 /dev/sda1&lt;/blockquote&gt;Una vez que esto termine, podemos rebootear nuestro sistema y tendremos nuestro superblock recuperado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-8749821586617744327?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/8749821586617744327/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/linux-recovering-corrupt-superblock.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/8749821586617744327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/8749821586617744327'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/linux-recovering-corrupt-superblock.html' title='Linux: Recovering a corrupt superblock'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-d3rcO4vtJ54/Trhkt1F6_0I/AAAAAAAAF_U/OsbG8JNuMWk/s72-c/SuperBlock.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-3119944736301532500</id><published>2011-11-06T11:47:00.000-08:00</published><updated>2011-11-06T20:24:43.901-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Hat'/><category scheme='http://www.blogger.com/atom/ns#' term='CentOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache'/><category scheme='http://www.blogger.com/atom/ns#' term='SELinux'/><title type='text'>Red Hat / CentOS: Running Apache with SELinux on a nonstandard port</title><content type='html'>En el post anterior explique los fundamentos para hacer correr SELinux con enforcing en virtualhosts fuera del directorio /var/www.&lt;br /&gt;Ahora supongamos que queremos ejecutar también utilizando SELinux en enforcing Apache en un puerto diferente al 80, por ejemplo el 1080. Sabemos que utilizando un puerto menor a 1023 debemos utilizar root para poder iniciar httpd.&lt;br /&gt;&lt;br /&gt;Lo primero que debemos hacer es cambiar la configuración del puerto en el archivo /etc/httpd/conf/httpd.conf.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# sed -i 's/Listen\ 80/Listen\ 1080/g' /etc/httpd/conf/httpd.conf&lt;/blockquote&gt;Verificamos el modo de SELinux, y nos encontramos que estamos en Enforcing:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# getenforce&lt;br /&gt;1&lt;/blockquote&gt;Ahora si queremos iniciar Apache, este va a fallar, ya que el puerto 1080 no esta permitido por SELinux para escuchar conexiones de httpd. Por lo cual con el paquete policycoreutils-python previamente instalado hacemos uso de semanage:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# semange port -a -t http_port_t -p tcp 1080&lt;/blockquote&gt;Con esto permitimos que httpd pueda escuchar en el puerto 1080. Ahora si verificamos con semanage port -l vemos que el puerto 1080 se lista:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# semanage port -l&lt;br /&gt;http_cache_port_t &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tcp &amp;nbsp; &amp;nbsp; &amp;nbsp;8080, 8118, 8123, 10001-10010&lt;br /&gt;http_cache_port_t &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; udp &amp;nbsp; &amp;nbsp; 3130&lt;br /&gt;http_port_t &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tcp &amp;nbsp; &amp;nbsp; &amp;nbsp;80, 443, 488, 8008, 8009, 8443, 1080&lt;br /&gt;pegasus_http_port_t &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tcp &amp;nbsp; &amp;nbsp; &amp;nbsp;5988&lt;br /&gt;pegasus_https_port_t &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tcp &amp;nbsp; &amp;nbsp; 5989&lt;/blockquote&gt;&lt;div&gt;Si reiniciamos el servicio httpd vamos a ver que este levanta correctamente y ya podemos utilizar Apache en un puerto diferente.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-3119944736301532500?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/3119944736301532500/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/red-hat-centos-running-apache-with.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/3119944736301532500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/3119944736301532500'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/red-hat-centos-running-apache-with.html' title='Red Hat / CentOS: Running Apache with SELinux on a nonstandard port'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-309202380965934078</id><published>2011-11-06T11:20:00.000-08:00</published><updated>2011-11-08T21:53:41.338-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Hat'/><category scheme='http://www.blogger.com/atom/ns#' term='CentOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache'/><category scheme='http://www.blogger.com/atom/ns#' term='SELinux'/><title type='text'>Red Hat/CentOS: SELinux for Apache virtualhosts</title><content type='html'>Sabemos que los virtualhost se utilizan para poder alojar en un mismo webserver, con una única IP, varios sitios webs. Muchos administradores de hosting que implementan esto sobre Red Hat o CentOS, al momento de la instalación desactivan SELinux para evitar conflictos de acceso a los distintos recursos del sistema.&lt;br /&gt;&lt;br /&gt;SELinux por trabaja en dos modos, &lt;b&gt;Enforcing&lt;/b&gt;, en el cual por default todo se deniega, y se permite acceso únicamente a lo que se explicitamente permitido, y &lt;b&gt;Permissive&lt;/b&gt;, en lo cual por default todo se deniega, pero en vez de bloquear el acceso, simplemente notifica esto en los logs (/var/log/messages y /var/log/audit/audit.log) y debe ser utilizado solamente para testing.&lt;br /&gt;Para verificar el estado de SELinux utilizamos el comando sestatus:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# sestatus&lt;br /&gt;SELinux status: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; enabled&lt;br /&gt;SELinuxfs mount: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/selinux&lt;br /&gt;Current mode: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; enforcing&lt;br /&gt;Mode from config file: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;enforcing&lt;br /&gt;Policy version: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 26&lt;br /&gt;Policy from config file: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;targeted&lt;/blockquote&gt;O mediante el comando getenforce:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# getenforce&lt;br /&gt;Enforcing&lt;/blockquote&gt;Para cambiar de Enforcing a Permisive en tiempo real podemos utilizar setenforce:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# setenforce 0&lt;br /&gt;# getenforce&lt;br /&gt;Permissive&lt;br /&gt;# setenforce 1&lt;br /&gt;# getenforce&lt;br /&gt;Enforcing&lt;/blockquote&gt;Si queremos saber como esta configurado en el sistema SELinux podemos revisar el archivo &lt;b&gt;/etc/sysconfig/selinux&lt;/b&gt; que es un link simbólico hacia &lt;b&gt;/etc/selinux/config&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# This file controls the state of SELinux on the system.&lt;br /&gt;# SELINUX= can take one of these three values:&lt;br /&gt;#&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;enforcing - SELinux security policy is enforced.&lt;br /&gt;#&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;permissive - SELinux prints warnings instead of enforcing.&lt;br /&gt;#&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;disabled - SELinux is fully disabled.&lt;br /&gt;SELINUX=enforcing&lt;br /&gt;# SELINUXTYPE= type of policy in use. Possible values are:&lt;br /&gt;#&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;targeted - Only targeted network daemons are protected.&lt;br /&gt;#&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;strict - Full SELinux protection.&lt;br /&gt;SELINUXTYPE=targeted&lt;/blockquote&gt;&lt;br /&gt;&lt;div&gt;Cualquier modificación que hagamos en este archivo, requiere que reiniciemos el sistema para poder aplicar los cambios.&lt;/div&gt;Un administrador, puede hacer uso de los directorios homes para contener los DocumentRoot de los usuarios, en un path que no es el originalmente permitido por SELinux (/var/www/), por lo cual debemos cambiar los permisos del mismo para poder acceder, veamos como hacer esto.&lt;br /&gt;&lt;br /&gt;Una vez que httpd se encuentre instalado en el servidor, es importante definir los virtualhost en el archivo de configuración de Apache (Al final de /etc/httpd/conf/httpd.conf o añadirlos al directorio /etc/httpd/conf.d).&lt;br /&gt;En este caso vamos a definir dos virutalhost, &lt;b&gt;virtualhost-1&lt;/b&gt; y &lt;b&gt;virtualhost-2&lt;/b&gt;:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&amp;lt;VirtualHost ip.address.of.virtualhost-1&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ServerAdmin webmaster@virtualhost-1.com&lt;br /&gt;&amp;nbsp; &amp;nbsp; DocumentRoot /home/user/www/virtualhost-1&lt;br /&gt;&amp;nbsp; &amp;nbsp; ServerName virtualhost-1&lt;br /&gt;&amp;nbsp; &amp;nbsp; ErrorLog logs/virtualhost-1-error_log&lt;br /&gt;&amp;nbsp; &amp;nbsp; CustomLog logs/host.virtualhost-1-access_log common&lt;br /&gt;&amp;lt;/VirtuailHost&amp;gt;&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;&amp;lt;VirtualHost ip.address.of.virtualhost-2&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ServerAdmin webmaster@virtualhost-2.com&lt;br /&gt;&amp;nbsp; &amp;nbsp; DocumentRoot /home/user/www/virtualhost-2&lt;br /&gt;&amp;nbsp; &amp;nbsp; ServerName virtualhost-2&lt;br /&gt;&amp;nbsp; &amp;nbsp; ErrorLog logs/virtualhost-2-error_log&lt;br /&gt;&amp;nbsp; &amp;nbsp; CustomLog logs/host.virtualhost-2-access_log common&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/blockquote&gt;Como vemos los DocumentRoot de ambos virtualhost no son los permitidos por SELinux (que intenta servir el contenido de /var/www o /srv), por lo cual al intentar acceder a los mismos vamos a obtener un error del tipo Forbidden, así que debemos permitirlos de manera explicita dentro de la policy de SELinux. Podemos verificar esto con semanage fcontext -l:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# semanage fcontext -l | grep httpd_&lt;br /&gt;/var/www(/.*)? &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;all files &amp;nbsp; system_u:object_r:httpd_sys_content_t:s0&lt;br /&gt;/var/www(/.*)?/logs(/.*)? all files &amp;nbsp; system_u:object_r:httpd_log_t:s0&lt;br /&gt;...&amp;nbsp;&lt;/blockquote&gt;Por lo cual, lo que tenemos que hacer es cambiar el contexto de dichos directorios, y vamos a realizar esto de manera recursiva para que afecte a todos los archivos que se encuentran en su interior. Para esto vamos a utilizar el comando chcon.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# chcon -R -v -u system_u -r object_r -t httpd_sys_content_t /home/user/www/virtualhost-{1,2}&lt;/blockquote&gt;El parámetro -R hace esto recursivo, -v es verbose, con -u se especifica el usuario (system_u), con -r se especifica el rol, y con -t el tipo, que para que caso de httpd es httpd_sys_content_t.&lt;br /&gt;Otra forma de lograr el mismo resultado es por referencia, esto es, pasandole como tal un directorio que tenga el contexto previamente configurado. Para esto utilizamos el parámetro --reference:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# chcon -R -v --reference=/var/www/html /home/user/www/virtualhost-{1,2}&lt;/blockquote&gt;Ahora, nuestra configuración persistirá a&amp;nbsp;través&amp;nbsp;de reboots, pero no soportaría un releabel (restorecon), por lo cual debemos commitear dichos cambios a la policy. Por lo cual, para esto, vamos a utilizar semange, dicho comando no se encuentra instalado por default en RHEL 6/CentOS 6, por lo cual debemos instalar el paquete&amp;nbsp;policycoreutils-python mediante yum o rpm.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;#&amp;nbsp;semanage fcontext -a -t httpd_sys_content_t "/home/user/www/virtualhost-1(/.*)?"&lt;br /&gt;#&amp;nbsp;semanage fcontext -a -t httpd_sys_content_t "/home/user/www/virtualhost-2(/.*)?"&lt;/blockquote&gt;&lt;div&gt;Ahora si hacemos un restorecon sobre los DocumentRoot de nuestros virtualhost vemos que soportan el relabel:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;#&amp;nbsp;restorecon -R -v /home/user/www/&lt;br /&gt;# ls -Z /home/user/virtualhost-{1,2}&lt;br /&gt;drwx------. root root system_u:object_r:httpd_sys_content_t:s0 virtualhost-1&lt;br /&gt;drwx------. root root system_u:object_r:httpd_sys_content_t:s0 virtualhost-2&lt;/blockquote&gt;&lt;div&gt;Pero esto todavía tiene una vuelta de tuerca más, para permitir el acceso de SELinux a la home, tenemos que modificar el valor de un booleano.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Para listar los booleanos, se pueden utilizar dos comandos, uno es getsebool y el otro, semanage, vamos a utilizar el segundo, ya que este nos provee además una breve descripción de lo que hace cada booleano:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;# semanage boolean -l | grep httpd&lt;br /&gt;httpd_can_network_relay &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; off &amp;nbsp; Allow httpd to act as a relay&lt;br /&gt;httpd_can_network_connect_db &amp;nbsp; -&amp;gt; off &amp;nbsp; Allow HTTPD scripts and modules to connect to databases.&lt;br /&gt;httpd_enable_homedirs &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; off &amp;nbsp; Allow httpd to read home directories&lt;br /&gt;...&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;El booleano que nos interesa es httpd_enable_homedirs, como cualquier booleano, tiene dos posibles valores, true o false, en este caso vemos que esta seteado en off; Por lo cual, vamos a cambiarle su valor a on utilizando setsebool y el parámetro -P para que persista atravéz de los reboots del sistema:&lt;/div&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;# setsebool -P httpd_enable_homedirs 1&lt;/blockquote&gt;&lt;div&gt;En caso de querer saber más acerca de la configuración de SELinux para cualquier deamon, es interesante ver las páginas de manual asociadas al mismo, para ello con man -k http | grep _selinux podemos listar estas:&lt;/div&gt;&lt;div&gt;&lt;blockquote class="tr_bq"&gt;# man -k httpd | grep _selinux&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class="tr_bq"&gt;httpd_selinux (8) &amp;nbsp; &amp;nbsp;- Security Enhanced Linux Policy for the httpd daemon&lt;/blockquote&gt;&lt;/div&gt;Ahora si se reinicia el servicio httpd, se podrá acceder a los vitualhost creados, fuera del DocumentRoot que por default se habilita en SELinux.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-309202380965934078?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/309202380965934078/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/red-hatcentos-selinux-for-apache.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/309202380965934078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/309202380965934078'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/red-hatcentos-selinux-for-apache.html' title='Red Hat/CentOS: SELinux for Apache virtualhosts'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-5212780522287766961</id><published>2011-11-06T08:32:00.000-08:00</published><updated>2011-11-06T08:51:27.982-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Hat'/><category scheme='http://www.blogger.com/atom/ns#' term='CentOS'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Debian'/><category scheme='http://www.blogger.com/atom/ns#' term='Networking'/><title type='text'>Linux: Identifying a physical network interface card</title><content type='html'>Hay momentos en los que es necesario identificar físicamente una interfaz de red, por ejemplo, cuando se debe cablear, o armar un bonding.&lt;br /&gt;&lt;br /&gt;Esto suele ser una tarea bastante compleja cuando trabajamos con una cantidad grande de servidores y distintos modelos de ellos, ya que los dispositivos pueden ser nombrados de manera distinta, y donde en un servidor es eth0, puede ser eth1. Existe una herramienta muy útil en Linux, que se denomina &lt;i&gt;ethtool.&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Para identificar una NIC, podemos encender el LED de ella durante un determinado periodo de tiempo, y de esa manera identificarla fácilmente, para realizar esto la sintaxis es la siguiente:&lt;br /&gt;&lt;i&gt;ethtool -p &amp;lt;interface&amp;gt; &amp;lt;timeout&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Por ejemplo, si queremos encender el LED de la interáz eth1 durante 30 segundos hacemos:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;#: ethtool -p eth1 30&lt;/i&gt;&lt;/blockquote&gt;Ahora si miramos la NIC, durante 30 segundos, tendra parpadeando su LED.&lt;br /&gt;Otra manera de hacer esto, es enchufando la interfaz de red y determinar si tiene link o no.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;#:&amp;nbsp;ethtool eth1 | grep Link&lt;br /&gt;Link detected: no&lt;/i&gt;&lt;/blockquote&gt;Cabe destacar que &lt;i&gt;ethtool&lt;/i&gt; deja obsoleta a herramientas como &lt;i&gt;mii-tool&lt;/i&gt;, que ya cumplieron su ciclo en GNU/Linux.&amp;nbsp;Para más información sobre las múltiples features de &lt;i&gt;ethtool&lt;/i&gt;, les recomiendo leer la manpage asociada al mismo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-5212780522287766961?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/5212780522287766961/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/linux-identifying-physical-network.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5212780522287766961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5212780522287766961'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/linux-identifying-physical-network.html' title='Linux: Identifying a physical network interface card'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-8146954485525090432</id><published>2011-11-06T07:16:00.000-08:00</published><updated>2011-11-06T09:10:34.077-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Unix.'/><category scheme='http://www.blogger.com/atom/ns#' term='SPARC'/><category scheme='http://www.blogger.com/atom/ns#' term='Sun'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenBoot'/><category scheme='http://www.blogger.com/atom/ns#' term='OK'/><category scheme='http://www.blogger.com/atom/ns#' term='Solaris'/><category scheme='http://www.blogger.com/atom/ns#' term='PROM'/><title type='text'>The Sun OpenBoot architecture - Part I</title><content type='html'>Todos los sistemas Sun tienen un firmware denominado &lt;b&gt;PROM&lt;/b&gt; que le provee a los mismos las funciones básicas de testeo e inicialización del hardware del equipo. También desde el OpenBoot se puede identificar hardware de terceras partes y cargar drivers genéricos para hacer uso de estos dentro del sistema.&lt;br /&gt;OpenBoot, se encuentra incluido en un chip denominado PROM, en el motherboard, y es la interfaz que se utiliza tanto para bootear un sistema, como para establecer&amp;nbsp;parámetros&amp;nbsp;sobre el funcionamiento del equipo, siendo especialmente útil durante el proceso de booteo, ya que el será el encargado de inicializar en SPARC, los distintos slides para inicializar el sistema.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-N3At1au9N0I/TrabzmwY9uI/AAAAAAAAF_I/p7yX4P1BFEk/s1600/Solaris.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="223" src="http://3.bp.blogspot.com/-N3At1au9N0I/TrabzmwY9uI/AAAAAAAAF_I/p7yX4P1BFEk/s400/Solaris.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Para conocer la versión del PROM que se encuentra instalada en el equipo, desde el sistema opeartivo (Solaris), ejecutamos lo siguiente:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;#: prtconf -V&lt;br /&gt;OBP 4.16.4 2004/12/18 05:21&lt;/i&gt;&lt;/blockquote&gt;Al inicializarse el sistema, se ingresa en una etapa denominada &lt;b style="text-align: left;"&gt;POST&lt;/b&gt; (Power On Self Test), en la cual se verifica y testea el hardware conectado al equipo, si todo se encuentra en&amp;nbsp;parámetros&amp;nbsp;normales de funcionamiento se continua con el proceso de booteo, en caso contrario, dependiendo de la severidad de la falla encontrada, o se muestra una alarma, o se interrumpe el booteo. Uno de los test que se realizan en el POST es verificar si se encuentra un teclado conectado (aunque puede ser también una consola serie), y si se envía una señal Stop - D (que puede ser un break en una consola serie).&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;b&gt;Stop D:&lt;/b&gt; Si es se manda esta secuencia durante el booteo, este es interrumpido, y fuerza a OpenBoot a ingresar en&amp;nbsp;modo&amp;nbsp;de diagnostico.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;Stop N:&lt;/b&gt; Setea los distintos parámetros alojados en la NVRAM a los valores por default.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;br /&gt;Stop A: &lt;/b&gt;Aborta el sistema operativo.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;A veces suele resultar útil deshabilitar la secuencia de escape Stop-A en el sistema operativo, y&amp;nbsp;dejándola activa durante el booteo para realiar esto hacemos:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;#: sed -i 's/KEYBOARD_ABORT\=disable/KEYBOARD_ABORT\=enable/g'&amp;nbsp;/etc/default/kbd&lt;/i&gt;&lt;i&gt;#: kbd -i&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;En el OK prompt, podemos identificar alguna información básica del sistema, es para ello que existe el comando &lt;i&gt;banner&lt;/i&gt;, que nos mostrará el modelo del equipo, la versión del PROM, la cantidad de memoria física conectada al equipo, la dirección ethernet de la NIC que es utilizada en el PROM, y el ID del host.&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;ok banner&lt;/i&gt;&lt;i&gt;Sun Ultra 5/10 UPA/PCI (UltraSPARC-IIi 360MHz), Keyboard Present&lt;/i&gt;&lt;i&gt;OpenBoot 3.31, 128 MB (50 ns) memory installed, Serial #11888271.&lt;/i&gt;&lt;i&gt;Ethernet address 8:0:20:b5:66:8f, Host ID: 80b5668f.&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="separator" style="clear: both;"&gt;Para bootear el sistema utilizamos el comando &lt;i&gt;boot&lt;/i&gt;, si queremos bootear en single-user utilizamos el parámetro &lt;i&gt;-s:&lt;/i&gt;&amp;nbsp;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;ok boot -s&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="separator" style="clear: both;"&gt;Si queremos bootear desde un CD o DVD en single-user utilizamos los &lt;i&gt;boot cdrom -s.:&lt;/i&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both;"&gt;&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;ok boot cdrom -s&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="separator" style="clear: both;"&gt;boot seguido del parámetro -a va a bootear el sistema de manera interactiva:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;ok boot -a&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="separator" style="clear: both;"&gt;Si queremos conocer los distintos parámetros alojados en la NVRAM, se utiliza &lt;i&gt;printenv, &lt;/i&gt;por ejemplo:&lt;/div&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;ok printenv&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Variable Name Value Default Value&lt;/i&gt;&lt;br /&gt;&lt;i&gt;tpe-link-test? true true&lt;/i&gt;&lt;br /&gt;&lt;i&gt;scsi-initiator-id 7 7&lt;/i&gt;&lt;br /&gt;&lt;i&gt;keyboard-click? false&lt;/i&gt;&lt;br /&gt;&lt;i&gt;...&lt;/i&gt;&lt;br /&gt;&lt;i&gt;ok printenv boot-device&lt;/i&gt;&lt;br /&gt;&lt;i&gt;boot-device = disk net&lt;/i&gt;&lt;/blockquote&gt;&lt;div&gt;Si se necesita modificar alguno de estos valores, se utiliza setenv:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;ok printenv auto-boot?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;auto-boot? = true&lt;/i&gt;&lt;br /&gt;&lt;i&gt;ok&lt;/i&gt;&lt;br /&gt;&lt;i&gt;ok setenv auto-boot? false&lt;/i&gt;&lt;br /&gt;&lt;i&gt;auto-boot? = false&lt;/i&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Con &lt;i&gt;set-defaults&lt;/i&gt;, o &lt;i&gt;set-defaults &amp;lt;parámetro&amp;gt;&lt;/i&gt; podemos resetear a su valor por defecto algún parámetro especifico alojado en la NVRAM.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Si lo que necesitamos es cambiar un parámetro desde el sistema operativo, utilizamos el comando eeprom, que ejecutandose solo listará todos los parámetros que podemos modificar. Cabe destacar que para poder hacer uso de este debemos ser root:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;i&gt;#: eeprom boot-deviceboot-device=disk&lt;/i&gt;&lt;br /&gt;&lt;i&gt;#: eeprom 'boot-device=disk2'&lt;/i&gt;&lt;/blockquote&gt;Para más información sobre el comando eeprom podemos consultar la manpage del mismo.&lt;br /&gt;En siguientes post vamos a identificar el hardware de booteo, y crear alias de dispositivos.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-8146954485525090432?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/8146954485525090432/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/11/sun-openboot-architecture-part-i.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/8146954485525090432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/8146954485525090432'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/11/sun-openboot-architecture-part-i.html' title='The Sun OpenBoot architecture - Part I'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-N3At1au9N0I/TrabzmwY9uI/AAAAAAAAF_I/p7yX4P1BFEk/s72-c/Solaris.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-9076338175539765881</id><published>2011-10-02T19:05:00.000-07:00</published><updated>2011-10-02T21:04:44.168-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='proc'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='SysRq'/><category scheme='http://www.blogger.com/atom/ns#' term='SAK'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>Linux: The kernel SysRq and the SAK key.</title><content type='html'>Muchos usuarios de Linux, no conocen la existencia de dos combinaciones de teclas que suelen resultar muy útiles a la hora de que un equipo no responda, o al momento de loguearse en uno.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;SysRq key:&lt;/span&gt;&lt;br /&gt;Cuando hablamos de kernel SysRq key, nos referimos a una combinación de teclas especial, la cual va a realizar que un equipo paniqueado, ocrasheado, sea capaz de responder, y poder rebootear de una manera un poco más suave que dandole el botonazo.&lt;br /&gt;&lt;br /&gt;Para poder hacer uso y utilización de esta combinación de teclas, debemos previamente tener soporte a esta en la configuración del kernel, para ello buscamos, en el archivo config de este el siguiente string, que representa un valor booleano:&lt;br /&gt;&lt;blockquote&gt;#: cat /boot/config-2.6.40.4-5.fc15.x86_64 | grep -i sysrq&lt;br /&gt;CONFIG_MAGIC_SYSRQ=y&lt;/blockquote&gt;&lt;div&gt;En este caso se encuentra soportado, en caso contrario, habría que recompilar el kernel, dandole soporte en dicha directiva de configuración.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;En un sistema que soporte SysRq, debemos configurar si se permite realizar dicha sysrq mediante dos formas, una es mediante la &lt;i&gt;sysctl kernel.sysrq&lt;/i&gt;, que tiene valor booleano, o la otra, pasandole &lt;i&gt;"1"&lt;/i&gt; al archivo /proc/sys/kernel/sysrq.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;#: cat /proc/sys/kernel/sysrq&lt;br /&gt;0&lt;br /&gt;#: echo 1 &amp;gt; /proc/sys/kernel/sysrq&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;En muchas distribuciones de Linux, viene en el archivo&lt;i&gt; /etc/sysctl.conf &lt;/i&gt;la directiva comentada, o puesta 0, el motivo de por que se deshabilita es que supongamos un server, al cual le hemos realizado hardening físico, bloqueando el acceso al BIOS, la posibilidad de bootear de medios secundarios, el acceso a GRUB mediante password, etc. Cualquier individuo que tenga acceso físico al equipo, y pueda conectar un teclado, o un KVM al mismo, podrá ejecutar dicha SysRq, comprometiendo la seguridad física del mismo. Así que esto debe ser utilizado con cautela.&lt;br /&gt;&lt;br /&gt;Ahora bien, estudiemos esta SysRq en profundidad: El archivo&lt;i&gt; /proc/sys/kernel/sysrq&lt;/i&gt; va a soportar diferentes posibles valores, acorde a lo que necesitemos tener soportado, ellos son (según la propia documentación del kernel):&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&amp;nbsp; &amp;nbsp;0 - disable sysrq completely&lt;br /&gt;&amp;nbsp; &amp;nbsp;1 - enable all functions of sysrq&lt;br /&gt;&amp;nbsp; &amp;gt;1 - bitmask of allowed sysrq functions (see below for detailed function&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;description):&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2 - enable control of console logging level&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 4 - enable control of keyboard (SAK, unraw)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 8 - enable debugging dumps of processes etc.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;16 - enable sync command&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;32 - enable remount read-only&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;64 - enable signalling of processes (term, kill, oom-kill)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 128 - allow reboot/poweroff&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 256 - allow nicing of all RT tasks&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Como podemos utilizar la petición al sistema?:&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;En arquitecturas x86 o x86_64, podemos realizar esto utilizando &lt;i&gt;Alt + SysRq + &amp;lt;command-key&amp;gt;&lt;/i&gt;, SysRq suele estar localizado donde se encuentra la tecla "Print Screen" y en algunas laptops es necesario acceder a esta mediante function.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;En SPARC, es necesario utilizar ALT + STOP + &amp;lt; command-key&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En consolas serial, se envia una señal de&lt;b&gt; BREAK&lt;/b&gt;, y dentro de los cinco segundos, las posibles &amp;lt;command-key&amp;gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O una forma alternativa, que funciona en cualquiera de estas antes mencionadas, escribiendo sobre el archivo&lt;i&gt; /proc/sysrq-trigger&lt;/i&gt;. Como en Unix todo es un stream, lo que la SysRq hace, es escribirse sobre este archivo del directorio /proc/. Por ejemplo&lt;/div&gt;&lt;blockquote&gt;#: echo t &amp;gt; /proc/sysrq-trigger&lt;/blockquote&gt;&lt;b&gt;Cuales son las command-key?:&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Según la documentación del kernel, son las siguientes,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;'b' &amp;nbsp; &amp;nbsp; - Will immediately reboot the system without syncing or unmounting&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; your disks.&lt;br /&gt;&lt;br /&gt;'c' &amp;nbsp; &amp;nbsp; - Will perform a system crash by a NULL pointer dereference.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A crashdump will be taken if configured.&lt;br /&gt;&lt;br /&gt;'d' &amp;nbsp; &amp;nbsp; - Shows all locks that are held.&lt;br /&gt;&lt;br /&gt;'e' &amp;nbsp; &amp;nbsp; - Send a SIGTERM to all processes, except for init.&lt;br /&gt;&lt;br /&gt;'f' &amp;nbsp; &amp;nbsp; - Will call oom_kill to kill a memory hog process.&lt;br /&gt;&lt;br /&gt;'g' &amp;nbsp; &amp;nbsp; - Used by kgdb (kernel debugger)&lt;br /&gt;&lt;br /&gt;'h' &amp;nbsp; &amp;nbsp; - Will display help (actually any other key than those listed&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; here will display help. but 'h' is easy to remember :-)&lt;br /&gt;&lt;br /&gt;'i' &amp;nbsp; &amp;nbsp; - Send a SIGKILL to all processes, except for init.&lt;br /&gt;&lt;br /&gt;'j' &amp;nbsp; &amp;nbsp; - Forcibly "Just thaw it" - filesystems frozen by the FIFREEZE ioctl.&lt;br /&gt;&lt;br /&gt;'k' &amp;nbsp; &amp;nbsp; - Secure Access Key (SAK) Kills all programs on the current virtual&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; console. NOTE: See important comments below in SAK section.&lt;br /&gt;&lt;br /&gt;'l' &amp;nbsp; &amp;nbsp; - Shows a stack backtrace for all active CPUs.&lt;br /&gt;&lt;br /&gt;'m' &amp;nbsp; &amp;nbsp; - Will dump current memory info to your console.&lt;br /&gt;&lt;br /&gt;'n' &amp;nbsp; &amp;nbsp; - Used to make RT tasks nice-able&lt;br /&gt;&lt;br /&gt;'o' &amp;nbsp; &amp;nbsp; - Will shut your system off (if configured and supported).&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;'p' &amp;nbsp; &amp;nbsp; - Will dump the current registers and flags to your console.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'q' &amp;nbsp; &amp;nbsp; - Will dump per CPU lists of all armed hrtimers (but NOT regular&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; timer_list timers) and detailed information about all&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; clockevent devices.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'r' &amp;nbsp; &amp;nbsp; - Turns off keyboard raw mode and sets it to XLATE.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'s' &amp;nbsp; &amp;nbsp; - Will attempt to sync all mounted filesystems.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'t' &amp;nbsp; &amp;nbsp; - Will dump a list of current tasks and their information to your&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; console.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'u' &amp;nbsp; &amp;nbsp; - Will attempt to remount all mounted filesystems read-only.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'v' &amp;nbsp; &amp;nbsp; - Forcefully restores framebuffer console&lt;/div&gt;&lt;div&gt;'v' &amp;nbsp; &amp;nbsp; - Causes ETM buffer dump [ARM-specific]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'w' &amp;nbsp; &amp;nbsp; - Dumps tasks that are in uninterruptable (blocked) state.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'x' &amp;nbsp; &amp;nbsp; - Used by xmon interface on ppc/powerpc platforms.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'y' &amp;nbsp; &amp;nbsp; - Show global CPU Registers [SPARC-64 specific]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'z' &amp;nbsp; &amp;nbsp; - Dump the ftrace buffer&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;'0'-'9' - Sets the console log level, controlling which kernel messages&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; will be printed to your console. ('0', for example would make&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; it so that only emergency messages like PANICs or OOPSes would&lt;/div&gt;&lt;div&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; make it to your console.)&lt;/div&gt;&lt;div style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Si bien es casi imposible recordar esto, tenemos una bastante interesante: &lt;i&gt;SysRq + ALT + H&lt;/i&gt;, que nos va a mostrar una pequeña ayuda sobre como debemos realizar esto, H, es más fácil de recordar.&lt;br /&gt;&lt;br /&gt;En caso de tratar de memorizar una combinación podemos usar &lt;b&gt;REISUB&lt;/b&gt; donde R pone el teclado en modo XLATE, E va a mandar SIGTERM (-15) a todos los procesos y hacer que estos terminen bien, con la I vamos a enviar SIGKILL (-9) en caso de que no terminen con el SIGTERM enviado anteriormente, S va a intentar hacer sync a los discos, de los datos que están actualmente en memoría y estaban encolados esperando para escribirse, U, va a intentar remontar todos los filesystems como read-only (ro), y B va a rebootear el sistema inmediatamente, sin matar los procesos y lo aún mas peligroso sin hacer sync a disco. Cabe destacar que tenemos que ir presionando esto de a una vez, ya que vamos probando alternativas hasta llegar a la última, y mas grave de ellas.&lt;br /&gt;&lt;br /&gt;En caso de no funcionar esto, debemos mapear el keycode de SysRq, que tiene el valor &lt;i&gt;99&lt;/i&gt; en &lt;i&gt;KEY_SYSRQ&lt;/i&gt; en el archivo&lt;i&gt; includes/linux/input.h&lt;/i&gt;. Podemos usar &lt;i&gt;showkeys -s&lt;/i&gt;, para saber el keycode de la tecla correcto y mapearlo.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-size: large;"&gt;The SAK key:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;SAK, significa &lt;b&gt;Secure Attention Key&lt;/b&gt;, en teoría de sistemas operativos, esto es una herramienta de seguridad, que nos va a proveer protección contra software capaz de capturar un password al momento del login, como puede ser el caso de un rootkit o un troyano. SAK es una manera de matar todos los programas que pueden estar enmascarados como aplicaciones de login, y así proveer un ingreso seguro de password en el sistema.&lt;br /&gt;&lt;br /&gt;La regla dice, que el usuario debe proveer esta combinación de teclas antes de ingresar sus datos de login, asi matar cualquier proceso que este corriendo, haciendose pasar por dicho programa de login, y proveer de manera segura esta clave.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;En teclados del tipo PC, esta combinación de teclas se consigue presionando &lt;i&gt;ALT + SysRq + K&lt;/i&gt;. En el caso de que se este corriendo un servidor gráfico bajo el runlvel 5, al presionar dicha combinación de teclas, el mismo va a ser cerrado y vuelto a abrir, En caso de que se este ejecutando este desde otro runlevel, (por ejemplo el 3), deberemos cargarlo a mano nuevamente.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Como podemos hacer uso y mapear SAK?&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;La manera correcta es hacerlo mediante loadkeys, es por eso, que podemos incluir en /etc/rc.sysinit o /etc/rc.local, la siguiente línea:&lt;/div&gt;&lt;blockquote&gt;#: echo "control alt keycode 101 = SAK" | /bin/loadkeys&lt;/blockquote&gt;&amp;nbsp;En este caso, debido a que&lt;i&gt; CTRL + ALT + DEL&lt;/i&gt; se usa para rebootear el sistema, &lt;i&gt;CTRL + BACKSPACE&lt;/i&gt; para reiniciar el servidor X, se eligió utilizar &lt;i&gt;CTRL + ALT + PAUSE&lt;/i&gt;, para de esta manera tener SAK de manera más sencilla de utilizar y no&amp;nbsp;enredar&amp;nbsp;los dedos al intentar tipearla :-P&lt;br /&gt;&lt;br /&gt;Si quieren aprender más respecto a esto, pueden leer la documentación del kernel que pueden encontrarla en &lt;i&gt;/usr/share/doc/kernel-doc-$(uname -r)/Documentation, &lt;/i&gt;si es que se encuentra instalada, sino en RHEL/CentOS/Fedora pueden hacer instalar el paquete &lt;i&gt;kernel-doc&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-9076338175539765881?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/9076338175539765881/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/10/linux-kernel-sysrq-and-sak-key.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/9076338175539765881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/9076338175539765881'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/10/linux-kernel-sysrq-and-sak-key.html' title='Linux: The kernel SysRq and the SAK key.'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-767972763622230430</id><published>2011-09-13T16:28:00.000-07:00</published><updated>2011-09-14T15:41:18.120-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DNS'/><category scheme='http://www.blogger.com/atom/ns#' term='Unix'/><category scheme='http://www.blogger.com/atom/ns#' term='Bind'/><category scheme='http://www.blogger.com/atom/ns#' term='Zones'/><title type='text'>BIND: Update zone serial for zone trasfers</title><content type='html'>Supongamos que tenemos un BIND, configurado como master de una zona y hacemos cambios en el archivo de la zona del mismo. Como se entera el DNS slave, que dichos cambios fueron modificados?. Fácil, el servidor que&amp;nbsp;actúa&amp;nbsp;como master, envía un hash al slave, del archivo de la zona, el slave lo recibe y compara con la copia que tiene el. Si el valor del hash es distinto, entonces inicia la transferencia de la zona.&lt;br /&gt;Supongamos que nuestra configuración es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;En el master:&lt;/u&gt;&lt;br /&gt;&lt;blockquote&gt;zone "fakezone.net" {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; type master;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; allow-transfer { 192.168.0.2; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; file "master/fakezone.net";&lt;br /&gt;};&lt;/blockquote&gt;&lt;u&gt;En el slave:&lt;/u&gt;&lt;br /&gt;&lt;blockquote&gt;zone "fakezone.net" {&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; type slave;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; file "slaves/fakezone.net";&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; masters { 192.168.0.100; };&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; allow-notify { 192.168.0.100; };&lt;br /&gt;};&lt;/blockquote&gt;Y la zona en si misma, al que le añadimos un CNAME de mail a www.&lt;br /&gt;&lt;blockquote&gt;; &amp;nbsp; &amp;nbsp; &amp;nbsp; From: @(#)localhost.rev 5.1 (Berkeley) 6/30/90&lt;br /&gt;; &amp;nbsp; &amp;nbsp; &amp;nbsp; $Id: PROTO.localhost.rev,v 1.1.6.1 1998/02/27 21:32:55 jkh Exp $&lt;br /&gt;;&lt;br /&gt;; This file is automatically edited by the `make-localhost' script in&lt;br /&gt;; the /etc/namedb directory.&lt;br /&gt;;&lt;br /&gt;@ &amp;nbsp; &amp;nbsp; &amp;nbsp; IN &amp;nbsp; &amp;nbsp; &amp;nbsp;SOA &amp;nbsp; &amp;nbsp; root.fakezone.net. root.fakezone.net. &amp;nbsp;(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 20110909 &amp;nbsp;; Serial&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 3600 &amp;nbsp; &amp;nbsp; &amp;nbsp;; Refresh&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 900 &amp;nbsp; &amp;nbsp; &amp;nbsp; ; Retry&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 3600000 &amp;nbsp; ; Expire&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 3600 ) &amp;nbsp; &amp;nbsp;; Minimum&lt;br /&gt;IN &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MX &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; mail.fakezone.net.&lt;br /&gt;IN &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NS &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mail.fakezone.net.&lt;br /&gt;IN &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;A &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 192.168.0.145&lt;br /&gt;www &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IN &amp;nbsp; &amp;nbsp; &amp;nbsp;A &amp;nbsp; &amp;nbsp; 192.168.0.201&lt;br /&gt;mail &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;IN &amp;nbsp; &amp;nbsp; &amp;nbsp;CNAME www&lt;br /&gt;localhost &amp;nbsp; IN &amp;nbsp; &amp;nbsp; &amp;nbsp;A &amp;nbsp; &amp;nbsp; 127.0.0.1&lt;/blockquote&gt;&lt;div&gt;Para que el servidor SLAVE, reciba dicho cambio, debe modificarse el campo referenciando al serial, en la sección correspondiente a los registros SOA, con la fecha actual, reemplazando 20110909 por 20110912 (fecha de hoy). De esta manera la transferencia de zona se realizara correctamente, y los equipos que hagan consultas DNS contra el DNS slave, podrán utilizar este nuevo CNAME.&lt;/div&gt;&lt;div&gt;&lt;pre style="background-color: white; border-bottom-color: rgb(193, 180, 150); border-bottom-style: dashed; border-bottom-width: 1px; border-left-color: rgb(193, 180, 150); border-left-style: dashed; border-left-width: 1px; border-right-color: rgb(193, 180, 150); border-right-style: dashed; border-right-width: 1px; border-top-color: rgb(193, 180, 150); border-top-style: dashed; border-top-width: 1px; font-family: courier, monospace; font-size: 14px; padding-bottom: 4pt; padding-left: 4pt; padding-right: 4pt; padding-top: 4pt; white-space: pre-wrap; word-wrap: break-word;"&gt;Sept 12 23:33:53 ns1 named[5064]: zone fakezone.net/IN: transferred serial 20110912&lt;br /&gt;Sept 12 23:33:53 ns1 named[5064]: transfer of 'fakezone.net/IN' from 192.168.0.100#53: end of transfer&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-767972763622230430?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/767972763622230430/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/09/bind-update-zone-serial-for-zone.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/767972763622230430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/767972763622230430'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/09/bind-update-zone-serial-for-zone.html' title='BIND: Update zone serial for zone trasfers'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-5802742990702521185</id><published>2011-09-13T15:28:00.000-07:00</published><updated>2011-10-02T18:30:58.364-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Hat'/><category scheme='http://www.blogger.com/atom/ns#' term='CentOS'/><category scheme='http://www.blogger.com/atom/ns#' term='modules'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='kernel'/><title type='text'>CentOS/Red Hat: Examining and building the initial ramdisk</title><content type='html'>Como muchos de ustedes seguramente sabrán, al bootear un equipo, es necesario tener cargados ciertos módulos como el de la controladora de disco (ATA/SATA/SCSI), filesystems, manejo de memoria, entre otros, para de esta forma poder realizar la secuencia normal de booteo e inicio del sistema.&lt;br /&gt;&lt;br /&gt;Pero, aquí entramos en el clásico problema&lt;b&gt; "The Chicken/Egg problem"&lt;/b&gt;.&amp;nbsp;¿Como el OS monta la rootfs, si aún no tiene cargado los módulos?. Es que para ello existe, mis queridos amigos el initial RAM disk, o mejor conocido como initrd. Un filesystem temporal, utilizado por el kernel, que al momento del booteo es cargado en /dev/ram0. El kernel utilizará en un principio dicho RAM disk, como rootfs, hasta que el kernel monte el rootfs real, y lo posicione como tal mediante la syscall &lt;b&gt;pivot_root&lt;/b&gt;.&lt;br /&gt;Esto se realiza, escribiendo el número del real rootfs en el archivo&amp;nbsp;/proc/sys/kernel/real-root-dev. &amp;nbsp;Un ejemplo de ello podría ser:&lt;br /&gt;&lt;blockquote&gt;# echo 0x301 &amp;gt;/proc/sys/kernel/real-root-dev&lt;/blockquote&gt;Ustedes sabrán que dentro del kernel, los módulos pueden ser compilados, built-in, osea construidos dentro de este o en forma de modulo, siendo cargados a medida que se necesitan.&lt;br /&gt;Construir un kernel, con todos los drivers necesarios buil-in, daría lugar a un kernel pesado, y mas lento. Es por ello que estos drivers&amp;nbsp;esenciales, que deben cargarse en algún momento del booteo del equipo, deben ser incluido en el initial RAM disk.&lt;br /&gt;&lt;br /&gt;En el archivo de configuración de nuestro cargador de inicio (GRUB en la mayoría de los casos), encontramos estas líneas:&lt;br /&gt;&lt;blockquote&gt;title CentOS (2.6.18-194.el5)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;root (hd0,0)&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;	&lt;/span&gt;initrd /initrd-2.6.18-194.el5.img&lt;/blockquote&gt;&lt;div&gt;Nos detenemos en la línea initrd, esta línea le dice al gestor de arranque, de donde debe obtener dicho RAM disk. Este es un archivo comprimido generalmente con cpio y a la vez compreso con gzip, que contiene además de los módulos algunas otras cosas, como scripts, algunas configuraciones, como la de LVM, en caso de ser usado, entre otros.&lt;/div&gt;&lt;div&gt;El el primer caso, podemos comprobar que el RAM disk se encuentra compreso con gzip:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;# file /boot/initrd-2.6.18-194.el5.img&lt;br /&gt;/boot/initrd-2.6.18-194.el5.img: gzip compressed data, from Unix, last modified: Mon Jan &amp;nbsp;3 08:12:32 2011, max compression&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Y a su vez, comprobar que el mismo también se encuentra comprimido con cpio:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;# zcat /boot/initrd-2.6.18-194.el5.img | file -&lt;br /&gt;/dev/stdin: ASCII cpio archive (SVR4 with no CRC)&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;Si queremos examinar el contenido del mismo, para buscar si esta incluido dicho módulo, obviamente que podemos hacerlo:&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;# zcat /boot/initrd-2.6.18-194.el5.img | cpio -itv&lt;br /&gt;drwx------ &amp;nbsp; 2 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 Jan &amp;nbsp;3 &amp;nbsp;2011 proc&lt;br /&gt;-rwx------ &amp;nbsp; 1 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 2784 Jan &amp;nbsp;3 &amp;nbsp;2011 init&lt;br /&gt;drwx------ &amp;nbsp; 2 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 Jan &amp;nbsp;3 &amp;nbsp;2011 sys&lt;br /&gt;drwx------ &amp;nbsp; 3 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 Jan &amp;nbsp;3 &amp;nbsp;2011 etc&lt;br /&gt;drwx------ &amp;nbsp; 2 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 Jan &amp;nbsp;3 &amp;nbsp;2011 etc/lvm&lt;br /&gt;-rw------- &amp;nbsp; 1 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1287 Jan &amp;nbsp;3 &amp;nbsp;2011 etc/lvm/lvm.conf&lt;br /&gt;drwx------ &amp;nbsp; 2 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 Jan &amp;nbsp;3 &amp;nbsp;2011 sysroot&lt;br /&gt;drwx------ &amp;nbsp; 3 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0 Jan &amp;nbsp;3 &amp;nbsp;2011 lib&lt;br /&gt;-rw------- &amp;nbsp; 1 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;51760 Jan &amp;nbsp;3 &amp;nbsp;2011 lib/dm-region_hash.ko&lt;br /&gt;-rw------- &amp;nbsp; 1 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; 134232 Jan &amp;nbsp;3 &amp;nbsp;2011 lib/dm-mod.ko&lt;br /&gt;-rw------- &amp;nbsp; 1 root &amp;nbsp; &amp;nbsp; root &amp;nbsp; &amp;nbsp; &amp;nbsp; 117024 Jan &amp;nbsp;3 &amp;nbsp;2011 lib/dm-raid45.ko&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;En caso de necesitar dar soporte a algún módulo en especial, cosa común cuando hacemos cambios en el hardware, por ejemplo la controladora de discos, o algún cambio importante en el filesystem, debemos reconstruir el initial RAM disk, para ello podemos hacerlo de distintas maneras:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;La primera de ella es utilizando el modificador mkinitrd con el modificador --with&lt;/div&gt;&lt;blockquote&gt;#: mkinitrd --with=qla2300 /boot/initrd-$(uname -r)-qla2300.img $(uname -r)&lt;/blockquote&gt;Y podemos verificar esto,&amp;nbsp;fijándonos&amp;nbsp;si construyo el nuevo initrd en el directorio /boot&lt;br /&gt;&lt;blockquote&gt;# ls -l /boot/initrd-2.6.18-*&lt;br /&gt;-rw------- 1 root root 3439778 Mar 15 15:53 /boot/initrd-2.6.18-194.32.1.el5.img&lt;br /&gt;-rw------- 1 root root 3432496 Jan &amp;nbsp;3 &amp;nbsp;2011 /boot/initrd-2.6.18-194.el5.img&lt;br /&gt;-rw------- 1 root root 3487257 Apr 12 08:03 /boot/initrd-2.6.18-238.5.1.el5.img&lt;br /&gt;-rw------- 1 root root 3498999 Sep 13 19:22 /boot/initrd-2.6.18-238.5.1.el5-qla2300.img&lt;/blockquote&gt;&lt;div&gt;La segunda de ellas es localizando un script en el directorio /etc/sysconfig/mkinitrd/&lt;/div&gt;&lt;blockquote&gt;#: echo "MODULES="$MODULES qla2300" &amp;gt; /etc/sysconfig/mkinitrd/qla2300&lt;br /&gt;#: chmod +x /etc/sysconfig/mkinitrd/qla2300&lt;br /&gt;#: mkinitrd /boot/initrd-$(uname -r)-qla2300.img $(uname -r)&lt;/blockquote&gt;&lt;div&gt;Y la tercera de ellas es añadiendo dicho módulo, como alias en el archivo /etc/modprobe.conf, para ello:&lt;/div&gt;&lt;blockquote&gt;#: echo "alias scsi_hostadapter qla2300" &amp;gt;&amp;gt; /etc/modprobe.conf&lt;br /&gt;#: mkinitrd /boot/initrd-$(uname -r)-qla2300.img $(uname -r)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-5802742990702521185?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/5802742990702521185/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/09/centosred-hat-examining-initial-ramdisk.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5802742990702521185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5802742990702521185'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/09/centosred-hat-examining-initial-ramdisk.html' title='CentOS/Red Hat: Examining and building the initial ramdisk'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-5940772576756566945</id><published>2011-09-12T04:15:00.000-07:00</published><updated>2011-11-06T09:25:16.179-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIX'/><category scheme='http://www.blogger.com/atom/ns#' term='Backup'/><title type='text'>AIX: Create an installable image of the root volume group using mksysb</title><content type='html'>Utilizando AIX, pude ser útil tener una imagen instalable del root VG, para evitar perder tiempo, en caso de algún incidente, haciendo la reinstalación completa de todo el OS (que suele ser bastante tediosa y demorar muchas horas), para evitar esto, es que existe mksysb.&lt;br /&gt;&lt;br /&gt;Supongamos que tenemos un volumen group llamado, como no puede ser de otro caso, rootvg, si queremos crear una imagen del mismo y localizarla en /var/tmp/mksysb/ haríamos:&lt;br /&gt;&lt;blockquote&gt;#: mksysb -i /var/tmp/mksysb/rootvg-$(date +%Y%m%d).img&lt;/blockquote&gt;En caso de querer respaldar esta imagen en una unidad de cinta que se encuentra en /dev/rmt0 deberíamos hacer:&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;#: mksysb -i /dev/rmt0&lt;/blockquote&gt;Y si lo que necesitamos en generar la imagen de todo el rootvg, pero queremos excluir por ejemplo, el directorio /home/foobar, &amp;nbsp;haríamos:&lt;br /&gt;&lt;blockquote&gt;#: echo "/home/foobar" &amp;gt;&amp;gt; /etc/exclude.rootvg&lt;br /&gt;#: mksysb -e -i /dev/rmt0&lt;/blockquote&gt;De esta manera, todas las líneas que se encuentren en el directorio /etc/exclude.rootvg serán excluidas al momento de generar la imagen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-5940772576756566945?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/5940772576756566945/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/09/aix-create-installable-image-of-root.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5940772576756566945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/5940772576756566945'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/09/aix-create-installable-image-of-root.html' title='AIX: Create an installable image of the root volume group using mksysb'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-6230082168253531576</id><published>2011-09-12T03:58:00.000-07:00</published><updated>2011-11-06T20:26:32.932-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='KVM'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtualización'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='XEN'/><title type='text'>Linux: Connect to a remote domain0 using virsh and SSH</title><content type='html'>Es bastante común tener VM's hosteadas en un host remoto, al cual podemos acceder mediante&amp;nbsp;Internet, o&amp;nbsp;conectándonos&amp;nbsp;a la LAN local. Sin importar cual fuera el caso, en Linux principalmente existen dos plataformas medianamente "nativas" de virtualización (ambas proveen full virtualización), ellas son Xen, que no es otra cosa que un parche al kernel de Linux, y KVM, que esta integrada como módulo dentro del mismo y para conectarnos,&amp;nbsp;disponemos&amp;nbsp;siempre de un protocolo excelente como es SSH.&lt;br /&gt;Existe una interfaz de administración por&amp;nbsp;linea&amp;nbsp;de comandos denominada virsh, a la cual le indicamos el hypervisor al que queremos conectar y el protocolo a utilizar.&lt;br /&gt;&lt;br /&gt;Supongamos que nos encontramos en un host remoto, como primera medida copiamos nuestra clave pública SSH utilizando por ejemplo ssh-copy-id, o&amp;nbsp;agregándola&amp;nbsp;al ~/.authorized_keys del host remoto, una vez hecho esto, dependiendo que usemos haríamos:&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Usando KVM:&lt;/u&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;virsh -c qemu+ssh://username@foo.bar/system&lt;/span&gt;&lt;/blockquote&gt;&lt;u&gt;Usando XEN:&lt;/u&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;virsh -c xen+ssh://username@foo.bar/system&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Y listo, ya estamos conectados al hypervisor remoto!.&lt;br /&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Welcome to virsh, the virtualization interactive terminal.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;Type: &amp;nbsp;'help' for help with commands&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;'quit' to quit&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;virsh # list&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;Id Name &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; State&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;----------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; 1 CentOS5DS.py &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; running&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp; 3 Centos5DS2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; running&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;virsh #&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-6230082168253531576?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/6230082168253531576/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/09/linux-connect-to-remote-domain0-using.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/6230082168253531576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/6230082168253531576'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/09/linux-connect-to-remote-domain0-using.html' title='Linux: Connect to a remote domain0 using virsh and SSH'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5189027816427515351.post-2002581835899992460</id><published>2011-09-11T23:26:00.000-07:00</published><updated>2011-11-06T09:26:13.437-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NAT'/><category scheme='http://www.blogger.com/atom/ns#' term='FreeBSD'/><category scheme='http://www.blogger.com/atom/ns#' term='Debug'/><category scheme='http://www.blogger.com/atom/ns#' term='IPFilter'/><title type='text'>FreeBSD IPF: NAT duplicate entry causes kernel crash</title><content type='html'>Hace algún tiempo, fui a ver un servidor, que bajo FreeBSD 7.2 actuaba como firewall utilizando IPFilter y hacia NAT entre otros equipos de la LAN interna. El mismo había tenido unos reinicios inesperados, sin saber el verdadero origen de los mismos. Esto de por si representaba un problema, ya que incrementaba el downtime del mismo, y debiendo a que el las particiones del OS se encontraban bajo UFS, podía corromper los filesystems y forzar a la ejecución de fsck entre reboot y reboot.&lt;br /&gt;&lt;br /&gt;Al acceder al equipo, encuentro en /var/log/messages.1 que el equipo, había booteado a las 9:42 AM del día 4 de Diciembre, por lo cual fijandome en logs anteriores encontré que el mismo había entrado en panic, y que había generado el coredump: vmcore.8.&lt;br /&gt;&lt;br /&gt;En el directorio /var/crash encuentro varios coredumps de periodos de tiempos comprendidos entre el año 2008 y 2011.&lt;br /&gt;&lt;br /&gt;Por lo cual comienzo a debuggear el coredump generado (vmcore.8),  con kgdb. Al ejecutar esto, me muestra la siguiente información:&lt;br /&gt;&lt;blockquote&gt;Fatal trap 12: page fault while in kernel mode&lt;br /&gt;cpuid = 0; apic id = 00&lt;br /&gt;fault virtual address    = 0x4&lt;br /&gt;fault code        = supervisor read, page not present&lt;br /&gt;instruction pointer    = 0x20:0xc33ac8ab&lt;br /&gt;stack pointer            = 0x28:0xc2f909bc&lt;br /&gt;frame pointer            = 0x28:0xc2f90a38&lt;br /&gt;code segment        = base 0x0, limit 0xfffff, type 0x1b&lt;br /&gt;= DPL 0, pres 1, def32 1, gran 1&lt;br /&gt;processor eflags    = interrupt enabled, resume, IOPL = 0&lt;br /&gt;current process        = 21 (irq17: xl1)&lt;br /&gt;trap number        = 12&lt;br /&gt;panic: page fault&lt;br /&gt;cpuid = 0&lt;br /&gt;Uptime: 11h41m30s&lt;br /&gt;Physical memory: 499 MB&lt;br /&gt;Dumping 83 MB: 68 52 36 20 4&lt;br /&gt;&lt;br /&gt;#0  doadump () at pcpu.h:196&lt;br /&gt;196        __asm __volatile("movl %%fs:0,%0" : "=r" (td));&lt;/blockquote&gt;Se puede apreciar que se intenta cargar una página de memoria, que parece no estar presente, o incorrectamente mapeada, por lo cual, el kernel crashea con page fault, ejecutando el trap 12.&lt;br /&gt;En la línea current process, se encuentra que es en el IRQ 17, en lo que es la interfaz xl1 conectada al equipo. Al hacer ifconfig xl1, encontramos lo siguiente:&lt;br /&gt;&lt;blockquote&gt;xl1: flags=8843&lt;up,broadcast,running,simplex,multicast&gt; metric 0 mtu 1500&lt;br /&gt;   options=9&lt;rxcsum,vlan_mtu&gt;&lt;br /&gt;   ether 00:10:4b:c6:65:3b&lt;br /&gt;   inet 190.122.08.91 netmask 0xfffffff8 broadcast 190.122.08.124&lt;br /&gt;   media: Ethernet autoselect (100baseTX &lt;full-duplex&gt;)&lt;br /&gt;   status: active&lt;/full-duplex&gt;&lt;/rxcsum,vlan_mtu&gt;&lt;/up,broadcast,running,simplex,multicast&gt;&lt;/blockquote&gt;&lt;up,broadcast,running,simplex,multicast&gt;&lt;rxcsum,vlan_mtu&gt;&lt;full-duplex&gt;Dicha interfaz se encuentra activa, y con la dirección de IP Pública 190.122.08.91, en la cual se produce el NAT.&lt;br /&gt;&lt;br /&gt;Dentro de kgdb, al hacer un backtrace encuentro lo siguiente:&lt;/full-duplex&gt;&lt;/rxcsum,vlan_mtu&gt;&lt;/up,broadcast,running,simplex,multicast&gt;&lt;br /&gt;&lt;blockquote&gt;(kgdb) bt        &lt;br /&gt;#0  doadump () at pcpu.h:196&lt;br /&gt;#1  0xc07ec1f7 in boot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:418&lt;br /&gt;#2  0xc07ec4c9 in panic (fmt=Variable "fmt" is not available.&lt;br /&gt;) at /usr/src/sys/kern/kern_shutdown.c:574&lt;br /&gt;#3  0xc0b18f2c in trap_fatal (frame=0xc2f9097c, eva=4) at /usr/src/sys/i386/i386/trap.c:939&lt;br /&gt;#4  0xc0b191b0 in trap_pfault (frame=0xc2f9097c, usermode=0, eva=4) at /usr/src/sys/i386/i386/trap.c:852&lt;br /&gt;#5  0xc0b19c2c in trap (frame=0xc2f9097c) at /usr/src/sys/i386/i386/trap.c:530&lt;br /&gt;#6  0xc0afe20b in calltrap () at /usr/src/sys/i386/i386/exception.s:159&lt;br /&gt;#7  0xc33ac8ab in nat_new () from /boot/kernel/ipl.ko&lt;br /&gt;#8  0xc33b0574 in fr_checknatin () from /boot/kernel/ipl.ko&lt;br /&gt;#9  0xc33c9723 in fr_check () from /boot/kernel/ipl.ko&lt;br /&gt;#10 0xc33c170e in fr_check_wrapper () from /boot/kernel/ipl.ko&lt;br /&gt;#11 0xc0897418 in pfil_run_hooks (ph=0xc0d03100, mp=0xc2f90be8, ifp=0xc3191400, dir=1, inp=0x0) at /usr/src/sys/net/pfil.c:78&lt;br /&gt;#12 0xc08d76e2 in ip_input (m=0xc32eaa00) at /usr/src/sys/netinet/ip_input.c:416&lt;br /&gt;#13 0xc0895bb5 in netisr_dispatch (num=2, m=0xc32eaa00) at /usr/src/sys/net/netisr.c:185&lt;br /&gt;#14 0xc088bb51 in ether_demux (ifp=0xc3191400, m=0xc32eaa00) at /usr/src/sys/net/if_ethersubr.c:834&lt;br /&gt;#15 0xc088bf43 in ether_input (ifp=0xc3191400, m=0xc32eaa00) at /usr/src/sys/net/if_ethersubr.c:692&lt;br /&gt;#16 0xc09ec818 in xl_rxeof (sc=0xc3199000) at /usr/src/sys/pci/if_xl.c:2022&lt;br /&gt;#17 0xc09eed24 in xl_intr (arg=0xc3199000) at /usr/src/sys/pci/if_xl.c:2257&lt;br /&gt;#18 0xc07c9f5b in ithread_loop (arg=0xc3190300) at /usr/src/sys/kern/kern_intr.c:1088&lt;br /&gt;#19 0xc07c6a59 in fork_exit (callout=0xc07c9da0 &lt;ithread_loop&gt;, arg=0xc3190300, frame=0xc2f90d38) at /usr/src/sys/kern/kern_fork.c:810&lt;br /&gt;#20 0xc0afe2b0 in fork_trampoline () at /usr/src/sys/i386/i386/exception.s:264&lt;br /&gt;&lt;br /&gt;(kgdb) p *0xc33ac8ab&lt;br /&gt;$1 = 251937163&lt;/ithread_loop&gt;&lt;/blockquote&gt;&lt;ithread_loop&gt;Si se realiza el seguimiento del backtrace, se encuentra, con lo que posiblemente sea un paquete intentando atravesar el modelo OSI/ISO (Físico, Enlace, Red, Transporte..) haciendo llamadas como por ejeplo a xl_intr, xl_rxeof, ether_input, ether_demux, netisr_dispatch, ip_input, hasta llegar a nat_new donde se produce la falla, y salta a la función calltrap(), la cual hace la llamada para producir el trap (trap y trap_pfault), el cual se convierte en trap_fatal (debido a que es un pagefault) y hace saltar a la funcion panic(), que finaliza escribiendo el coredump (volcado de memoria), y haciendo un reboot del equipo.&lt;br /&gt;&lt;br /&gt;Lo que indica que el crash se produce al acceder a la función nat_new(), mapeado su segmento .text en la dirección 0xc33ac8ab, cuyo código de fuente se encuentra en /usr/src/sys/contrib/ipfilter/netinet/ip_nat.c, en el cual se realiza el encapsulado, fragmentación y traslado de direcciones, para aplicar NAT.&lt;br /&gt;&lt;br /&gt;Dicha función se compone de tres secciones:&lt;/ithread_loop&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Crear una nueva estructura NAT para la regla MAP para las conexiones entrantes.&lt;/li&gt;&lt;li&gt;Crear una nueva estructura NAT para la regla RDR para las conexiones salientes.&lt;/li&gt;&lt;li&gt;Construir dicha estructuras y ponerla dentro de la tabla de NAT.&lt;/li&gt;&lt;/ul&gt;También función new_nat() recibe como parámetros:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;np(I) -&amp;gt; Puntero a la regla de NAT&lt;/li&gt;&lt;li&gt;fin(I) -&amp;gt; Puntero a la información paquete, obtenido en las funciones anteriores.&lt;/li&gt;&lt;li&gt;flags(i) -&amp;gt; Que se encuentran en el último paquete.&lt;/li&gt;&lt;li&gt;direction(i) -&amp;gt; Dirección del paquete (IN/OUT) para luego la función new_nat() pueda aplicar MAP o RDR.&lt;/li&gt;&lt;/ul&gt;Por lo cual el pagefault lo puede estar dando al pasarle a la función, el argumento np(I). El cual apunte a una dirección de memoria inexistente o invalida, y al intentar leer de ella crashea.&lt;br /&gt;&lt;br /&gt;Para reproducir el problema, se puede hacer lo siguiente:&lt;br /&gt;&lt;br /&gt;Se debe crear un archivo llamado tcpfrag.nat, con el siguiente contenido:&lt;br /&gt;&lt;blockquote&gt;[out,xl1]&lt;br /&gt;4500 00a0 0000 0100 3f06 7555 0101 0101 0201 0101&lt;br /&gt;0401 0019 0000 0000 0000 0000 5010 2000 86b7 0000&lt;br /&gt;0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&lt;br /&gt;0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&lt;br /&gt;0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&lt;br /&gt;0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&lt;br /&gt;0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&lt;br /&gt;0000 0000 0000 0000 0000 0000 0000 0000 0000 0000&lt;/blockquote&gt;Luego ejecutando:&lt;br /&gt;&lt;blockquote&gt;#: ipftest -F hex -N tcpfrag.nat -i tcpfrag.pkt&lt;/blockquote&gt;Esto es debido a que en el archivo /etc/ipnat.rules, se encuentran cargadas las siguientes reglas sobre la interfaz de red xl1.&lt;br /&gt;&lt;blockquote&gt;bimap xl1 172.18.2.12/32 -&amp;gt; 190.122.08.91/32&lt;br /&gt;bimap xl1 172.18.2.13/32 -&amp;gt; 190.122.08.91/32&lt;br /&gt;bimap xl1 172.18.2.14/32 -&amp;gt; 190.122.08.91/32&lt;br /&gt;bimap xl1 172.18.2.15/32 -&amp;gt; 190.122.08.91/32&lt;/blockquote&gt;Según busque entre los reportes de bugs de FreeBSD, el problema existe y  el motivo del problema puede ser debido a que un fragmento TCP que matchee con una regla que es para otro cualquier protocolo, debido a que se duplica su entrada en la cache de NAT.&lt;br /&gt;&lt;br /&gt;Dicha referencia puede ser encontrada en el siguiente link:&lt;br /&gt;&lt;div&gt;&lt;a href="http://www.freebsd.org/cgi/query-pr.cgi?pr=137392"&gt;http://www.freebsd.org/cgi/query-pr.cgi?pr=137392&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Dicho bug, se encuentra abierto al momento, y lleva reportado ya 2 años (Agosto del 2009), fue categorizado como "Medio". Debido a que es posible generar en un host remoto, paquetes con una payload ligeramente modificada y producir una denegación de servicio en el servidor, haciendo entrar en panic el kernel, y produciendo por lo tanto un reboot forzado del mismo.&lt;br /&gt;&lt;br /&gt;Según encontré, aún no hay ningún parche oficial para solucionar dicho problema, y en esta empresa se necesita la utilización de las reglas bimap, por lo cual, la única solución accesible y razonable que encontré es migrar dichas reglas a Packet Filter. En el caso de Solaris, no tuve la oportunidad de testearlo, si alguién lo hace, por favor me avisa!.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5189027816427515351-2002581835899992460?l=codigounix.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigounix.blogspot.com/feeds/2002581835899992460/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://codigounix.blogspot.com/2011/09/freebsd-ipf-nat-entry-dupplication-on.html#comment-form' title='5 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/2002581835899992460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5189027816427515351/posts/default/2002581835899992460'/><link rel='alternate' type='text/html' href='http://codigounix.blogspot.com/2011/09/freebsd-ipf-nat-entry-dupplication-on.html' title='FreeBSD IPF: NAT duplicate entry causes kernel crash'/><author><name>Facundo de la Cruz</name><uri>https://profiles.google.com/111526786402765197429</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh6.googleusercontent.com/-lyk8kvoC5vA/AAAAAAAAAAI/AAAAAAAAGHo/oLbaqALJ-ak/s512-c/photo.jpg'/></author><thr:total>5</thr:total></entry></feed>
