SafeChildren Banner

Havoc Oracle Solaris Experts

martes, 29 de septiembre de 2009

Instalar squid como proxy reverso en Solaris 10

Introducción
En la primera parte hemos visto cómo instalar squid cache para mejorar la navegación, sin embargo, ahora nos vamos a centrar en cómo instalar squid cache como proxy reverso. Esto hará que nuestra instalación Web pueda ser rápida y sobre todo escalable.

A continuáción tenemos un gráfico de una conexión normal de un cliente HTTP a nuestro servidor Web que dispone de un Application Server detras. Como podemos ver, cada petición HTTP entrará en nuestro servidor web y éste hará una peteción a nuestro servidor de aplicaciones que se conectará a la base de datos.

Esta aquitectura es completamente válida, el problema es que no es óptima para numerosos usuarios concurrentes. El problema principal de esta aquitectura está en nuestro servidor Web y cómo cada petición acaba siempre en nuestro Application Server. Imaginemos que tenemos un pico de 5000 conexiones/seg, lo cierto es que tenemos un problema ....

Debemos tener en cuenta que podremos servir tantas conexiones como los Límites Teóricos Máximos sobre la parametrización de nuestros servidores web, application server y base de datos, principalmente los siguientes valores:
  • Apache HTTPD MaxClients
  • Apache Tomcat JK Max Threads
  • Oracle/Postgres MaxConnection

Estructura Reverse Proxy
Dentro de esa problemática es donde entra nuestro servidor proxy reverso. Su utilidad radica en que aquellas peticiones cacheables no pasan a nuestro servidor Web/AppServer y por lo tanto, podemos soportar un mayor número de conexiones concurrentes. Además, si añadimos soporte para balanceo tenemos una arquitectura escalable sencilla y potente.

Aquí tenemos una Estructura con Nuestro ReverseProxy


Es cierto que ahora el cuello de botella lo hemos trasladado de nuestros servidores Web a nuestro Proxy Reverso, sin embargo, hemos comentado que es una arquitectura escalable, así que veamos un ejemplo escalando un poco nuestra arquitectura:

Como vemos, hemos incluido un mayor número de reverse proxy en nuestra arquitectura y hemos incluido más web/appserv para conseguir mayor concurrencia.

Una vez hemos visto el potencial de un proxy reverso vamos a ver cómo se instala y cuáles son las diferencias en la configuración con una instalación de squid-cache normal.

Compilación squid-cache
La configuración de nuestro squid no dista mucho de cómo lo hemos hecho antes, simplemente debemos incluir --disable-internal-dns como una opción más. En nuestro caso he incluido --with-large-files y --enable-snmp para su monitorización

$ ./configure
--prefix=/opt/www/squid-2.7
--with-pthreads
--with-large-files
--with-maxfd=16000
--disable-internal-dns
--enable-large-cache-files
--enable-storeio=ufs,aufs
--enable-devpoll
--enable-x-accelerator-vary
--enable-cache-digests
--enable-http-violations
--enable-snmp
Compilamos e Instalamos
Como hemos hecho en los artículos anteriores, la compilación se realiza con GNU make, en Solaris por defecto se encuentra en /usr/sfw/bin/gmake
$ make
# make install
Configuración de squid-cache
Los parámetros de nuestro squid.conf diferentes serán http_port y cache_peer que los utilizaremos de la siguiente forma:
http_port HOST:PUERTO [defaultsite=VHOST] accel vhost
Donde HOST hará referencia a la IP/HOST en el cual el proxy reverso se encuentra y PUERTO puerto de escucha, normalmente será 80. La opción defaultsite sirve para asignar un VirtualHost por defecto ya que asumimos que nuestro Apache está en modo virtual host

Por otro lado, debemos incluir cache_peer para indicar cuál será realmente nuestro servidor Web de la siguiente forma
cache_peer HOST/IP parent PUERTO 0 no-query originserver round-robin login=PASS name=NOMBRE
Donde HOST/IP hace referencia al servidor Web Original, PUERTO puerto en el que está escuchando el servidor Web y NOMBRE nombre que queremos asignarle, esto se utiliza cuando tienes múltiples cache_peer y quieres que diferentes virtualhost accedan a un grupo de cache_peer diferentes.

Así pues, nuestros cambios sobre el archivo de configuración serán los siguientes:

#####################################################
## PARAMETROS ADMINISTRATIVOS
#####################################################
visible_hostname www1.test.com
cache_effective_user www
cache_effective_group www
httpd_suppress_version_string on

#####################################################
## COMMON ACLS
#######################################################
## ALL Sources
acl all src 0.0.0.0/0.0.0.0

#####################################################
## PARAMETROS REVERSE PROXY
#####################################################
http_port revproxy:80 defaultsite=test.com accel vhost
cache_peer websrv parent 80 0 no-query originserver round-robin login=PASS name=test

#####################################################
## SNMP
#####################################################
acl snmpManager src 192.168.1.16/32
acl SNMPPublic snmp_community public
snmp_access allow snmpManager
snmp_access deny all
snmp_port 7655

#####################################################
## SEGURIDAD DE HEADER
#####################################################
forwarded_for off

header_access From deny all
header_access Warning deny all
header_access Via deny all
header_access Proxy-Connection deny all
header_access X-Forwarded-For deny all
header_access X-Cache deny all
header_access X-Cache-Lookup deny all


#####################################################
## PARAMETRIZACION SEGURIDAD
#####################################################
acl SSL_ports port 443 # SSL
acl Safe_ports port 80-84 # http
acl CONNECT method CONNECT

