viernes, 3 de junio de 2011

FIlesystem en Cluster OCFS2 para Centos / Red Hat

Saludos desde el ciberespacio lectores virtuales (?)

En esta nueva entrega os explicare como instalar un filesystem en cluster (Oracle Cluster Filesystem 2). Muy util para soluciones de alta disponibilidad, es bastante simple de instalar comparado a otras opciones, como por ejemplo GFS2 de RedHat. Yo lo utilizo para compartir logfiles de una instalacion en cluster de PostgreSQL, pero sirve para cualquier cosa...
En mi configuracion se instalo sobre una unidad iscsi, compartida entre dos servidores (Nodos), uno real y otro virtual (con xen).

La instalacion se debe realizar en todos los nodos que vayan a compartir el filesystem.

Primero se instalan las dependencias en los nodos
yum install -y vte

Luego se descargan los paquetes de OCFS2, para mi caso de 64 bits, si necesitan para 32 bits los pueden descargar de http://oss.oracle.com/projects/ocfs/files/

wget http://oss.oracle.com/projects/ocfs2/dist/files/RedHat/RHEL5/x86_64/1.4.7-1/2.6.18-238.9.1.el5/ocfs2-2.6.18-238.9.1.el5-1.4.7-1.el5.x86_64.rpm
wget http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL5/x86_64/1.4.4-1/ocfs2-tools-1.4.4-1.el5.x86_64.rpm
wget http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL5/x86_64/1.4.4-1/ocfs2console-1.4.4-1.el5.x86_64.rpm
rpm -ivh ocfs2-2.6.18-238.9.1.el5-1.4.7-1.el5.x86_64.rpm ocfs2-tools-1.4.4-1.el5.x86_64.rpm ocfs2console-1.4.4-1.el5.x86_64.rpm
 Luego se instalan los rpm

rpm -ivh ocfs2-2.6.18-238.9.1.el5-1.4.7-1.el5.x86_64.rpm ocfs2-tools-1.4.4-1.el5.x86_64.rpm ocfs2console-1.4.4-1.el5.x86_64.rpm

Para el nodo con kernel xen, difiere un poco la instalacion

wget http://oss.oracle.com/projects/ocfs2/dist/files/RedHat/RHEL5/x86_64/1.4.7-1/2.6.18-238.el5/ocfs2-2.6.18-238.el5xen-1.4.7-1.el5.x86_64.rpm
wget http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL5/x86_64/1.4.4-1/ocfs2-tools-1.4.4-1.el5.x86_64.rpm
wget http://oss.oracle.com/projects/ocfs2-tools/dist/files/RedHat/RHEL5/x86_64/1.4.4-1/ocfs2console-1.4.4-1.el5.x86_64.rpm

rpm -ivh ocfs2-2.6.18-238.el5xen-1.4.7-1.el5.x86_64.rpm ocfs2-tools-1.4.4-1.el5.x86_64.rpm ocfs2console-1.4.4-1.el5.x86_64.rpm 

En alguno de los dos nodos, ahora, hay que darle formato al disco:



mkfs.ocfs2 --fs-features=nosparse,inline-data /dev/mapper/mpath2p1

(cambiar /dev/mapper/mpath2p1 por la unidad correspondiente segun el caso)

ahora se activa el o2cb. NOTA: va a tirar un error la primera vez


/etc/init.d/o2cb enable

Writing O2CB configuration: OK
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading stack plugin "o2cb": OK
Cluster not known

Luego se edita el archivo /etc/ocfs2/cluster.conf con la configuracion de los nodos y el nombre del cluster
node:
        ip_port = 7777
        ip_address = 10.10.10.30
        number = 0
        name = db02.crapfields.com.ar
        cluster = ocfs2

node:
        ip_port = 7777
        ip_address = 10.10.10.20
        number = 1
        name = db01.crapfields.com.ar
        cluster = ocfs2

cluster:
        node_count = 2
        name = ocfs2

