# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Red Hat Cluster: “generic error” al crear un IP Resource


redhat logoLlevo unos días haciendo pruebas con una maqueta de Red Hat Cluster Suite en CentOS. De momento, voy estudiando los distintos comandos y ficheros de configuración, aunque utilizo luci/ricci para la gestión del cluster vía web.

Uno de los primeros problemas que me encontré es de lo más simple. La idea es crear un recurso IP, que levanta una IP virtual en uno de los nodos del cluster. Esa IP la podemos utilizar posteriormente como recurso para un servicio HTTP ó MySQL por ejemplo, IP que en caso de fallo del nodo activo se traspasará junto con el resto de servicio a otro nodo del cluster.

Lo único que hay que tener claro es que la subred de esa IP debe estar configurada en alguna de las interfaces de red de los nodos, sino el rgmanager no sabrá donde levantarla. La máscara es opcional, pero por ahí venían todos mis problemas. Recibía el siguiente error al levantar el servicio:

Dec 28 21:41:53 nodo1 rgmanager[3563]: Initializing service:IP
Dec 28 21:42:32 nodo1 rgmanager[3563]: Recovering failed service service:IP
Dec 28 21:42:32 nodo1 rgmanager[3563]: start on ip "192.168.1.200/255.255.255.0" returned 1 (generic error)
Dec 28 21:42:33 nodo1 rgmanager[3563]: #68: Failed to start service:IP; return value: 1
Dec 28 21:42:33 nodo1 rgmanager[3563]: Stopping service service:IP
Dec 28 21:42:35 nodo1 rgmanager[3563]: Service service:IP is recovering

Y la configuración del recurso/servicio:

<service autostart="0" domain="IP_FAILOVER" name="IP" recovery="relocate">
<ip address="192.168.1.200/255.255.255.0" monitor_link="1" sleeptime="10"/>
</service>

El problema, tras darle unas cuantas vueltas era tan simple como que la máscara se especifica como bits de máscara de red, es decir, en lugar de 255.255.255.0, 24:

<service autostart="0" domain="IP_FAILOVER" name="IP" recovery="relocate">
<ip address="192.168.1.200/24" monitor_link="1" sleeptime="10"/>
</service>

Tratamos de arrancar el servicio y ya levanta la IP virtual correctamente. Puede parecer una tontería pero es útil tenerlo en cuenta por si os pasa.

Dec 28 21:47:31 nodo1 rgmanager[3331]: Starting stopped service service:IP
Dec 28 21:47:37 nodo1 rgmanager[8561]: [ip] Adding IPv4 address 192.168.1.200/24 to eth0
Dec 28 21:47:44 nodo1 rgmanager[3331]: Service service:IP started

Configurar IP de salida en Postfix


Por defecto, una instalación de Postfix tiene configurado en blanco la variable que indica la IP a utilizar para la salida de correo del servidor (smtp_bind_address). Podemos ver su configuración en el fichero main.cf:

Main.cf por defecto:

smtp_bind_address =

Esto hará que Postfix sea quien elija la IP de salida. En mi caso concreto, tenía una interfaz con salida a Internet y además otra interfaz virtual (eth0 192.168.0.13 y eth0:1 192.168.0.14). En este caso Postfix usaba eth0 para la salida de correos.

Si queremos elegir nosotros la interfaz eth0:1 (192.168.0.14) para el outbound SMTP, simplemente le decimos cual debe usar:

smtp_bind_address = 192.168.0.14

Reiniciamos Postfix y todo correo que salga desde nuestro servidor lo hará por esta IP (192.168.0.14).

SNMP: Configurar la dirección IP por la que escucha


En sistemas RedHat/CentOS (quizás me equivoque) por defecto al instalar snmp (Simple Network Management Protocol) el servicio escucha automáticamente en todas las IP configuradas del sistema -> 0.0.0.0:*, no obstante, me ha pasado que al instalar snmp en Debian por defecto el servicio únicamente escuchaba en localhost -> 127.0.0.1:*

Bien, buscando por Internet he encontrado diversas soluciones, pero la más sencilla y eficaz es la de añadir la siguiente directiva en el fichero de configuración snmpd.conf (normalmente en /etc/snmpd/snmpd.conf), donde xx.xx.xx.xx es la IP en la que queréis que escuche:

agentaddress xx.xx.xx.xx

Posteriormente recargáis el servicio:

service snmpd reload