http_access deny !Safe_ports
http_access deny CONNECT !Safe_ports
Ahora sólo nos queda incluir los hosts que hemos definido en nuestro cache_peer en el archivo /etc/hosts para que squid pueda encontrarlos.

# vi /etc/hosts
##################################
## REVERSE PROXY
##################################
192.168.1.201 websrv webserv.test.com
192.168.1.202  websrv websrv.test.com
192.168.1.203 websrv websrv.test.com
:wq

Finalización de la instalación
Para finalizar, primero verificaremos que el archivo de configuración está bien definido utilizando $SQUID_HOME/sbin/squid -k parse y si todo está correcto lanzaremos $SQUID_HOME/bin/RunCache
# /opt/www/squid-2.7/sbin/squid -k parse
# /opt/www/squid-2.7/bin/RunCache &
Conclusiones
Aunque no es un post sobre Alta disponibilidad y Concurrencia hemos visto cómo podemos optimizar nuestros recursos y con unos pequeños cambios aumentar de forma notable el rendimiento de nuestros aplicativos Web.

Hemos visto cómo squid-cache puede darnos mucha mayor funcionalidad y aunque es una tarea ardua cuando tenemos un squid tuneado las ventajas son innumerables.

Una nota sobre la configuración es que hemos utilizado una opción de squid-cache para eliminar las cabeceras referentes al sistema de cache, ésto lo hemos hecho para hacer más transparente la instalación, así mismo, el usuario nunca sabrá que tiene un squid-cache por delante del servidor Web.

lunes, 28 de septiembre de 2009

Configuración Automática Proxy usando archivo PAC

Introducción
Básicamente el sistema de autoconfiguración no es más que un método JavaScript que devuelve si ha de utilizar proxy o no y el navegador hace una llamada a FinProxyForURL(url,host) por cada URL que quiere visitar.

UPDATED:  He creado una versión nueva, donde se muestra una solución a los equipos que, por diferentes motivos necesitan archivos de configuració dinámicos. Puedes ver el post de Archivos de Configuración Automática Múltiples Localizaciones

La función FindProxyForURL(url,host)
Esta función es la que indicará al navegador si debe utilizar un proxy o no, para ello debe devolver los siguientes valores
  • DIRECT. La URL se puede alcanzar sin Proxy
  • PROXY _proxy:port_. La URL debe utilizar el proxy
A continuación se muestra un ejemplo sencillo donde todas las URL acceden por el PROXY a excepción de las salidas HTTPS.

// ---------------------------------------------
// FindProxyForURL
//
// Autor: Urko Benito
// Version: 1.0
// ---------------------------------------------
function FindProxyForURL(url, host)
{
//
// Acceso HTTPS directamente sin pasar por el PROXY
//
if (shExpMatch(url, "https:*") ) return "DIRECT";

return "PROXY user-proxy-01.test.com:3128;";
} //End PAC File
Este archivo, lo podemos guardar en nuestro desktop aunque la forma más correcta será ubicarlo en un servidor Web (Apache/Tomcat/etc.) y configurar nuestro clientes para que accedan a él, a continuación puedes ver un ejemplo de configuración en FireFox



Funciones FindProxyForURL
Existen un conjunto de funciones incluidas en la expecificación, entre las que destacamos:
  • myIPAddress: Devuelve la IP del host cliente
  • shExpMatch: Evalúa una expresión regular
Nota Sobre la Función myIPAddress: Se da una extraña circustancia en los FireFox 1.5.x sobre MacOS X (aunque sobre algún Linux también) por un fallo en la implementacion de la función myIpAddress() del sistema de configuracion automatica PAC que devuelve 127.0.0.[1|2] pero *NO EN TODOS LOS FIREFOX*
A partir de aquí, podemos evolucionar nuestro archivo de configuración como queramos, por ejemplo, utilizar script perl para generar el archivo PAC en función de IPs de origen, horas, etc. ya que con perl es relativamente sencillo y mucho más potente.

Si queremos añadir nuestro archivo pac al apache, debemos tener en cuenta que hay que incluir el MimeType para que Apache reconozca ".pac" como ProxyAutoConfig File, para ello, incluiremos en $APACHE_HOME/conf/httpd.conf la siguiente linea:
AddType application/x-ns-proxy-autoconfig .pac
He puesto algunos ejemplos para que los puedas descargar

Referencias

viernes, 25 de septiembre de 2009

Cómo Mostrar Información de Diagnóstico en Solaris

Introducción
Para mostrar el información sobre el diagnóstico de nuestro hardware utilizaremos el comando prtdiag. Además, podemos utilizar el argumento -v si queremos que sea una salida detallada (Verbose)

# prtdiag
System Configuration: Sun Microsystems sun4u Sun SPARC Enterprise M4000 Server
Frecuencia del reloj del sistema: 1012 MHz
Tamaño de la memoria: 16384 Megabytes

=========== CPU ====================================

CPU CPU Ejecu L2$ CPU CPU
LSB Chip ID MHz Mb Impl. Másc
--- ---- ---------------------------------------- ---- --- ----- ----
00 0 0, 1, 2, 3 2150 5,0 6 147
00 1 8, 9, 10, 11 2150 5,0 6 147

=========== Configuración de memoria ============================

Memory Disponible Memory DIMM # of Mirror Intercalar
LSB Group Tamaño Estado Tamaño DIMMs Mode Factor
--- ------ ------------------ ------- ------ ----- ------- ----------
00 A 8192MB okay 1024MB 8 no 4-way
00 B 8192MB okay 1024MB 8 no 4-way

========== Tarjetas de ES =========================

