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

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

¿Qué es APIPA/zeroconf y cómo deshabilitarlo en CentOS/RHEL (169.254.x.y)?


Seguro que muchos os habéis fijado que tanto en sistemas Linux Debian, RHEL, etc como en Windows, algunas veces el propio sistema os asigna una IP del rango 169.254.x.y e incluso que ese rango aparece en la tabla de rutas incluso en circunstancias normales, junto con los que sabemos que tienen que estar ahí:

$ route -n
Tabla de rutas IP del núcleo
Destino         Pasarela        Genmask         Indic Métric Ref    Uso Interfaz
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0

Bien, hay que saber que se trata de la característica Automatic Private IP Address (APIPA), y es la asignación automática por parte del sistema operativo de una IP en ese rango (máscara de red 255.255.0.0) cuando no consigue contactar con el servidor DHCP que tiene que asignarnos una IP. En un hipotético caso de una red privada en la que fallara el servidor DHCP, esto permitiría que las máquinas conectadas a esa red tuvieran asignada una IP dentro del mismo rango y se pudieran comunicar, no así con el exterior ya que no se configura gateway.

Si queremos prescindir de esta funcionalidad en sistemas RHEL, CentOS, Scientific Linux, etc. Debemos añadir la directiva “NOZEROCONF=yes” al fichero “/etc/sysconfig/network”.

NOZEROCONF=yes

Después reiniciamos la red:

# /etc/init.d/network restart

Bucle de password expirado en ldap nativo RHEL contra Sun LDAP


Me ha resultado difícil concretar el problema en tan poco espacio en el título. La situación es la siguiente:

  • Sun LDAP Server
  • Cliente Red Hat Enterprise Linux con LDAP nativo configurado contra el servidor de Sun

La configuración del LDAP Nativo en Red Hat es relativamente sencilla, únicamente lanzamos el authconfig-tui o pasamos los parámetros correspondientes al comando authconfig. Una vez configurado, ya deberíamos poder autenticarnos con los usuarios del LDAP.

En este caso concreto, todo funcionaba correctamente a excepción de la autenticación. Si hacíamos su desde root a cualquier usuario del LDAP funcionaba, la salida del comando getent passwd o getent shadow mostraba todos los usuarios, podíamos hacer ldapsearch, etc.

Con la autenticación, nos pedía continuamente cambiar la password porque había expirado:

$ ssh test@10.0.0.15
You are required to change your LDAP password immediately.
Warning: Your password has expired, please change it now
...
...

Por lo que sea, los servidores Solaris en nuestro caso hacían caso omiso a los atributos de expiración, llevabamos años sin problemas, pero RHEL sí que los revisaba. Todo debería haber funcionado una vez cambiada la clave, pero los servidores RHEL seguían pidiendo continuamente que se cambiara (en Solaris sí que se accedía con la nueva clave).

Para poder acceder correctamente desde Red Hat (y creo que desde cualquier máquina Linux) hay que prestar especialmente atención a estos atributos de LDAP para cada usuario:

shadowMax:
shadowMin:
shadowWarning:

Si están presentes, es necesario que su valor este vacío (no 0) para solucionar el problema. O eso, o especificar una expiración de 99999 en shadowMax… una vez cambiado accederéis sin problemas vía ssh  y con el resto de autenticación.

Crear un disco de quorum para RHCS (Cluster RedHat)


Para crear un quorum disk en Red Hat Cluster Suite tenemos que utilizar el comando mkqdisk. El disco en este caso se encuentra en una SAN y tiene Multipath para aumentar la tolerancia a fallos. Gracias al quorum disk evitaremos situaciones críticas en el Cluster como el “split brain“, que es cuando en un cluster de dos nodos, ambos se desconectan del cluster al mismo tiempo y cada uno cree que el otro ya no está activo y ambos intentan reiniciar los servicios y hacer fencing del otro pese a estar funcionando. El disco de quorum será el mediador en estos casos.

Al comando mkqdisk únicamente tenemos que pasarle la ruta al disco/partición y el nombre asignado a la etiqueta:

# mkqdisk -c /dev/mapper/mpatha -l qdisk
mkqdisk v3.0.12.1
Writing new quorum disk label 'qdisk' to /dev/mapper/mpatha.
WARNING: About to destroy all data on /dev/mapper/mpatha; proceed [N/y] ? y
Initializing status block for node 1...
Initializing status block for node 2...
Initializing status block for node 3...
Initializing status block for node 4...
Initializing status block for node 5...
Initializing status block for node 6...
Initializing status block for node 7...
Initializing status block for node 8...
Initializing status block for node 9...
Initializing status block for node 10...
Initializing status block for node 11...
Initializing status block for node 12...
Initializing status block for node 13...
Initializing status block for node 14...
Initializing status block for node 15...
Initializing status block for node 16...

El disco de quorum permite un máximo de 16 nodos en el Cluster, por eso inicializa 16 bloques de estado. Una vez realizado, todos los nodos del Cluster deberían poder ver el estado del disco de quorum:

# mkqdisk -L
mkqdisk v3.0.12.1

/dev/block/253:1:
/dev/disk/by-id/dm-name-mpatha:
/dev/disk/by-id/dm-uuid-mpath-1232342342425345345345:
/dev/dm-1:
/dev/mapper/mpatha:
	Magic:                d3dq3asd
	Label:                qdisk
	Created:              Wed Mar  7 04:08:01 2012
	Host:                 XXXXXXX
	Kernel Sector Size:   512
	Recorded Sector Size: 512

En RedHat Cluster Suite de RHEL 6, el arranque del disco de quorum se integra en el script de arranque de cman, así que no es necesario modificar nada, en versiones anteriores sí que hay un script independiente (qdiskd). Finalmente configuramos el disco de quorum en el Cluster, podéis hacerlo a través de Luci, editando directamente el fichero cluster.conf o con el resto de herramientas disponibles.

Ejemplo para un Cluster de dos nodos y un disco de quorum:

<quorumd interval="3" label="qdisk" tko="10" votes="1"/>
<cman expected_votes="3" two_node="0"/>

Una vez finalizadas todas las configuraciones y reiniciado cman veremos el disco como un nuevo miembro del Cluster:

# clustat
Cluster Status for cluster-XXXX @ Sat Mar 10 04:59:08 2012
Member Status: Quorate

 Member Name                             ID   Status
 ------ ----                             ---- ------
 XXXXX                                   1 Online, Local, rgmanager
 XXXXX                                   2 Online, rgmanager
 /dev/block/253:1                        0 Online, Quorum Disk

 Service Name                   Owner (Last)                   State
 ------- ----                   ----- ------                   -----
 service:XXX                    XXXXX                    started
 service:XXXX                   XXXXX                    started      

Instalar php-mbstring en RHEL 6 por yum


Hoy toca una entrada rápida. Si tenéis que instalar el módulo php mb-strings por yum/rpm en RHEL 6 de primeras veréis que el paquete no está disponible en los repositorios oficiales. Esto es porque hay que activar el repositorio opcional desde la Red Hat Network.

Para ello acceded a http://rhn.redhat.com con vuestro usuario y password. Entrad en la sección de sistemas (Systems), pinchad en el servidor que queráis activar el repositorio y una vez dentro accedemos a la sección de suscripciones a canales (modificar canales de suscripción / Subscribed Channels (Alter Channel Subscriptions). Ahí es donde activamos RHEL Server Optional y guardamos.

Ahora en la máquina únicamente queda actualizar el perfil rhn e instalar:

# rhn-profile-sync
# yum install php-mbstring

De este modo nos evitamos compilar a mano php y tenemos la versión pre-compilada oficial de RedHat.

DM-Multipath en RedHat y CentOS


Hoy vamos a ver una introducción y la forma de activar Multipath en RedHat y derivados (CentOS, Scientific Linux…). Si todo va bien, y la cabina que nos sirve los discos está soportada por defecto por DM-Multipath es probable que no necesitemos apenas configuraciones manuales. Básicamente, el multipath lo que hace es ofrecer tolerancia a fallos y alta disponibilidad, ofreciendo más de un camino entre el sistema y los discos servidos por una SAN. Por ejemplo, cuando la conexión se hace a través de dos o más puertos Fiber Channel o cuando un disco SCSI está conectado a dos controladoras distintas.

