lunes, 26 de mayo de 2008

LINUX: Control RAID fisico discos

En mi caso, para poder gestionar el RAID 1 de discos de mi máquina y el estado del mismo utilizo mpt-status.

Esta utilidad es buena para ver el estado de salud del mismo, sobre todo cuando tenemos un error como este:

Jun 26 11:22:43 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for PhysDisk 0
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: PhysDisk is now missing
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for PhysDisk 0
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: PhysDisk is now missing, out of sync
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for VolumeID 0
Jun 26 11:22:43 my_host kernel: mptbase: ioc0: volume is now degraded, enabled
Jun 26 11:22:43 my_host kernel: klogd 1.4.1, ---------- state change ----------
Jun 26 11:22:49 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for PhysDisk 0
Jun 26 11:22:49 my_host kernel: mptbase: ioc0: PhysDisk is now online, out of sync
Jun 26 11:22:49 my_host kernel: sdb : READ CAPACITY failed.
Jun 26 11:22:49 my_host kernel: sdb : status=0, message=00, host=1, driver=00
Jun 26 11:22:49 my_host kernel: sdb : sense not available.
Jun 26 11:22:49 my_host kernel: sdb: Write Protect is off
Jun 26 11:22:49 my_host kernel: sdb: Mode Sense: 00 00 00 00
Jun 26 11:22:49 my_host kernel: sdb: asking for cache data failed
Jun 26 11:22:49 my_host kernel: sdb: assuming drive cache: write through
Jun 26 11:22:49 my_host kernel: sd 0:1:1:0: Attached scsi disk sdb
Jun 26 11:22:49 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for VolumeID 0
Jun 26 11:22:49 my_host kernel: mptbase: ioc0: volume is now degraded, enabled, resync in progress

Jun 26 12:46:34 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for PhysDisk 0
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: PhysDisk is now online
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for VolumeID 0
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: volume is now optimal, enabled, resync in progress
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: RAID STATUS CHANGE for VolumeID 0
Jun 26 12:46:34 my_host kernel: mptbase: ioc0: volume is now optimal, enabled



Para instalarlo solo hay que descargarse el rpm de http://rpmfind.net/linux/rpm2html/search.php?query=mpt-status y ejecutar

rpm -i -v mpt-status-1.2.0-72.i586.rpm