LSB Nombre Modelo
--- -------------- ------------
00 scsi LSI,1064
00 network N/A
00 network N/A
00 SUNW,qlc N/A
00 SUNW,qlc N/A
00 SUNW,qlc QLE2462
00 SUNW,qlc QLE2462
00 SUNW,qlc QLE2462
00 SUNW,qlc QLE2462


========Revisiones de hardware ====================

System PROM revisions:
----------------------

OBP 4.24.8 2008/04/17 18:20


=================== Estado ambiental ===================

Mode switch is in LOCK mode


lunes, 21 de septiembre de 2009

Instalar CVS pserver en Solaris 10

Introducción
Vamos a ver cómo instalar un servidor cvs utilizando el modo pserver para acceder a él, para ello, necesitaremos el binario cvs que podemos obtener de SunFreeware, o el source y compilarlo, en nuestro caso, vamos a utilizar el paquete que nos proporciona SunFreeware y sus dependecias

Descargaremos el software utilizando wget, si tienes un proxy http, puedes ver cómo configurarlo para wget, aunque puedes utilizar curl o cualquier otro.
# wget ftp://ftp.sunfreeware.com/pub/freeware/sparc/10/cvs-1.12.13-sol10-sparc-local.gz
# wget ftp://ftp.sunfreeware.com/pub/freeware/sparc/10/libiconv-1.11-sol10-sparc-local.gz
# wget ftp://ftp.sunfreeware.com/pub/freeware/sparc/10/libgcc-3.4.6-sol10-sparc-local.gz
# wget ftp://ftp.sunfreeware.com/pub/freeware/sparc/10/libintl-3.4.0-sol10-sparc-local.gz
Repetiremos el proceso de instalación para cada uno de los paquetes, si no los tenemos instalados ya.
# gzip -d cvs-1.12.13-sol10-sparc-local.gz
# pkgadd -d cvs-1.12.13-sol10-sparc-local
Una vez instalado todos los paquetes, simplemente vamos a comprobar su correcto funcionamiento, debemos tener en cuenta que los paquetes se instalan en /usr/local y por lo tanto, debemos tener el directorio /usr/local/bin en nuestro PATH
$ which cvs
/usr/local/bin/cvs
$ ldd /usr/local/bin/cvs
libxnet.so.1 => /usr/lib/libxnet.so.1
libnsl.so.1 => /usr/lib/libnsl.so.1
libc.so.1 => /usr/lib/libc.so.1
libmp.so.2 => /lib/libmp.so.2
libmd.so.1 => /lib/libmd.so.1
libscf.so.1 => /lib/libscf.so.1
libdoor.so.1 => /lib/libdoor.so.1
libuutil.so.1 => /lib/libuutil.so.1
libgen.so.1 => /lib/libgen.so.1
libsocket.so.1 => /lib/libsocket.so.1
libm.so.2 => /lib/libm.so.2
/platform/SUNW,Sun-Fire-280R/lib/libc_psr.so.1
/platform/SUNW,Sun-Fire-280R/lib/libmd_psr.so.1
$ cvs -v

Concurrent Versions System (CVS) 1.12.13 (client/server)

Copyright (C) 2008 Free Software Foundation, Inc.

Senior active maintainers include Larry Jones, Derek R. Price,
and Mark D. Baushke. Please see the AUTHORS and README files from the CVS
distribution kit for a complete list of contributors and copyrights.

CVS may be copied only under the terms of the GNU General Public License,
a copy of which can be found with the CVS distribution kit.

Specify the --help option for further information about CVS
Una vez comprobado que nuestro software cvs funciona de forma correcta, vamos a iniciar la configuración de nuestro servidor cvs, para ello, necesitamos seleccionar un directorio en el cual estarán los archivos de repositorio, es decir, nuestro CVSROOT, en nuestro caso será /opt/www/cvs

# mkdir -p /opt/www/cvs
# cvs -d /opt/www/cvs init
Editaremos el archivo /etc/services para incluir los nuevos servicios
cvspserver 2401/tcp # CVS Client/server operations
cvspserver 2401/udp # CVS Client/server operations
Crearemos un archivo de configuración en nuestro HOME (luego lo prodremos borrar) para poder importar la nueva definición

# vi cvs-pserver
cvspserver stream tcp nowait root /usr/local/bin/cvs -f --allow-root=/opt/www/cvs pserver

:wq
Convertimos las entradas de inetd.conf en un archivo de definición de SMF, para ello, debemos utilizar inetconv
# inetconv -f -i cvs-pserver
cvspserver -> /var/svc/manifest/network/cvspserver-tcp.xml
Importando cvspserver-tcp.xml ...Terminado
Editaremos el archivo de definición de inetd y añadiremos la entrada del nuevo servicio
# vi /var/svc/profile/inetd_services.xml

<service name="'network/cvspserver-tcp'" version="'1'" type="'service'">
<instance name="'default'" enabled="'true'/">
</instance>

:wq
Reiniciamos el servicio utilizando svcadm
# svcadm restart inetd:default
Comprobamos que tenemos el servicio escuchando en el puerto que hemos seleccionado
# netstat -an|grep 2401
*.2401 *.* 0 0 49152 0 LISTEN
Ya tenemos nuestro servidor preparado, ahora podemos conectarnos con cualquier cuenta que tenga acceso al sistema, o como en nuestro caso, vamos a crear una cuenta exclusiva para su acceso
# groupadd cvs
# useradd -g cvs -d /export/home/cvs -m cvs
# passwd cvs
password: ********
# chown -r cvs:cvs /opt/ww/cvs
Ahora, nos podemos logear mediante pserver, para ello, deberemos exportar el CVSROOT y hacer login con la contraseña que le hemos asignado al usuario cvs
# su - cvs
$ export CVSROOT=:pserver:cvs@localhost:/opt/www/cvs
$ cvs login
Logging in to :pserver:cvs@localhost:2401/opt/www/cvs
CVS password: ********
Si todo ha sido correcto, nos podremos logear y comenzar a utilizar nuestro cvs de forma normal, por ejemplo, podemos importar nuestro proyecto
$ cd project
$ cd MyTest
$ cvs import Test INITIAL start
Si no queremos que el servidor utilice los usuarios y passwords del sistema, podemos crear un archivo en $CVSROOT/CVSROOT/passwd con el formato similar a /etc/passwd con la contraseña en Crypt y sólo usuario:password