Instalación y configuración inicial de DM-Multipath

Lo primero realizamos la instalación a través de yum:

# yum install device-mapper-multipath

Activamos su inicio automático:

# chkconfig multipathd on

mpathconf nos permite realizar una primera configuración del servicio, creando el fichero de configuración, ya sea con los valores por defecto o especificando unas directivas concretas. Para crear una configuración estándar:

# mpathconf --enable

Este otro ejemplo arrancaría dm-multipath con una configuración de failover estándar y activa el fichero de configuración:

# mpathconf --enable --with_multipathd y

Revisad la página man de mpathconf para más información. Posteriormente ya deberíamos tener el demonio de multipath. Para arrancar, parar y demás podéis usar el script de init.d como cualquier otro servicio.

# ps aux | grep multipath
root     17284  1.0  0.0 493756  4432 ?        SLl  04:24   0:00 /sbin/multipathd

Algo importante a tener en cuenta es la necesidad de incluir como “blacklist” los discos locales en el fichero de configuración. Si por ejemplo son los sdaX añadimos “sda” a la sección blacklist. De este modo multipath ignorará estos discos y no buscará más de un camino para ellos:

blacklist {
       wwid 26353900f02796769
	devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|sda|st)[0-9]*"
	devnode "^hd[a-z]"
}

El fichero de configuración es lo suficientemente descriptivo para que podáis revisar cada una de las opciones.

Administración y monitorización de DM-Multipath

Si las LUN o discos que queremos tener en multipath se ven con un fdisk, el mapeo debería haberse configurado automáticamente como /dev/mapper/mpathb, /dev/mapper/mpathc…, sino, antes hay que revisar porqué el sistema no visualiza los discos. Si no se trata de controladoras o cabinas conocidas o soportadas, es probable que haya que realizar alguna configuración manual, en la mayoría de los casos el mapping debería ser automático.

La mejor forma de ver el estado del multipath es entrando en la “shell” de multipath, lo hacemos del siguiente modo:

# multipathd -k
multipathd>

Una vez dentro, algunos de los comandos más útiles son los siguientes:

Ver el estado de los path:

multipathd> show multipaths status
name   failback  queueing paths dm-st  write_prot
mpathb immediate -        4     active rw

Ver todos los multipath disponibles y mappings. En este caso hay dos mappings, cada uno con cuatro caminos:

multipathd> show multipaths
name   sysfs uuid
mpathb dm-0  360a98000572d4275525a693862534571
mpathc dm-1  360a98000572d4275525a693875677278
multipathd> show maps
name   sysfs uuid
mpathb dm-0  360a98000572d4275525a693862534571
mpathc dm-1  360a98000572d4275525a693875677278

Ver todos los path:

multipathd> show paths
hcil    dev dev_t pri dm_st  chk_st dev_st  next_check
1:0:0:0 sdb 8:16  4   active ready  running XXXXXXXXXX 20/20
1:0:0:1 sdc 8:32  4   active ready  running XXXXXXXXXX 20/20
2:0:0:0 sdd 8:48  4   active ready  running XXXXXXXXX. 19/20
2:0:0:1 sde 8:64  4   active ready  running .......... 1/20
2:0:1:0 sdf 8:80  1   active ready  running XXXXXXXXX. 18/20
2:0:1:1 sdg 8:96  1   active ready  running XXXXXXXXXX 20/20
1:0:1:0 sdh 8:112 1   active ready  running XXXXXXXXX. 18/20
1:0:1:1 sdi 8:128 1   active ready  running XXXXXXXXX. 19/20

Ver la topología y políticas configuradas para cada multipath. En este caso vemos dos LUN de fibra de 300G servidas por una cabina de discos NetAPP, con política round-robin 0 y todos sus path activos:

multipathd>  show topology
mpathb (360a98000572d4275525a693862534571) dm-0 NETAPP,LUN
size=301G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=4 status=active
| |- 1:0:0:0 sdb 8:16  active ready running
| `- 2:0:0:0 sdd 8:48  active ready running
`-+- policy='round-robin 0' prio=1 status=enabled
  |- 2:0:1:0 sdf 8:80  active ready running
  `- 1:0:1:0 sdh 8:112 active ready running
mpathc (360a98000572d4275525a693875677278) dm-1 NETAPP,LUN
size=301G features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=4 status=active
| |- 1:0:0:1 sdc 8:32  active ready running
| `- 2:0:0:1 sde 8:64  active ready running
`-+- policy='round-robin 0' prio=1 status=enabled
  |- 2:0:1:1 sdg 8:96  active ready running
  `- 1:0:1:1 sdi 8:128 active ready running

Si escribís help dentro de esta shell veréis todos los comandos disponibles, podemos gestionar completamente el multipath desde aquí. Podemos suspender un camino, ponerlo en estado ‘fail’, eliminarlo, etc:

multipathd> help
multipath-tools v0.4.9 (04/04, 2009)
CLI commands reference:
 list|show paths
 list|show paths format $format
 list|show status
 list|show daemon
 list|show maps|multipaths
 list|show maps|multipaths status
 list|show maps|multipaths stats
 list|show maps|multipaths format $format
 list|show maps|multipaths topology
 list|show topology
 list|show map|multipath $map topology
 list|show config
 list|show blacklist
 list|show devices
 list|show wildcards
 add path $path
 remove|del path $path
 add map|multipath $map
 remove|del map|multipath $map
 switch|switchgroup map|multipath $map group $group
 reconfigure
 suspend map|multipath $map
 resume map|multipath $map
 resize map|multipath $map
 disablequeueing map|multipath $map
 restorequeueing map|multipath $map
 disablequeueing maps|multipaths
 restorequeueing maps|multipaths
 reinstate path $path
 fail path $path
 paths count
 quit|exit

Esto ha sido una mera introducción, para profundizar en el tema, os recomiendo la lectura de los siguientes artículos. Próximamente veremos como configurar desde 0 una LUN FC servida NetAPP en Multipath y asignarle un filesystem.

rhn_register y yum a través de un proxy


En el caso de necesitar registrar un sistema RHEL en la Red Hat Network y el equipo no tenga salida a Internet porque se encuentra en una red privada, existe la posibilidad de habilitar el acceso vía proxy. Para ello usamos el comando rhn_register como siempre, pero añadiendo el proxy como parámetro:

# rhn_register --nox --proxy=proxy:puerto
# rhn_register --nox --proxy=10.0.0.100:8080

Si el proxy requiere autenticación usamos los parámetros –proxyUser=PROXYUSER y –proxyPassword=PROXYPASSWORD.

Por otra parte, también necesitaremos utilizar yum para instalar aplicaciones o parchear el sistema una vez registrado. Para ello únicamente tenemos que especificar el proxy en el fichero de configuración de yum /etc/yum.conf:

proxy=http://10.0.0.100:8080/
proxy_username=usuario
proxy_password=password

La barra final parece ser necesaria, a mí no me funcionaba sin ella.

Bonding/Teaming/Trunking en RHEL y CentOS


bonding linux

El Bonding (también conocido como teaming, y en switching como trunking) es, básicamente, la unión de varias interfaces de red para que trabajen como una única interfaz lógica. Esta configuración permite establecer configuraciones de activo-pasivo, balanceo de carga o crear un agregado de interfaces con un ancho de banda que supone la suma del de todas las interfaces asignadas.

Antes de comenzar la configuración, nos aseguramos de tener cargado el módulo bonding:

# lsmod | grep bonding
bonding               109558  0
ipv6                  264641  29 bonding,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6,cnic

En caso de no estar lo cargamos:

# modprobe bonding

Tenemos que configurar unos parámetros de kernel para añadir esta nueva interfaz/funcionalidad:

# vi /etc/modprobe.conf
alias bond0 bonding
options bond0 mode=6 miimon=100

El valor mode, especificado en 6 indica que el tipo de bonding va a ser de balanceo de carga. Los posibles valores son de 0 a 6:

  • 0: round robin policy, defecto
  • 1: active backup policy
  • 2: XOR
  • 3: brodcast
  • 4: 802.3ad
  • 5:  balance-tlb
  • 6:  balance-alb