Ahora si, se inicia el servicio
/etc/init.d/o2cb start
de paso, ya lo agrego como servicio del sistema
chkconfig o2cb on

Finalmente se monta la unidad

mount /dev/mpath/mpath2p1 /u02

En el caso de necesitar que se monte la unidad al inicio del sistema, editar el archivo /etc/fstab

/dev/mapper/mpath2p1     /u02                   ocfs2   _netdev,datavolume     0 0


y eso es todo! Espero que les sirva.

viernes, 20 de mayo de 2011

Heartbeat en Red Hat Enterprise Linux 5 (RHEL 5)

Una vez mas por este baticanal, amigos 2.0 les vengo a mostrar una nueva solucion a los problemas cotidianos del administrador de red (??)
Generalmente trabajo con CentOS, pero esta vez me pagaron una licencia de RedHat para unos blades que estoy configurando. Necesitaba usar Heartbeat (para alta disponibilidad de servicios), y me encontre con que no esta en los repositorios pagos de RedHat.

La instalacion es bastante simple, por medio de rpms. Ahi les va el como:

Primero instalar paquetes de dependencias
yum install -y libtool-ltdl openhpi-libs PyXML pygtk2-libglade
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/libnet-1.1.5-1.el5.x86_64.rpm
rpm -ivh libnet-1.1.5-1.el5.x86_64.rpm


Ahora si se instalan los paquetes de heartbeat en cuestion

wget http://serverbeach1.fedoraproject.org/pub/epel/5/x86_64/heartbeat-pils-2.1.4-11.el5.x86_64.rpm
rpm -ivh heartbeat-pils-2.1.4-11.el5.x86_64.rpm
wget http://serverbeach1.fedoraproject.org/pub/epel/5/x86_64/heartbeat-stonith-2.1.4-11.el5.x86_64.rpm
rpm -ivh heartbeat-stonith-2.1.4-11.el5.x86_64.rpm
wget http://serverbeach1.fedoraproject.org/pub/epel/5/x86_64/heartbeat-2.1.4-11.el5.x86_64.rpm
rpm -ivh heartbeat-2.1.4-11.el5.x86_64.rpm
wget http://serverbeach1.fedoraproject.org/pub/epel/5/x86_64/heartbeat-gui-2.1.4-11.el5.x86_64.rpm
rpm -ivh heartbeat-gui-2.1.4-11.el5.x86_64.rpm

En el proximo programa (?) os explicare que es heartbeat, para que sirve y como se configura.

Un saludo a todos los que me conocen!

miércoles, 6 de abril de 2011

Solucionando error en Xen "received packet with own address as source address"

Hola ciberamigos... hoy me encontre con un problema un poco extraño en dos de mis VM en Xen. Un error que decia asi:

vif 0.0: received packet with own address as source address

Esto se debe a un problema con CentOS y la instalacion de Xen, el encontrarse dos o mas maquinas con Dom0 en la misma red. Supongamos que el equipo A recibe broadcast del equipo B, y este ve que esta recibiendo un paquete con su misma mac address (o algo asi, la verdad no entendi bien, no estudie ccna (?!!?!?))

Buscando y buscando encontre la solucion gracias a un tal Cyrus Katrak, asi que los creditos son para el.

se debe reemplazar el archivo /etc/xen/scripts/network-bridge por el siguiente