Referencias

sábado, 19 de septiembre de 2009

Cómo ver la versión de Firmware de HBA

Introducción
Para ver la versión de Firmware que tenemos instalado en nuestras HBA QLogic y su versión del driver, utilizaremos el comando luxadm con la opción qlgc

# luxadm qlgc

Found Path to 6 FC100/P, ISP2200, ISP23xx Devices

Opening Device: /devices/pci@2,600000/SUNW,qlc@0,1/fp@0,0:devctl
Detected FCode Version: QLE2462 Host Adapter Driver(SPARC): 1.24 11/15/06

Opening Device: /devices/pci@2,600000/SUNW,qlc@0/fp@0,0:devctl
Detected FCode Version: QLE2462 Host Adapter Driver(SPARC): 1.24 11/15/06

Opening Device: /devices/pci@3,700000/SUNW,qlc@0,1/fp@0,0:devctl
Detected FCode Version: QLE2462 Host Adapter Driver(SPARC): 1.24 11/15/06

Opening Device: /devices/pci@3,700000/SUNW,qlc@0/fp@0,0:devctl
Detected FCode Version: QLE2462 Host Adapter Driver(SPARC): 1.24 11/15/06

Opening Device: /devices/pci@0,600000/pci@0/pci@8/pci@0,1/SUNW,qlc@1,1/fp@0,0:devctl
Detected FCode Version: ISP2312 Host Adapter Driver: 1.14.09 03/08/04

Opening Device: /devices/pci@0,600000/pci@0/pci@8/pci@0,1/SUNW,qlc@1/fp@0,0:devctl
Detected FCode Version: ISP2312 Host Adapter Driver: 1.14.09 03/08/04
Complete
También podemos utilizar el comando fcinfo hba-port para ver el detalle de cada puerto de nuestras HBAs
# fcinfo hba-port
HBA Port WWN: 210000e08b8008dc
OS Device Name: /dev/cfg/c4
Manufacturer: QLogic Corp.
Model: 375-3108-xx
Firmware Version: 3.3.120
FCode/BIOS Version: fcode: 1.13;
Type: unknown
State: offline
Supported Speeds: 1Gb 2Gb
Current Speed: not established
Node WWN: 200000e08b8008dc
HBA Port WWN: 210100e08ba008dc
OS Device Name: /dev/cfg/c5
Manufacturer: QLogic Corp.
Model: 375-3108-xx
Firmware Version: 3.3.120
FCode/BIOS Version: fcode: 1.13;
Type: unknown
State: offline
Supported Speeds: 1Gb 2Gb
Current Speed: not established
Node WWN: 200100e08ba008dc
HBA Port WWN: 2100001b3213c5b1
OS Device Name: /dev/cfg/c1
Manufacturer: QLogic Corp.
Model: 375-3356-02
Firmware Version: 4.2.2
FCode/BIOS Version: BIOS: 1.24; fcode: 1.24; EFI: 1.8;
Type: N-port
State: online
Supported Speeds: 1Gb 2Gb 4Gb
Current Speed: 4Gb
Node WWN: 2000001b3213c5b1
HBA Port WWN: 2101001b3233c5b1
OS Device Name: /dev/cfg/c2
Manufacturer: QLogic Corp.
Model: 375-3356-02
Firmware Version: 4.2.2
FCode/BIOS Version: BIOS: 1.24; fcode: 1.24; EFI: 1.8;
Type: N-port
State: online
Supported Speeds: 1Gb 2Gb 4Gb
Current Speed: 4Gb
Node WWN: 2001001b3233c5b1
HBA Port WWN: 2100001b321294c6
OS Device Name: /dev/cfg/c6
Manufacturer: QLogic Corp.
Model: 375-3356-02
Firmware Version: 4.2.2
FCode/BIOS Version: BIOS: 1.24; fcode: 1.24; EFI: 1.8;
Type: N-port
State: online
Supported Speeds: 1Gb 2Gb 4Gb
Current Speed: 4Gb
Node WWN: 2000001b321294c6
HBA Port WWN: 2101001b323294c6
OS Device Name: /dev/cfg/c7
Manufacturer: QLogic Corp.
Model: 375-3356-02
Firmware Version: 4.2.2
FCode/BIOS Version: BIOS: 1.24; fcode: 1.24; EFI: 1.8;
Type: N-port
State: online
Supported Speeds: 1Gb 2Gb 4Gb
Current Speed: 4Gb
Node WWN: 2001001b323294c6

jueves, 17 de septiembre de 2009

Instalar squid como proxy transparente en Solaris 10 - Parte 2

Introducción
En la primera parte vimos Cómo instalar squid 2.7 sobre Solaris 10, sin embargo en esta ocasión veremos como hacer la instalación de squid como proxy transparente(1), para ello, debemos compilar squid con una opción más: --enable-ipf-transparent

El proceso de compilación he instalación es igual al que detallaba en la primera parte, con la excepción de que en este caso vamos a crear un binario de 64bits utilizando la opción --with-build-environment=POSIX_V6_LP64_OFF64

