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.

jueves, 26 de agosto de 2010

Bloquear Facebook por HTTPS con iptables en IpCop

Ultimamente en la oficina me encontre con que, a pesar que tengo filtro http para determinadas urls, me hacian un bypass del SquidGuard por el puerto 443 (HTTPS).

Actualmente estoy usando IpCop 1.4.21 + layer 7 + UrlFilter (SquidGuard) + AdvProxy (2.7 stable 9).

Para poder bloquear el trafico a determinados sitios por https use iptables.
Obviamente no es tan facil tocar las tablas que vienen por defecto, para agregar reglas personalizadas hay una cadena CUSTOMFORWARD

Editamos el archivo /etc/rc.d/rc.local

#bloqueo facebook
#primero HABILITO a la ip o las ips que esten permitidas acceder a la ip en cuestion (facebook)
/sbin/iptables -t filter -A CUSTOMFORWARD -s 192.168.10.11/24 -d 66.220.144.0/20 -p tcp --dport 443 -j ACCEPT
#DENIEGO a todas las demas
/sbin/iptables -t filter -A CUSTOMFORWARD -s 192.168.10.0/24 -d 69.63.189.0/24 -p tcp --dport 443 -j DROP
#DENIEGO otro rango de ips que a veces es usado por facebook
/sbin/iptables -t filter -A CUSTOMFORWARD -s 192.168.10.0/24 -d 69.63.190.0/24 -p tcp --dport 443 -j DROP

esta es otra manera de hacerlo, pero atentos ya que nuestro ipcop debe tener el modulo iprange (el mio si lo tiene, tal vez haya alguna version sin este modulo)


/sbin/iptables -t filter -A CUSTOMFORWARD -m iprange --src-range 192.168.10.2-192.168.10.250 -d 204.74.0.0/16 -p tcp --dport 443 -j DROP
/sbin/iptables -t filter -A CUSTOMFORWARD -m iprange --src-range 192.168.10.2-192.168.10.250 -d 66.220.144.0/20 -p tcp --dport 443 -j DROP
Otra forma de poder hacerlo es setear todos los browsers con proxy (ip del proxy puerto 81 o el puerto en el que apunten sus proxys), en mi caso preferi bloquear con tablas ya que son muchos clientes que deberia configurar y como no tengo uniformidad de browsers hay que hacelo a mano.

espero que les haya servido.

lunes, 23 de agosto de 2010

Convirtiendo imagenes de Xen a VirtualBox

Una pavada pero que puede llegar a ser util...

Para convertir una imagen creada en Xen a VirtualBox.... primero hay que tener instalado el VirtualBox y desde la linea de comandos (donde mas sino) correr

vboxmanage convertfromraw -format VDI nombredelaimagenxen.img nombredelaimagenvirtualbox.vdi

Es importante haber instalado el host de xen como Fully Virtualized, sino no va a funcionar (VirtualBox no soprta kernels basados en xen).