#!/bin/bash
#============================================================================
# Default Xen network start/stop script.
# Xend calls a network script when it starts.
# The script name to use is defined in /etc/xen/xend-config.sxp
# in the network-script field.
#
# This script creates a bridge (default xenbr${vifnum}), adds a device
# (default eth${vifnum}) to it, copies the IP addresses from the device
# to the bridge and adjusts the routes accordingly.
#
# If all goes well, this should ensure that networking stays up.
# However, some configurations are upset by this, especially
# NFS roots. If the bridged setup does not meet your needs,
# configure a different script, for example using routing instead.
#
# Usage:
#
# network-bridge (start|stop|status) {VAR=VAL}*
#
# Vars:
#
# vifnum Virtual device number to use (default 0). Numbers >=8
# require the netback driver to have nloopbacks set to a
# higher value than its default of 8.
# bridge The bridge to use (default xenbr${vifnum}).
# netdev The interface to add to the bridge (default eth${vifnum}).
# antispoof Whether to use iptables to prevent spoofing (default no).
#
# Internal Vars:
# pdev="p${netdev}"
# vdev="veth${vifnum}"
# vif0="vif0.${vifnum}"
#
# start:
# Creates the bridge
# Copies the IP and MAC addresses from netdev to vdev
# Renames netdev to be pdev
# Renames vdev to be netdev
# Enslaves pdev, vdev to bridge
#
# stop:
# Removes netdev from the bridge
# Transfers addresses, routes from netdev to pdev
# Renames netdev to vdev
# Renames pdev to netdev
# Deletes bridge
#
# status:
# Print addresses, interfaces, routes
#
#============================================================================

#macid is used to uniquely identify this dom0 on this network
#change this to avoid MAC address conflicts if you get:
#"peth0: received packet with own address as source address"
macid="F0"

dir=$(dirname "$0")
. "$dir/xen-script-common.sh"
. "$dir/xen-network-common.sh"

findCommand "$@"
evalVariables "$@"

vifnum=${vifnum:-$(ip route list | awk '/^default / { print $NF }' | sed 's/^[^0-9]*//')}
vifnum=${vifnum:-0}
bridge=${bridge:-xenbr${vifnum}}
netdev=${netdev:-eth${vifnum}}
antispoof=${antispoof:-no}

pdev="p${netdev}"
vdev="veth${vifnum}"
vif0="vif0.${vifnum}"

get_ip_info() {
addr_pfx=`ip addr show dev $1 | egrep '^ *inet' | sed -e 's/ *inet //' -e 's/ .*//'`
gateway=`ip route show dev $1 | fgrep default | sed 's/default via //'`
}

do_ifup() {
if ! ifup $1 ; then
if [ ${addr_pfx} ] ; then
# use the info from get_ip_info()
ip addr flush $1
ip addr add ${addr_pfx} dev $1
ip link set dev $1 up
[ ${gateway} ] && ip route add default via ${gateway}
fi
fi
}

# Usage: transfer_addrs src dst
# Copy all IP addresses (including aliases) from device $src to device $dst.
transfer_addrs () {
local src=$1
local dst=$2
# Don't bother if $dst already has IP addresses.
if ip addr show dev ${dst} | egrep -q '^ *inet ' ; then
return
fi
# Address lines start with 'inet' and have the device in them.
# Replace 'inet' with 'ip addr add' and change the device name $src
# to 'dev $src'.
ip addr show dev ${src} | egrep '^ *inet ' | sed -e "
s/inet/ip addr add/
s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/[0-9]\+\)@\1@
s/${src}/dev ${dst}/
" | sh -e
# Remove automatic routes on destination device
ip route list | sed -ne "
/dev ${dst}\( \|$\)/ {
s/^/ip route del /
p
}" | sh -e
}

# Usage: transfer_routes src dst
# Get all IP routes to device $src, delete them, and
# add the same routes to device $dst.
# The original routes have to be deleted, otherwise adding them
# for $dst fails (duplicate routes).
transfer_routes () {
local src=$1
local dst=$2
# List all routes and grep the ones with $src in.
# Stick 'ip route del' on the front to delete.
# Change $src to $dst and use 'ip route add' to add.
ip route list | sed -ne "
/dev ${src}\( \|$\)/ {
h
s/^/ip route del /
P
g
s/${src}/${dst}/
s/^/ip route add /
P
d
}" | sh -e
}


##

Reiniciar el equipo y listo, solucionado!

viernes, 1 de abril de 2011

Cluster de Alta disponibilidad con LVS (Linux Virtual Server)