Definición de "Proxy Transparente"
Aunque muchos (mal)utilizamos el nombre, en realidad lo que queremos decir es "Proxy Interceptado" ya que transparente hace referencia que el servidor proxy no almacene ningún tipo de contenido. Sin embargo, se utiliza transparente con la idea de que el usuario no requiera ningún tipo de cambio en su configuración.

Después de aclarar que es un "Proxy Interceptado" podemos comenzar con la configuración e instalación de squid-cache sobre Solaris 10

Compilar squid sobre Solaris 10 64 bits
En mi configuración voy a utilizar la arquitectura de 64bits ya que me ofrece mejor rendimiento con caches muy grandes, sin embargo, si tu arquitectura no lo soporta, puede eliminar ese parámetro de configuración, puedes comprobarlo siguiendo las instrucciones de Cómo comprobar si Solaris es de 64bits
$ ./configure
--with-build-environment=POSIX_V6_LP64_OFF64
--with-large-files
--with-pthreads
--with-aio
--enable-large-cache-files
--enable-ipf-transparent
--enable-snmp
--enable-http-violations
--enable-default-err-language=Spanish
--enable-cache-digests
--enable-delay-pools
--with-maxfd=16384
--enable-storeio=ufs,diskd
--prefix=/opt/www/squid-2.7
Instalación
Realizaremos los mismos pasos de instalación que en la Parte 1
$ make
# make install
Configuración $SQUID_HOME/etc/squid.conf
La configuración es similar a la que hemos creado en la Parte 1, sin embargo, debemos sustituir el valor de http_port IP:PUERTO por http_port IP:PUERTO transparent
#####################################
## PARAMETROS DE RED
#####################################
http_port 127.0.0.1:1703 transparent

Configuración de IPF
Vamos a configurar nuestro sistema para que direccione todas las conexiones con hacia el puerto 80 (http) al puerto de squid en nuestro caso 1703, para ello deberemos editar el archivo /etc/ipf/ipnat.conf. En nuestra configuración eri0 es nuestro interface external y ce0 nuestro lan -podemos utilizar 0/32 para nuestro interface <ce0> ya que de esta forma, si obtenemos la dirección mediante dhcp, el módulo nos sustituirá 0/32 por la IP asignada-

# vi /etc/ipf/ipnat.conf
map eri0 192.168.1.0/24 -> 0/32 proxy port ftp ftp/tcp
map eri0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto
map eri0 192.168.1.0/24 -> 0/32

rdr ce0 0.0.0.0/0 port 80 -> 127.0.0.1 port 1703

:wq

# ipnat -f /etc/ipf/ipnat.conf
# touch /etc/gateways
Si tienes una versión de Solaris anterior a 11/06, debemos activar el módulo pfil creando -o descomentando- la línea del archivo /etc/ipf/pfil.ap y activando el servicio <svc:/network/pfil:default> y rebotamos la máquina
# cat /etc/ipf/pfil.ap
e1000g  -1      0       pfil
# svcs pfil
STATE          STIME    FMRI
online         21:36:11 svc:/network/pfil:default


Conclusión
En esta ocasión hemos visto cómo instalar squid-cache como proxy interceptado (transparente) y es momento de analizar las ventajas e inconvenientes de las formas de instalación que hemos visto: Instalación Normal o Instalación Interceptada

Esto que parece algo trivial no lo es y por ello creo que es una cuestión para resolverlo en un post dedicado: Ventajas e Incovenientes de Proxy Transparente (Interceptado)

miércoles, 16 de septiembre de 2009

Configuración de IPFilter en Solaris 10 para Hadoop

Introducción
Aunque la documentación de Apache sobre Hadoop insta a desactivar el Firewall, creo que es mejor (aunque lleve más tiempo) tener una sistema de Firewall activo con unas sencillas reglas para evitar el acceso de cualquiera a nuestro cluster.

Aunque esta configuración se hace sobre Solaris 10 para Hadoop, se puede extender a cualquier tipo de filtrado ya que no dejan de ser los mismos comandos y simplemente debemos cambiar las reglas del archivo Aunque esta configuración se hace sobre , se puede extender a cualquier tipo de filtrado ya que no dejan de ser los mismos comandos y simplemente debemos cambiar las reglas del archivo ipf.conf

Comprobar el Estado de IPFilter y activarlo
Nuestro primer paso será comprobar el estado de IPFilter en el sistema, que si no hemos hecho nada antes por defecto viene desactivado.
# svcs ipfilter
STATE STIME FMRI
disabled ago_13 svc:/network/ipfilter:default
Creación de Reglas
Las reglas están en el archivo /etc/ipf/ipf.conf y tiene el siguiente formato:

{block | pass } {in|out} [log] [quick] from {IP|pool|any} [port] to {IP|pool |any} [port]

Por ejemplo, si queremos denegar todos los paquetes que vienen desde la red 10.7.0.0/16 a nuestra máquina (que si recordais nuestro NameNode es la 10.1.1.3) utilizaremos lo siguiente
block in quick from 10.7.0.0/16 to any
block out quick from any to 10.7.0.0/16
Hemos utilizado los modificadores quick y any en nuestro ejemplo para conseguir lo siguiente
  • Modificador quick Si IPFilter hace match en la regla no seguirá evaluando más
  • Modificador any Hace referencia a cualquier IP, es como poner 0.0.0.0/0
Cuándo utilizar quick?
Por regla general es mejor utilizarlo siempre que tengamos un firewall puro, es decir, imaginaros el pseudo archivo de configuración

permit ssh
permit web
permit smtp
block all