Después, verificad que escucha por la IP que habéis configurado:

# netstat -nau
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
udp        0      0 0.0.0.0:161                 0.0.0.0:*                               

Si queréis, en Cybercity tenéis información ampliada sobre las distintas posibilidades.

Cómo añadir IP virtual en Linux


Mediante el sistema de IPs virtuales podemos asignar varias direcciones IP a una misma interfaz de red. A continuación os indico como hacerlo en sistemas Red-Hat (Centos, Fedora, etc).

En la ruta /etc/sysconfig/network-scripts encontraréis los ficheros de arranque de cada una de las interfaces de red del sistema:

# ls -l /etc/sysconfig/network-scripts/ifcfg-*
-rw-r--r-- 3 root root 201 Jul  7 16:01 /etc/sysconfig/network-scripts/ifcfg-eth0
-rw-rw-rw- 3 root root 178 Jul  7 16:00 /etc/sysconfig/network-scripts/ifcfg-eth1
-rw-r--r-- 1 root root 254 Sep 24  2008 /etc/sysconfig/network-scripts/ifcfg-lo

En este caso, queremos que la interfaz de red eth0 contenga una IP virtual además de la IP principal de la misma, simplemente tendríamos que crear un nuevo fichero de configuración, llamado ifcfg-eth0:0 (sucesivas IPs virtuales serían ifcfg-eth0:1, ifcfg-eth0:2,….). El contenido del fichero será el mismo que el de ifcfg-eth0 pero con las siguientes modificaciones:

ifcfg-eth0

DEVICE=eth0
BOOTPROTO=static
HWADDR=00:22:7e:3c:3b:12
IPADDR=192.168.0.110
NETMASK=255.255.255.0
ONBOOT=yes
GATEWAY=192.168.0.1
TYPE=Ethernet

ifcfg-eth0:0

Veréis que cambiamos la IP por la IP virtual y DEVICE por el nuevo identificador ( eth0:0 ), por lo demás, tanto la dirección MAC de la tarjeta de red sigue siendo la misma, protocolo de arranque, etc:

DEVICE=eth0:0
BOOTPROTO=static
HWADDR=00:22:7e:3c:3b:12
IPADDR=192.168.0.111
NETMASK=255.255.255.0
ONBOOT=yes
GATEWAY=192.168.0.1
TYPE=Ethernet

Una vez completado el proceso, reiniciamos la red o levantamos la nueva IP virtual:

service network restart
ifup eth0:0

La nueva IP ya debería responder a ping.

Escanear rango de Ips


Existen muchas formas de escanear desde shell un rango de IPs o subnet, por ejemplo con nmap o creando un script en bash, perl, etc. No obstante aquí va una forma sencilla que he encontrado en Shell Fu:

for IP in 192.168.1.{1..10}; do if ping $IP -c 1 > /dev/null; then echo $IP alive; else echo $IP dead; fi; done

Y la salida (escaneo desde la 192.168.1.1 a 192.168.1.10

~$ for IP in 192.168.1.{1..10}; do if ping $IP -c 1 > /dev/null; then echo $IP alive; else echo $IP dead; fi; done
192.168.1.1 alive
192.168.1.2 dead
192.168.1.3 dead
192.168.1.4 dead
192.168.1.5 dead
192.168.1.6 dead
192.168.1.7 dead
192.168.1.8 dead
192.168.1.9 dead
192.168.1.10 dead

Comando para saber en número de conexiones y direcciones IP en un puerto/servicio Linux


netstat -plan|grep :<puerto> | awk {'print $5'} | cut -d: -f 1 | sort | uniq -c | sort -n

Ejemplo:

Conexiones a apache:

# netstat -plan|grep :80 | awk {'print $5'} | cut -d: -f 1 | sort | uniq -c | sort -n
1 XX.XX.XXX.XXX
1 XX.XX.XXX.XXX
1 XX.XX.XXX.XXX
51 XX.XX.XXX.XXX
64 XX.XX.XXX.XXX

Por explicar un poco el comando, NETSTAT muestra un listado de las conexiones activas del servidor, con GREP filtramos solo las conexiones al puerto 80, con AWK filtramos para que muestre solamente el contenido de la columna 5 (en este caso la IP) de la salida por pantalla, con CUT quitamos el “:”, con SORT ordenamos, con UNIQ sacamos valores únicos, y con SORT ordenamos de nuevo por nº de conexiones.