Alta disponibilidad de servicios con LVS (Linux Virtual Server)

Hola amiguitos virtuales(?).Hoy les voy a mostrar como hice para configurar un cluster de alta disponibilidad de Apache. Tambien se puede hacer de otros servicios (FTP, Telnet, etc).

La estructura de funcionamiento es la siguiente; hay uno o mas balanceadores o directores que comparten una ip virtual que es la que presta servicio, es decir que los clientes se conectan a una ip, supongamos 192.168.10.27. Esta seria la ip virtual, los equipos directores tienen 2 direcciones ip, la real (que no se comparte, supongamos 192.168.10.23) y la virtual que se comparte con los demas directores del servicio.
Se completa la configuracion con dos servidores Apache (en este caso son dos, pueden ser mas).
Hay distintos tipos de ruteo en lvs, en este caso use Direct Routing porque tengo todo en la misma red, de otro modo habria que usar NAT.

En mi caso son dos directores y dos apache. Los cuatro equipos tienen CentOS, asi que esta guia es valida para CentOS / Red Hat / Fedora, aunque conceptualmente es lo mismo en cualquier linux, salvo la herramienta para configurar el cluster lvs que es propietaria de Red Hat, tal vez en otras distros haya algo similar

En los directores lvs:

Instalar piranha (consola de configuracion de HA) e ipvsadm (paquete de servicios lvs)
yum install -y ipvsadm piranha


Habilitar los servicios al inicio.

chkconfig pulse on
chkconfig piranha-gui on
chkconfig httpd on

Establecer una clave para el servicio piranha

piranha-passwd

Habilitar forwarding de paquetes en el kernel y modificar parametros ARP

en /etc/sysctl.conf agregar o editar las siguientes lineas

net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2


Se reinicia el equipo para que queden aplicados los cambios y luego para acceder a piranha http://ip.del.director:3636


Luego en "Global Settings" se configura la ip del director primario, en mi caso 192.168.10.23 y el tipo de red (Direct Routing). En el campo "Private server IP" no poner nada, ya que en este caso no hay dos adaptadores de red en el director.



En Redundancy ingresar la ip del director lvs secundario, en mi caso 192.168.10.24, lo demas dejarlo como esta.



Ahora, en virtual server se configura la ip que prestara servicio, es decir la ip visible de servicio. En mi caso seria para acceder al servicio, por ejemplo http://192.168.10.27.
Dejar todo como esta y en el tipo de scheduling seleccionar "Weightead-least Connections". Esta opcion es para que distribuya la carga en funcion al peso que tenga cada equipo y es proporcional. Suponiendo que Servidor A tiene peso 1 y Servidor B tiene peso 2, por cada DOS conexiones que tenga B, el servidor A va a tener una.

Una vez finalizado esto en la opcion de REAL SERVERS, se ingresan las ips y el peso de los equipos que van a prestar servicio, en el ejemplo es 192.168.10.205 con peso 1 (y 192.168.10.102 con peso 1 que ya lo configure desde antes).


Ya esta casi finalizada la configuracion, solo hay que definir el monitoreo de los servicios (en MONITORING SCRIPTS). Yo no utilice la opcion por defecto de piranha sino que use un script que me robe por ahi (!)
en /etc/sysconfig/ha crear un archivo llamado check_apache

#!/bin/bash
if links -dump -eval 'set connection.receive_timeout = 1' -eval 'set connection.retries = 1' -eval 'set connection.unrestartable_receive_timeout = 1' http://$1/ > /dev/null 2>&1; then

echo "OK"

else

echo "FAILURE"

fi

exit 0

Se guarda el archivo y se pasa a configurar en piranha el script de monitoreo. (No olvidar de darle permisos 755 al archivo).



Aceptar para aplicar los cambios, y NO OLVIDAR DE ACTIVAR LOS SERVIDORES!!!. Si no se activan no inicia el servicio despues....

