miércoles, febrero 28, 2007

Nuevas capturas de MacOS X Leopard

En thinksecret acaba de publicar unas cuantas capturas nuavas de la versión 9A434. La galería completa de imágenes. Quizás lo que más me ha llamado la atención es esta captura:

Donde por fin vemos el Terminal con soporte para tabs (pestañas) - algo que lleva desde hace mucho tiempo por ejemplo el konsole de KDE -.Aparte varias capturas del panel de configuración de red.

Technorati Tags: ,

martes, febrero 27, 2007

Manejo de memoria en código de red: Linux y BSD

Hace no mucho, encontré una referencia a skbuff.net, una página web donde se describe como es la gestión de memoria en el código de red en el caso de Linux, implementado a través de una estructura denominada sk_buff - socket buffet -. Recordando el TCP/IP Illustrated Volumen II, he estado buscando la referencia a la implementación en los BSD (FreeBSD, NetBSD o OpenBSD), que en este caso la estructura recibe el nombre de mbuf.

Recuerdo hace bastantes años, que en el IRC se comentaba que el uso de sk_buff era más rápida que el caso de los mbuf de BSD. Pero no encuentro actualmente ninguna referencia a estudios llevados a cabo respecto al uso de una pila TCP/IP u otra.

La documentación para el caso de Linux es escasita (al menos no tienes una página de manual como puedes tener en un BSD o una página como suele pasar con la información de los proyectos BSD). Puede verse un poco de como se manejan esta información en este artículo de Alan Cox.

Technorati Tags: , ,

lunes, febrero 26, 2007

Configuración avanzada de TCP/IP en Linux (VI): Tablas de rutas

La parte más interesante de la configuración de Linux es la tabla de rutas. Normalmente, la tabla de rutas se ha manipulado en los Unix tradicionales a través del comando route, y para obtener información de la misma se usaba netstat -rn.

Realmente, lo primero que cabe decir es que estas dos utilidades actúan sobre la tabla de rutas denominada main. Linux puede tener hasta 32762 tablas de rutas, cada una de ellas identificada por un número o por un nombre asociada al mismo (que se resuelve a través del fichero /etc/iproute2/rt_tables). Existen tres tablas de rutas predefinidas:

  • local. Tiene asignado el número de tabla 0.Esta tabla es mantenida por el kernel y no debe de tocarse por el usuario. Esta tabla se encarga de manejar las rutas hacía direcciones locales del sistema y las de broadcasting
  • main. Tiene asignado el número de tabla 32766. Esta es la tabla principal de rutado. Se maneja con la utilidad route o con ip route sino se especifica la tabla sobre la cual se trabaja.
  • default Tiene asignado el número de tabla 32767. Esta tabla se encarga de procesar todas aquellas rutas que no hayan sido tratadas anteriormente.
Como vemos, cada tabla tiene asignada un número que indica su prioridad. A la hora de decidir qué debe de hacerse con un paquete, estas estructuras se recorren de menor prioridad a mayor hasta dar con una entrada que sea capaz de mandar el paquete.

Una entrada en la tabla de rutas viene definida por una serie de parámetros. Los más básicos son un prefijo que define el destino (normalmente dado en forma de una red y máscara) y un parámetro que indica cual es el siguiente salto que debe de tener la ruta (el siguiente salto viene definido por el dispositivo, dirección ip y un parámetro de peso de la ruta, útil en caso que queramos usar un balanceo de carga). Aparte podemos establacer un campo ToS - type of service - para poder elegir una ruta determinada (por ejemplo, se pueden marcar los paquetes para posteriormente usar una ruta u otra en función de este valor), puede usarse una metríca para la ruta o una preferencia.

Aparte, una entrada puede modificar ciertos aspectos de una comunicación en caso de que un paquete use una entrada de la tabla de rutas determinada.

Las entradas de cada una de las tablas describen como debe de encaminarse los paquetes hacía un destino determinado. En Linux soporta las siguientes tipos de rutas:

  • Rutas unicast: Es una entrada normal de ruta. Indica hacía donde tiene que ir un paquete determinado
  • Rutas blackhole: Se se selecciona una entrada de este tipo para rutar el paquete, se descarta sin más
  • Rutas prohibit: En este caso se descarta el paquete y se manda a la dirección origen del mismo un paquete ICMP indicando que la ruta está prohibida
  • .
  • Rutas local: Rutas locales. Cualquier paquete que selecciones una ruta de este tipo, lo mandará de vuelta al host local y se entregará de manera local.
  • Rutas broadcast: En este caso el destino es una ruta de difusión. El paquete se enviará encapsulado en una trama de difusión en el nivel de enlace.
  • Rutas throw: Se utiliza para parar la búsqueda de entradas en la tabla de rutas. En caso de llegar a una entrada de este tipo, el paquete se descarta.
  • Rutas nat: Han sido eliminadas en el kernel 2.6.x, con lo cual no voy a hablar de ellas.
  • Rutas anycast: No están implementadas. Se debería comporta como rutas locales.
  • Rutas multicast: Se usa para rutar paquetes multicast.