El valor miimon indica con un valor entero la frecuencia de monitorización del link. Para conocer todos estos parámetros en condiciones os recomiendo revisar la documentación del kernel sobre bonding

Ahora vamos a crear el fichero de configuración para la interfaz Bond0, que será la que en nuestro caso creará el bonding de eth0 y eth1. El fichero de configuración se crea en la misma ruta que el resto /etc/sysconfig/network-scripts/ifcfg-XXX. Este fichero es el que contendrá la configuración IP, NETMASK, etc.

# vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
ONBOOT=yes
IPADDR=192.168.1.190
NETMASK=255.255.255.0
BROADCAST=192.168.1.255
NETWORK=192.168.1.0
USERCTL=no
BOOTPROTO=none

Ahora configuramos eth0 y eth1, en ellas no establecemos ninguna configuración IP, sino que especificamos que es una interfaz esclavo (slave) y que su master es bond0:

vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
USERCTL=no
BOOTPROTO=none
MASTER=bond0
SLAVE=yes
vi /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
USERCTL=no
BOOTPROTO=none
MASTER=bond0
SLAVE=yes

Una vez configurado, reiniciamos el servicio de red:

# /etc/init.d/network restart

Si todo ha ido bien ya veremos la interfaz bond0 en ifconfig:

# ifconfig
bond0     Link encap:Ethernet  HWaddr 08:00:27:00:C8:7A
          inet addr:192.168.1.190  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe00:c87a/64 Scope:Link
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:1029 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1198 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:101972 (99.5 KiB)  TX bytes:182347 (178.0 KiB)

eth0      Link encap:Ethernet  HWaddr 08:00:27:00:C8:7A
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:946 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1144 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:90003 (87.8 KiB)  TX bytes:175136 (171.0 KiB)
          Interrupt:11 Base address:0xc020 

eth1      Link encap:Ethernet  HWaddr 08:00:27:00:C8:7A
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:94 errors:0 dropped:0 overruns:0 frame:0
          TX packets:59 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:12695 (12.3 KiB)  TX bytes:8325 (8.1 KiB)
          Interrupt:10 Base address:0xc060 

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1241 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1241 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:170253 (166.2 KiB)  TX bytes:170253 (166.2 KiB)

Podemos monitorizar el estado del bonding desde /proc/net/bonding/bond0:

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)

Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:00:c8:7a
Slave queue ID: 0

Slave Interface: eth1
MII Status: up
Speed: 100 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 08:00:27:fd:48:08
Slave queue ID: 0

SELinux ‘semanage: command not found’


semanage (SELinux Policy Management tool) es un comando que permite configurar políticas de SELinux en RHEL, CentOS, etc. Lo más probable es que en un sistema Red Hat 6 instalado por defecto (base) el comando no se encuentre disponible:

# semanage login -l
semanage: command not found

Si visteis el artículo que hice hace un tiempo sobre trucos de yum recordaréis que con “whatprovides” podemos encontrar rápidamente el paquete que contiene un determinado binario/fichero:

# yum whatprovides */semanage
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: sunsite.rediris.es
 * extras: sunsite.rediris.es
 * updates: sunsite.rediris.es
libsemanage-devel-2.0.43-4.el6.i686 : Header files and libraries used to build
                                    : policy manipulation tools
Repo        : base
Matched from:
Filename    : /usr/include/semanage

policycoreutils-python-2.0.83-19.1.el6.i686 : SELinux policy core python
                                            : utilities
Repo        : base
Matched from:
Filename    : /usr/sbin/semanage

policycoreutils-python-2.0.83-19.8.el6_0.i686 : SELinux policy core python
                                              : utilities
Repo        : updates
Matched from:
Filename    : /usr/sbin/semanage

Así que instalamos el paquete (y sus dependencias) y listo:

# yum install policycoreutils-python-2.0.83-19.1.el6.i686
# semanage login -l

Login Name         SELinux User           MLS/MCS Range            

__default__               unconfined_u              s0-s0:c0.c1023
root                      unconfined_u              s0-s0:c0.c1023
system_u                  system_u                  s0-s0:c0.c1023