Para configurar el director secundario (192.168.10.24 en mi caso) copiar el archivo /etc/sysconfig/ha/lvs.cf del primario hacia el secundario y el script check_apache dentro del mismo directorio.
Una vez terminado esto, hacer un service pulse restart en los dos directores.
En /var/log/messages se muestra el estado del servicio, por ejemplo

Apr 1 13:00:18 xxxx pulse[7834]: STARTING PULSE AS MASTER
Apr 1 13:00:21 xxxx pulse[7834]: backup inactive: activating lvs
Apr 1 13:00:21 xxxx lvs[7839]: starting virtual service web1 active: 80
Apr 1 13:00:21 xxxx nanny[7848]: starting LVS client monitor for 192.168.10.27:80 -> 192.168.10.205:80
Apr 1 13:00:21 xxxx lvs[7839]: create_monitor for web1/application1 running as pid 7848
Apr 1 13:00:21 xxxx nanny[7852]: starting LVS client monitor for 192.168.10.27:80 -> 192.168.10.120:80
Apr 1 13:00:21 xxxx lvs[7839]: create_monitor for web1/application2 running as pid 7852
Apr 1 13:00:21 xxxx nanny[7848]: [ active ] making 192.168.10.205:80 available
Apr 1 13:00:21 xxxx nanny[7852]: [ active ] making 192.168.10.120:80 available
Apr 1 13:00:26 xxxx pulse[7843]: gratuitous lvs arps finished

Listo con los directores. Si se prueba el servicio NO VA A FUNCIONAR, esto es por un problema de ARP en lvs, para mas info detallada http://www.linuxvirtualserver.org/docs/arp.html

Se proponen varias soluciones, yo utilice arptables. Para esto EN LOS SERVIDORES REALES, se debe instalar el paquete arptables

yum install -y arptables_jf
una vez instalado el paquete, se inicia el servicio y se corren los comandos arp correspondientes

service arptables_jf start
arptables -A IN -d 192.168.10.27 -j DROP # se dropean los pedidos arp a la ip virtual del lvs. En otros casos cambiar 192.168.10.27 por la correspondiente

arptables -A OUT -d 192.168.10.27 -j mangle --mangle-ip-s 192.168.10.205 # se sacan los paquetes de la ip flotante por la ip REAL del servidor, en otros casos cambiar 192.168.10.205 por la ip del servidor.
Guardar las tablas:

service arptables_jf save
Activar servicio arptables al inicio

chkconfig arptables_jf on

Ahora se debe crear un adaptador virtual con la ip virtual de lvs

ifconfig eth0:1 192.168.10.27 netmask 255.255.255.0 broadcast 192.168.10.255 up
NOTA: Agregar esta linea a /etc/rc.local ya que al reiniciarse el equipo se pierden esos cambios

agregar a /etc/sysctl.conf

net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
Reiniciar el equipo y listo!

Al acceder a http://192.168.10.27 tendremos un cluster apache con failover y balanceo de carga (en mi caso con relacion 1 a 1).




martes, 15 de marzo de 2011

Instalando paquetes en XenServer 5.x

Para instalar paquetes ya precompilados (rpm) en versiones de XenServer (por ejemplo algun compilador tipo gcc o cpp que no vienen instalados por defecto) se debe habilitar el repositorio base, ya que el repositorio por defecto solo tiene las herramientas para xen.

por ejemplo


yum --enablerepo=base install cpp gcc

En mi caso lo necesitaba para compilar un agente de inventario de hardware. No olvidar que el XenServer es un kernel de CentOS, asi que algunos rpm para Centos / Fedora / Red Hat pueden llegar a servir.

lunes, 6 de septiembre de 2010

Jaula chroot via sftp en CentOS

Hola a todos!!