Una vez tenemos el paquete hay que:
  1. Crear el dispositivo /dev/mpctl, cargando el modulo en el kernel (#modprobe mptctl)
  2. Añadir "install mptctl" en "/etc/modprobe.conf.local" para que se cargue el módulo al iniciar.

Para ver en que estado nuestro raid, solo hay ejecutar mpt-status -s y si todo va bien, nos saldrá:

my_host:/ # mpt-status -s

log_id 0 OPTIMAL

phys_id 1 ONLINE

phys_id 0 ONLINE

En caso contrario, en /var/log/messages encontraremos log sobre lo que nos está sucediendo o bien haciendo una query al raid mediante mpt-status.

sábado, 24 de mayo de 2008

LINUX: Ejemplo script iptables para firewall

Después de pelearme un poco con esto de iptables, he montado este pequeño script para un firewall.

Este firewall tiene 2 accesos a Internet balanceadas entre ella con iproute2.

Como tal el script utiliza 2 ficheros de configuración (/etc/firewall/acceso.web y /etc/firewall/acceso.ftp.inet2dmz) donde de pueden poner los nombre de los diferentes host/ordenadores y a que lugar pueden ir.

Aunque script funciona para la web, es MUY ACONSEJABLE utilizar squid como servidor de proxy, ya que permite mejor control y gestión.

Para la gestión del log de iptables, existen soluciones freeware que permiten estadisticas y demás.

#Funcion para dar acceso
#Parámetros $1=Origen $2=Interface desde la que accede el origen
# $3=Destino $4=Interface a través de la cual se llega al destino
# $5=Protoco $6=Puerto de destino
function Acceso {
if $iptables -A FORWARD -s $1 -i $2 -d $3 -o $4 -p $5 --dport $6 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
then
echo Acceso de $1 desde $2 para $3 por $4 ,protocolo:$5, puerto $6
else
echo ERROR Acceso de $1 desde $2 para $3 por $4 ,protocolo:$5, puerto $6
fi

if $iptables -A FORWARD -d $1 -o $2 -s $3 -i $4 -p $5 --sport $6 -m state --state ESTABLISHED,RELATED -j ACCEPT
then
echo Acceso de $3 desde $4 para $1 por $2 ,protocolo:$5, puerto $6
else
echo ERROR Acceso de $3 desde $4 para $1 por $2 ,protocolo:$5, puerto $6
fi
}

function AccesoWEB {

#Estructura de cada registro ,,...,,
for registro in `grep -v "^#" /etc/firewall/accesos.web`
do
CAMPOS=`echo $registro | awk -f /etc/firewall/contador.awk`
ULTIMOORIGEN=`expr $CAMPOS - 1`
for cont in `seq 1 $ULTIMOORIGEN`
do
ORIGEN=`echo $registro | cut -f $cont -d ","`
DESTINO=`echo $registro | cut -f $CAMPOS -d ","`
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET1 tcp http
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET2 tcp http
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET1 tcp https
Acceso $ORIGEN $DEV_LAN $DESTINO $DEV_INET2 tcp https
done
done
}

function AccesoFTP {
for registro in `grep -v "^#" $1`
do
ORIGEN=`echo $registro | cut -f 2 -d ","`
DESTINO=`echo $registro | cut -f 3 -d ","`
echo origen $ORIGEN dev_origen $2 destino $DESTINO dev_destino $3
Acceso $ORIGEN $2 $DESTINO $3 tcp 20
Acceso $ORIGEN $2 $DESTINO $3 tcp 21
done
}

function AccesoFTP_INET2DMZ {
#Estructura de cada registro ,,
AccesoFTP /etc/firewall/accesos.ftp.inet2dmz $DEV_INET1 $DEV_DMZ
AccesoFTP /etc/firewall/accesos.ftp.inet2dmz $DEV_INET2 $DEV_DMZ
}

function AccesoADMIN {
$iptables -A INPUT -s $1 -i $DEV_LAN -d $IP_LAN -p tcp --dport ssh -j ACCEPT
$iptables -A OUTPUT -d $1 -o $DEV_LAN -s $IP_LAN -p tcp --sport ssh -j ACCEPT

$iptables -A INPUT -s $1 -i $DEV_LAN -d $IP_LAN -p icmp -j ACCEPT && echo Acceso PING para $1 desde $2
$iptables -A OUTPUT -d $1 -o $DEV_LAN -s $IP_LAN -p icmp -j ACCEPT && echo Acceso PING para $1 desde $2

Acceso $1 $DEV_LAN $ROUTER_INET1 $DEV_INET1 tcp http
Acceso $1 $DEV_LAN $ROUTER_INET1 $DEV_INET1 tcp https
AccesoPING $1 $DEV_LAN $ROUTER_INET1 $DEV_INET1

Acceso $1 $DEV_LAN $FTP_SERVER $DEV_DMZ tcp ssh
AccesoPING $1 $DEV_LAN $FTP_SERVER $DEV_DMZ

$iptables -A FORWARD -s $1 -p icmp -j ACCEPT
$iptables -A FORWARD -d $1 -p icmp -j ACCEPT

$iptables -A INPUT -s $1 -p icmp -j ACCEPT
$iptables -A OUTPUT -d $1 -p icmp -j ACCEPT
}

function LOG_NoDeseado {
$iptables -A INPUT -p udp ! --dport 137:138 -j LOG
$iptables -A INPUT -j LOG
$iptables -A OUTPUT -j LOG
$iptables -A FORWARD -j LOG
}

function Acceso_DNSServer {
$iptables -A OUTPUT -o $DEV_LAN -d $1 -p tcp --dport domain -j ACCEPT
$iptables -A INPUT -i $DEV_LAN -s $1 -p tcp --sport domain -j ACCEPT
$iptables -A OUTPUT -o $DEV_LAN -d $1 -p udp --dport domain -j ACCEPT
$iptables -A INPUT -i $DEV_LAN -s $1 -p udp --sport domain -j ACCEPT
$iptables -A OUTPUT -o $DEV_INET1 -p udp --dport domain -j ACCEPT
$iptables -A INPUT -i $DEV_INET1 -p udp --sport domain -j ACCEPT
Acceso $1 $DEV_LAN $MUNDO $DEV_INET2 tcp domain
Acceso $1 $DEV_LAN $MUNDO $DEV_INET2 udp domain
}

IP_INET1=80.33.33.33
IP_INET2=80.33.34.34
IP_DMZ=10.0.2.1
IP_LAN=10.0.1.1

DEV_INET1=eth3
DEV_INET2=eth2
DEV_DMZ=eth1
DEV_LAN=eth0

NET_INET1=80.33.33.0/24
NET_INET2=80.33.34.0/24
NET_DMZ=10.0.2.0/24
NET_LAN=10.0.1.0/24

MUNDO=0.0.0.0/0

#SERVER
DNS_SERVER=10.0.1.2
FTP_SERVER=10.0.2.2
MAIL_SERVER=10.0.1.3

#COMANDOS
iptables=/usr/sbin/iptables
ifconfig=/sbin/ifconfig
route=/sbin/route

#LIMPIADO DE LAS TABLAS
$iptables -F
$iptables -Z
$iptables -X
$iptables -t nat -F

#DEFINICION POLITICA POR (DROP)
$iptables -P INPUT DROP
$iptables -P OUTPUT DROP
$iptables -P FORWARD DROP

#########################################################################
# D N S - Damos acceso para que los nombre de host se puedan resolver #
#########################################################################

Acceso_DNSServer $DNS_SERVER

#################################
# O T R O S A C C E S O S #
#################################
AccesoADMIN nuestro_host.nuestro_dominio

#############
# D N A T #
#############

# Acceso de Internet a nuestro servidor de correo
# --------------
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET2 -p tcp --dport 25 -j DNAT --to :25
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET1 -p tcp --dport 25 -j DNAT --to :25

# DESDE INET A FTP SERVER
-----------------------
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET2 -p tcp --dport 20 -j DNAT --to :20
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET2 -p tcp --dport 21 -j DNAT --to :21

$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET1 -p tcp --dport 20 -j DNAT --to :20
$iptables -A PREROUTING -t nat -s $MUNDO -i $DEV_INET1 -p tcp --dport 21 -j DNAT --to :21

#Con esto permitimos el ftp pasivo
modprobe ip_nat_ftp


###################
# R O U T I N G #
###################
$iptables -A POSTROUTING -t nat -o $DEV_INET1 -j MASQUERADE
$iptables -A POSTROUTING -t nat -o $DEV_INET2 -j MASQUERADE
$iptables -A POSTROUTING -t nat -o $DEV_DMZ -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

###########
# F T P #
###########

#Con estos accesos permitimos el tráfico desde fuera a nuestro servidor
Acceso $MUNDO $DEV_INET1 $DEV_DMZ tcp 20
Acceso $MUNDO $DEV_INET1 $DEV_DMZ tcp 21

Acceso $MUNDO $DEV_INET2 $DEV_DMZ tcp 20
Acceso $MUNDO $DEV_INET2 $DEV_DMZ tcp 21

AccesoFTP_INET2DMZ


###################
# A C C E S O S #
###################
AccesoFTP_INET2DMZ
AccesoWEB

###########
# L O G #
###########
LOG_NoDeseado

jueves, 22 de mayo de 2008

LINUX: Tuning básico

Como cualquier otro SO, Linux también necesita algún tuning básico, pues como viene de serie no aprovecha las máquinas.

Algunas de las cosas que he encontrado y probado en mis máquinas son:

1. Tuning TCP - Algunas variables del kernel (/etc/sysctl.conf)
#Tamaño máximo del buffer de recepción de red (en bytes)
net.core.rmem_max="16777216"
#Tamaño máximo del buffer de envío de red (en bytes)
net.core.wmem_max="16777216"
#Mínimo/Defecto/Máximo tamaño del buffer TCP de recepción
net.ipv4.tcp_rmem="4096 87380 16777216"
#Mínimo/Defecto/Máximo tamaño del buffer TCP de envío
net.ipv4.tcp_wmem="4096 65536 16777216"
#Desactivación retraso del inicio threshold para un cliente entre sesiones TCP
net.ipv4.tcp_no_metrics_save=1
#TTL
net.ipv4.ip_default_ttl = 77
#Determina el número de sondeos antes de que se supere el tiempo de espera
net.ipv4.tcp_keepalive_probes =5
#
Determina el tiempo de espera entre sondeos de intervalos isAlive
net.ipv4.tcp_keepalive_intvl =15
#
Determina el tiempo que debe transcurrir antes de que el TCP/IP pueda liberar una conexión cerrada y reutilizar sus recursos
net.ipv4.tcp_fin_timeout=60

Nota: Una vez echos los cambios ejecutar sysctl -q

2. Eliminación de los servicios que no utilizamos. No hay peor que dedicar el tiempo de nuestra máquina en algo que no utilizamos (samba, cups, cron, ....), asi que mejor pararlos y eliminar los links de nuestro runlevel directory (/etc/init.d/rc[345].d)

3. Dejar solo activadas 2 o 3 consolas en /etc/inittab


1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6

NOTA: Una vez hechos los cambios ejecutar init q

4. Incrementar memoria
. Mediante vmstat deberiamos de mirar a intervalos diferentes en dias diferentes como funciona nuestra máquina, y ver si hay mucho swap y cuanta memoria estamos utilizando.

Mi máquina muestra lo siguiente con vmstat 5 10

5. Mejora de rendimiento de los discos
. Mediante hdparm y sdparm podemos llegar a mejorar el rendimiento de nuestros discos.

6. Activación Hyperthreading
. Si tenemos una CPU con hyperthreading por que no utilizarlo. Así que a recompilar el kernel (http://www.ibm.com/developerworks/linux/library/l-htl/)

ORACLE. Otros Backup de archivos necesarios

En esto de la informática cualquier precaución es poca, y en Oracle todabía más. En mi caso, al no utilizar por ahora RMAN, he hecho queda cada dia el cron me haga un backup/traza de mis controlfiles, así como un volcado actualizado de mi spfile a un fichero plano, para que ante cualquier situación pueda editarlo y modificarlo.

Para crear el backup/traza del los controfile solo hay que hacer:
alter database backup controlfile to trace;

Para saber donde lo guarda solo hay que buscar el ultimo fichero de traza (*.trc) dentro de user_dump (show parameter user_dump_dest).

En cuanto al SPFILE en formato plano, tan fácil como
create pfile from spfile;