En este modelo de firewall (el tradicional y más seguro) debemos dejar de evaluar las reglas, ya que sino evaluaría todas las reglas, y siempre haría match en block all, por ejemplo, un paquete de tráfico ssh se evaluaría así:

  1. permit ssh (OK)
  2. permit web (N/A)
  3. permit smtp (N/A)
  4. block all (DENY)
Y el paquete SSH sería denegado.

Configuración del archivo /etc/ipf/ipf.conf
Vamos a permitir el acceso SSH desde nuestra LAN y acceso a nuestro NameNode, esta versión es muy restrictiva ya que no nos permite acceder a Internet, DNS, icmp, etc. fuera de nuestra LAN

# vi /etc/ipf/ipf.conf
# eliminamos los paquetes peque!nos
block in log quick from any with ipopts
block in log quick proto tcp from any to any with short

##################################
## PERMITIMOS SSH SOLO
##################################
pass in quick from 10.0.0.0/8 to 10.1.1.3/32 port=22
pass out quick from 10.1.1.3/32 port=22 to 10.0.0.0/8
pass in quick from 10.0.0.0/8 port=22 to 10.1.1.3/32
pass out quick from 10.1.1.3/32 to 10.0.0.0/8 port=22

##################################
## PERMITIMOS ACCESO LIBRE EN LAN
##################################
pass in quick from 10.0.0.0/8 to 10.1.1.3/32
pass out quick from 10.1.1.3/32 to 10.0.0.0/8

##################################
## TODO LO DEMAS DENEGADO
##################################
block in from any to any
block out from any to any

:wq
Activaremos nuestro IPFilter y comprobaremos su correcto funcionamiento mediante svcs
# svcadm enable ipfilter
# svcs ipfilter
STATE STIME FMRI
online 10:07:37 svc:/network/ipfilter:default
Una vez activado, debemos cargar las reglas que hemos creado, para ello, utilizaremos el comando ipf con el modificador -f y la ruta donde tenemos las reglas, en nuestro caso /etc/ipf/ipf.conf

Nota: también he utilizado el comando -Fa para que haga un FlushAll esto produce un corte y hay que utilizarlo con cuidado.
# ipf -E
# ipf -Fa -f /etc/ipf/ipf.conf

Referencias

martes, 15 de septiembre de 2009

Cómo editar el crontab en Solaris

Introducción
Por defecto, el comando crontab -e utiliza la variable de entorno EDITOR para seleccionar el editor a utilizar. Esta variable en Solaris no está establecida y por ello, vamos a ver cómo editar nuestro crontab utilizando vi en vez de ed


Cómo ver el contenido del crontab
Para ver el contenido de nuestro crontab simplemente utilizaremos la opción -l del comando
# crontab -l
#ident "@(#)root 1.21 04/03/23 SMI"
#
# The root crontab should be used to perform accounting data collection.
#
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean

Si no hay ninguno asignado, entonces se muestra el siguiente mensaje
$ crontab -l
crontab: no es posible abrir su archivo crontab.
Añadir una entrada
Para incluir una nueva entrada a nuestro crontab, utilizaremos la opción -e del comando. Si no hemos establecido la variable EDITOR entonces utilizará ed por defecto
$ echo $EDITOR

$ crontab -e
0
q
crontab: archivo temporal vacío
Ahora, vamos a exportar EDITOR para que sea vi nuestro editor por defecto
$ export EDITOR=vi
$ crontab -e
"/tmp/crontab0zayNG" 0 líneas, 0 caracteres
~
~
:q!
crontab: archivo temporal vacío
Formato del archivo
El formato del archivo crontab es el siguiente:

Minutos(0-59) Horas(0-23) Dia-de-Mes(1-31) Mes-del-Año(1-12) Día-de-la-Semana(0-6)

Por ejemplo, si queremos que el comando iostat -x > /var/report se ejecute cada hora de lunes a viernes, haremos lo siguiente
# export EDITOR=vi
# crontab -e
#M H D M DD CMD
00 * * * 1,2,3,4,5 /usr/bin/iostat -x > /var/report.txt
:wq

# crontab -l
#ident "@(#)root 1.21 04/03/23 SMI"
#
# The root crontab should be used to perform accounting data collection.
#
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
#10 3 * * * /usr/lib/krb5/kprop_script ___slave_kdcs___
#
#M H D M DD CMD
00 * * * 1,2,3,4,5 /usr/bin/iostat -x > /var/report.txt

Los comentarios empiezan por # como siempre. A diferencia de Linux */n no significa que se repita cada n, en Solaris hay que poner el formato de UNIX SVR

Cómo evitar que un usuario edite su crontab
Para ello, simplemente incluiremos el login en el archivo cron.deny que se encuentra en /etc/cron.d
# cd /etc/cron.d
# cat cron.deny
daemon
bin
nuucp
listen
nobody
noaccess
# echo "oracle" >> cron.deny
# su - oracle
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
$ crontab -e
crontab: no está autorizado para utilizar cron.


lunes, 14 de septiembre de 2009

Cómo ampliar la swap en Solaris

Introducción
Si necesitamos ampliar el espacio swap de Solaris de forma temporal, podemos añadir un archivo a nuestro entorno swap utilizando el comando swap, para ello crearemos un archivo utilizando mkfile y posteriormente lo añadiremos, por ejemplo:

Añadir un archivo a la swap
En nuestro caso tenemos 5,7 Gb asignados a la swap utilizando dos discos SCSI, y vamos a añadir otros 2 Gb
# swap -l
swapfile dev swaplo bloques libre
/dev/dsk/c5t20000004CF8F7B64d0s1 118,1489 16 8389632 7303072
/dev/dsk/c5t20000004CF7FE30Ed0s1 118,1497 16 8389632 7329600
Creamos el archivo de 2Gb en el root
# mkfile 2048m /myswap.file
# ls -lah /myswap.file
-rw------T 1 root root 2,0G sep 14 15:32 /myswap.file
Añadimos el nuevo archivo a nuestra swap
# swap -a /myswap.file
# swap -l
swapfile dev swaplo bloques libre
/dev/dsk/c5t20000004CF8F7B64d0s1 118,1489 16 8389632 7258288
/dev/dsk/c5t20000004CF7FE30Ed0s1 118,1497 16 8389632 7283712
/myswap.file - 16 4194288 4194288
Una vez finalizado nuestro uso intensivo, podemos eliminar nuestro archivo de la swap utilizando el siguiente comando:
# swap -d /myswap.file
# swap -l
swapfile dev swaplo bloques libre
/dev/dsk/c5t20000004CF8F7B64d0s1 118,1489 16 8389632 7258288
/dev/dsk/c5t20000004CF7FE30Ed0s1 118,1497 16 8389632 7283728
Si quisieramos hacer permanente este cambio, simplemente editariamos el archivo /etc/vfstab e incluiriamos la siguiente línea:
/myswap.file - - swap - no -
Añadir una partición raw
Si por el contrario (y más recomendable) quisieramos añadir un nuevo disco (o partición) a nuestra swap, haríamos lo siguiente:
# swap -l
swapfile dev swaplo bloques libre
/dev/dsk/c5t20000004CF8F7B64d0s1 118,1489 16 8389632 7258288
# swap -a /dev/dsk/c5t20000004CF7FE30Ed0s1
# vi /etc/vfstab
/dev/dsk/c5t20000004CF7FE30Ed0s1 - - swap - no -
:wq
# swap -l
swapfile dev swaplo bloques libre
/dev/dsk/c5t20000004CF8F7B64d0s1 118,1489 16 8389632 7258288
/dev/dsk/c5t20000004CF7FE30Ed0s1 118,1497 16 8389632 7283728

Problemas al intentar añadir una partición raw
Puede que Solaris nos de un error al intentar añadir una partición raw diciendo:
# swap -a /dev/dsk/c5t20000004CF7FE30Ed0s1
/dev/dsk/c5t20000004CF7FE30Ed0s1 está normalmente montado en de acuerdo con /etc/vfstab. Elimine esta entrada para utilizar este dispositivo.

Esto es debido a:
  1. Hemos añadido al fichero /etc/vfstab la partición antes de ejecutar swap -a
  2. Hemos eliminado la partición (por algún motivo) y ésta está incluida en el archivo /etc/vfstab
Para solucionarlo, simplemente editaremos el archivo /etc/vfstab y comentaremos la entrada de nuestra partición raw
# vi /etc/vfstab
# swap el primer disco
/dev/dsk/c5t20000004CF8F7B64d0s1 - - swap - no -
# swap en el segundo disco
#/dev/dsk/c5t20000004CF7FE30Ed0s1 - - swap - no -

:wq

# swap -a /dev/dsk/c5t20000004CF7FE30Ed0s1
# vi /etc/vfstab
# swap el primer disco
/dev/dsk/c5t20000004CF8F7B64d0s1 - - swap - no -
# swap en el segundo disco
/dev/dsk/c5t20000004CF7FE30Ed0s1 - - swap - no -

:wq

Referencias

jueves, 10 de septiembre de 2009

Cómo configurar cliente DHCP en Solaris

Introducción
Para configurar un interface de red mediante DHCP en Solaris, utilizaremos el comando ifconfig como veremos a continuación. En nuestro ejemplo, vamos a habilitar nuestro interface e1000g0
# ifconfig e1000g0 plumb
# ifconfig e1000g0 dhcp start
Si queremos que se nos configure nuestro interface cada vez que iniciemos nuestro sistema, debemos crear un archivo /etc/dhcp._interface_
# touch /etc/dhcp.e1000g0
Si por el contrario queremos el estado de nuestra concesión, utilizaremos el argumento status de la siguiente forma.
# ifconfig e1000g0 dhcp status

Referencias

martes, 8 de septiembre de 2009

Cómo configurar ssh para que no pida contraseña

Introducción
Ya hemos visto que es muy interesante configurar nuestro acceso ssh para que no nos solicite una contraseña, un ejemplo es en la Instalación de Hadoop, para ello deberemos crear un archivo llamado authorized_keys2 en el host al cual queremos conectarnos utilizando la clave pública que hemos creado, normalmente el archivo id_rsa.pub