Hace unos dias necesite crear unos accesos via ftp seguro al ftp de la compañia para la cual trabajo. El requerimiento era tambien enjaular al usuario dentro de ese mismo contexto sftp (actualmente trabajamos con vsftp que SI ofrece chroot, pero solo para ftp).
El problema basico es que la version de OpenSSH que tiene CentOS instalada por defecto es un poco vieja y hay parametros que no funcionan.
Encontre un repo donde hay RPMs de OpenSSH actualizados para 32 y 64 bits.

Para instalar el nuevo OpenSSH:
wget http://fs12.vsb.cz/hrb33/el5/hrb-ssh/stable/i386/openssh-5.1p1-3.el5.hrb.i386.rpm
wget http://fs12.vsb.cz/hrb33/el5/hrb-ssh/stable/i386/openssh-clients-5.1p1-3.el5.hrb.i386.rpm
wget http://fs12.vsb.cz/hrb33/el5/hrb-ssh/stable/i386/openssh-server-5.1p1-3.el5.hrb.i386.rpm
En este caso tuve que instalar de 32 bits, para 64 bits http://fs12.vsb.cz/hrb33/el5/hrb-ssh/stable/x86_64/

una vez tomados los paquetes, desinstalar los rpm actuales

yum remove -y openssh-server openssh
instalo version nueva que habia bajado con wget

rpm -ivh openssh-5.1p1-3.el5.hrb.i386.rpm
rpm -ivh openssh-clients-5.1p1-3.el5.hrb.i386.rpm
rpm -ivh openssh-server-5.1p1-3.el5.hrb.i386.rpm
ahora creo un usuario para sftp con un grupo especial llamado ftponly

groupadd ftponly
useradd ftpuser -g ftponly
lo ultimo que falta es editar el archivo de configuracion de OpenSSH

vim /etc/ssh/sshd_config

comentar la linea
#Subsystem sftp /usr/libexec/openssh/sftp-server

y reemplazar por...

Subsystem sftp internal-sftp


y agregar...
Match User ftpuser
ChrootDirectory /directoriosftp
AllowTCPForwarding no
X11Forwarding no


y.. reinicio el servicio
service sshd restart

tambien se podria usar Match Group en el caso de ser varios usuarios en la misma jaula chroot.
nota: con ssh NO se enjaluara el usuario, esto es solo valido para sftp

viernes, 27 de agosto de 2010

Validando clientes de Ubuntu en Active Directory

Supongamos que tenemos una red mixta, con clientes Window$ y x ejemplo IT y desarrolladores utilizan linux y el equipo de diseñadores usa macintosh. El problema con el que nos encontramos es que los usuarios Windows se pueden validar al dominio, pero los demas usuarios por defecto no pueden, deberiamos crearles usuarios locales, y muchas veces (como es en mi caso) esto no es posible al tener logins unificados contra el arbol de Active Directory.
Afortunadamente existe un programita llamado likewise que nos soluciona todo esto (http://www.likewise.com)

En ubuntu lo podemos instalar desde los repositorios, cualquier otra plataforma se puede bajar el software desde la pagina que les pase antes.
para instalarlo

apt-get install likewise-open

una vez instalado, se debe unir al equipo a la red Window$, antes fijarse que las entradas de dns para el equipo a unir esten presentes, mas especialmente si el dns es de Micro$oft, a veces puede ocasionar problemas.
El comando es

domainjoin-cli join tudominio.com.ar admin


en mi caso puse admin porque admin es mi cuenta de administrador de dominio, sino ingresar la que corresponda


root@pirulo:~# domainjoin-cli join pepe.com.ar admin
Joining to AD Domain: pepe.com.ar
With Computer DNS Name: pirulo.pepe.com.ar

admin@PEPE.COM.AR's password:

DNS update failed!
SUCCESS



A no asustarse con el error de DNS update, solo avisa que la entrada en el DNS ya estaba y no la puede actualizar.

Ya esta unido el linux a Active Directory. Para que el usuario se loguee deberia loguearse como "dominio\usuario", esto se evita agregando al archivo etc/samba/lwiauthd.conf

winbind use default domain = yes


y listo! ya se puede usar usuarios de windows en linux.