Por otra parte en la tabla de rutas cada una de las mismas puede haber sido instalada por un protocolo determinado. Los protocolos están identificados por un valor numérico, y por otra parte existe una serie de valores definidos:

  • redirect: La ruta ha sido instalado por un ICMP redirect.
  • kernel: La ruta ha sido instalada por el núcleo durante el proceso de autoconfiguración.
  • boot: la ruta la ha instalado los scripts de inicio del sistema. En caso de que se arranque un daemon de rutado, las debe de borrar.
  • static: La ruta ha sido instalada por un administrador de sistemas. Estas rutas deben de ser respetada por los daemons de rutado. En función de la configuración de los mismos, podrá anunciarlo a otras máquinas que participen en el algoritmo de rutado.
  • ra: La ruta ha sido instalada por el algoritmo de descubrimiento de routers
Esta información se encuentra en el fichero /etc/iproute2/rt_protos

Technorati Tags: ,

miércoles, febrero 21, 2007

Windows Vista y protocolos curiosos de red

Mientras analizaba información de una sonda de ossim el plugin de spade me han estado cantando alarmas de ordenadores mandando información a 224.0.0.252 y al puerto 5355.Buscando un poco por internet he dado con esta entrada de uno de los blogs d Microsoft, que hace referencia a un protocolo, Link-Local Multicast Name Resolution, que permite la resolución de nombres en una red local sin necesidad de un servidor de DNS (exactamente igual que bounjuor en MacOS X). No es un protocolo estándar aunque el borrador para el IETF es público. Este protocolo de resolución de nombres funciona tanto sobre IPv4 como sobre IPv6,y sólo tiene alcance en la subred en que está conectada la máquina ( link-local scope ). El formato de los paquetes puede encontrarse en la entrada de Cable Guy. Es una cabecera de 12 bytes seguidos de varios registros de longitud variable con preguntas, respuestas, registros autorizados y otros registros. La resolución de Windows Vista es primero DNS, luego LLMNR y si está activado resolución tradicional NetBIOS.

Otra de las trazas que he estado observando son las de Teredo, lo cual no es más que una tecnología para encapsular IPv6 sobre IPv4 cuando el host IPv6 se encuentra situado detrás de una máquina IPv4 que hace NAT. Otra tecnología que existe para este cometido es 6to4. En principio, con la extensión del espacio de direcciones que permite IPv6, no sería necesario emplear técnicas de NAT para las máquinas. Pero realmente, la Internet a día de hoy es en su mayoría IPv4, con lo cual se acaban añadiendo este tipo de mecanismos de traducción de direcciones.

Teredo está disponible en Windows XP con el SP2 o Windows 2003 con SP1 aunque viene deshabilitado por defecto, frente a Vista o Longhorn lo traen por defecto, aunque en este último caso no está activo por defecto.

Technorati Tags:

martes, febrero 20, 2007

Autoconf, aclocal, macros m4 y otras hierbas: Configurando software Open Source

Reconozco que toda la familia de utilidades tipo autoconf, aclocal y configure me acaban causando dolor de cabeza en el momento que intento usarlas fuera de Linux. Pensadas para aumentar la portabilidad, al final, han conseguido que se complique las cosas: si el objetivo es la portabilidad debe de asegurarse que funciona (por no hablar del rendimiento que tiene alguno de estos mostruosos shell scripts....)

Para empezar el antidiluviano m4 como procesador de macros. Sintaxis más propia de mediados de los años 80, cuando hoy en día cualquier sistema tiene un buen interprete perl o python.

Aparte, la gente de Freedesktop tienen otro sistema para localizar donde están los ficheros includes y las librerías, llamado pkg-config.Este sistema es un ejecutable y una serie de ficheros que especifica donde están las librerías y ficheros includes. Por ejemplo MacOS incluye estos ficheros para algunas librerías en /usr/lib/pkgconfig. Claro, que en caso de que actualicemos por ejemplo a nuestra propia versión y la coloquemos en /usr/local, nos encontraremos que el pkg-config sólo esté buscando los paquetes en /usr/local/lib/pkgconfig. Para evitar estos problemas podemos utilizar la variable de entorno PKG_CONFIG_PATH. En esta variable se puede especificar una lista de directorios separados por ":" para que el programa busque en los mismos los ficheros necesarios. Así para que busque en /usr/lib/pkgconfig y /usr/local/lib/pkgconfig:

ibookdrizzt:~ terron$ export PKG_CONFIG_PATH=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig 
ibookdrizzt:~ terron$ pkg-config --libs glib-2.0
-L/usr/local/lib -lglib-2.0 -lintl -liconv  
ibookdrizzt:~ terron$ 

Un detalle, aparte, es que para usar autoconf y demás familia, pkg-config instala un fichero de macros llamado pkg.m4.Este fichero de macros depende de donde se ha configurado la instalación del mismo. Claro, que si lo queremos usar desde un aclocal para buscar las dependencias dependerá también de como este último se haya compilado. Para ello, aclocal tiene la opción -I directorio para especificar las rutas de búsqueda de los ficheros m4. Por ejemplo, si en nuestro sistema tenemos un fichero de macros m4 que necesite aclocal en /usr/local/share/aclocal, pues:

ibookdrizzt:~/tmp/os-sim-0.9.9rc3.drizzt terron$ aclocal -I /usr/local/share/aclocal 
ibookdrizzt:~/tmp/os-sim-0.9.9rc3.drizzt terron$ 

En fin, problemillas que me voy encontrando con las autotools ....

Technorati Tags: , ,