Generamos las claves RSA en el host origen
$ ssh-keygen -t rsa -b 2048 -C "MacBook Key"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/itily/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/itily/.ssh/id_rsa.
Your public key has been saved in /Users/itily/.ssh/id_rsa.pub.
The key fingerprint is:
00:eb:04:fa:31:20:3b:0a:41:52:ae:30:9e:bb:c3:05 MacBook Key
The key's randomart image is:
+--[ RSA 2048]----+
|*oo . |
|o* . o |
|B + o . |
|=E.= . |
|ooo . S |
| .. |
|... |
| o. |
| .. |
+-----------------+
$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvRSEmi4Nk2+hIbztxBbzJDEoT/s9iJhN7oQdXfjRsBcX8L1xcpRCWiAObqBVTBu2XOc0yrb5aG/1SLaQrOiz0Cq1uKDgxZ8A5ZdMk328zKSVHsPSH3wXDB9z+oshjXSXWM4aJ0k4AI/qbGfeFRT+kNdDK4GjXtEoF+PNDtd1QOBaXP3GBhxGLJ85XViSrUHDAlAiJm28xCQa1kIXXRuiynDoVO1BY0Wy2CPq5HPgKddthmtwvhh3+2dvcRPyumgvyIIu+nHGv+BKPBGRVMObSSNlnSmGR8pIMVekcw8xGYbAvofueDAkLAVil9WBEpO9v25am9EEc2/skdF2PTfpmQ== MacBook Key
Nos conectamos al host destino y creamos el archivo authorized_keys2 en el directorio $HOME/.ssh
$ ssh osiris.sfchildren.com
Password:
Last login: Tue Sep 8 00:57:52 2009 from MacBookPro
Osiris:~ itily$ vi $HOME/.ssh/authorized_keys2
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvRSEmi4Nk2+hIbztxBbzJDEoT/s9iJhN7oQdXfjRsBcX8L1xcpRCWiAObqBVTBu2XOc0yrb5aG/1SLaQrOiz0Cq1uKDgxZ8A5ZdMk328zKSVHsPSH3wXDB9z+oshjXSXWM4aJ0k4AI/qbGfeFRT+kNdDK4GjXtEoF+PNDtd1QOBaXP3GBhxGLJ85XViSrUHDAlAiJm28xCQa1kIXXRuiynDoVO1BY0Wy2CPq5HPgKddthmtwvhh3+2dvcRPyumgvyIIu+nHGv+BKPBGRVMObSSNlnSmGR8pIMVekcw8xGYbAvofueDAkLAVil9WBEpO9v25am9EEc2/skdF2PTfpmQ== MacBook Key


:wq

Osiris:~ itily$ exit
Comprobamos que nos conectamos correctamente
$ ssh osiris.sfchildren.com
Last login: Tue Sep 8 00:58:08 2009 from MacBookPro
Osiris:~ itily$ exit

Referencias

lunes, 7 de septiembre de 2009

Instalar FreeBSD 7.2 en VirtualBox 3 sobre Mac OS X - Parte 2

Introducción
En la primera parte de la instalación hemos visto cómo configurar VirtualBox para que la instalación transcurra sin problemas. Ahora, vamos a instalar FreeBSD de forma tradicional utilizando el CD1 de FreeBSD 7.2

Instalación de FreeBSD
Seleccionamos el idioma, region y tipo de teclado. En mi caso es_ES

Una vez seleccionado el idioma, vamos a empezar con el proceso de instalación, para ello utilizamos el formato de instalación Standard y pulsamos intro

El instalador nos informa que va a lanzar la utilidad fdisk con la cual podremos asignar el espacio que deseamos a nuestra instalación de FreeBSD

La configuración del espacio asignado a FreeBSD es igual que Solaris, es decir, debemos crear una partición UFS sobre la que instalaremos. Recordar que es necesario Activar la Partición.

Si queremos utilizar todo el disco, pulsaremos la tecla a y nos situaremos sobre la partición creada y pulsaremos la tecla s

Pulsamos la telca q y continuamos con la instalación seleccionando Install the FreeBSD Boot Manager


A continuación vamos a definir nuestro espacio de swap y muntos de montaje. Yo he creado un sólo punto de montaje para / con el fin de simplificar el post, sin embargo, en una instalación real, será necesario separar /var, /home, /usr, / en diferentes puntos (discos) de montaje. Sobre el tamaño de swap yo utilizo la definición de Solaris que define como mínimo 1,5 * RAM, simplificando, asignaremos el doble de RAM como swap.

Pulsaremos la tecla c para crear la swap



Volvemos a pulsar la tecla c para crear nuestro único punto de montaje (recuerda que es por simplificar)




Una vez finalizado pulsaremos la tecla q para continuar con la instalación.

Ahora vamos a seleccionar los paquetes que queremos instalar, yo he seleccionado el sistema básico sin el entorno gráfico X11, y soporte para compilar el kernel

Una vez tengas seleccionado qué quieres instalar, pulsamos sobre ok y debemos seleccionar la fuente, es decir, de dónde queremos instalarlo, en mi caso vamos a utilizar el CD que tenemos montado.
Este es el último paso antes de que FreeBSD comience con la instalación, estamos seguros?

Pulsamos yes y el instalador comenzará a realizar sus tareas, nos irá poniendo un progreso similar a este


Cuando concluya, nos mostrará la pantalla de felicitación de FreeBSD

Tras pulsar ok podremos configurar lo instalación, es decir, interfaces de red, usuarios, password de root, etc.








Y aquí está el resultado final!



Conclusión
Hemos instalado FreeBSD en nuestra máquina virtual VirtualBox sobre MacOS X Snow Leopard, hemos realizado una instalación básica sin soporte gráfico, además no hemos instalado los ports ya que tengo por constumbre bajarlos siempre desde el repositorio, así siempre están actualizados.

Espero no haberos aburrido con este super "gráfico" post ... en el siguiente veremos cómo actualizar los ports y FreeBSD para tenerlo siempre a la última

Referencias

sábado, 5 de septiembre de 2009

Cómo compilar todos los objetos en Oracle 10g

Para compilar todos los objetos en una base de datos Oracle, nos conectaremos a la base de datos con el usuario que instaló Oracle 10g y ejecutamos
$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Wed Aug 12 11:53:27 2009

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Conectado a:
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production

SQL> @?/rdbms/admin/utlrp.sql

viernes, 4 de septiembre de 2009

Comandos básicos y no tan básicos de Solaris

Introducción
Hace un tiempo comencé a escribir unos minis howto con los principales comandos de Solaris, ahora, he creado este post para tenerlos todos agrupados, además ire actualizando las entradas para que éste sea el punto de entrada.
Espero que os sirva,