Hace exactamente dos años escribí un post explicando cómo configurar un servidor NFS. Hoy voy a completar ese post explicando cómo configurar ese servicio para funcionar con IPv6.

1- Configuración del escenario:

He creado dos máquinas virtuales de Ubuntu con Virtualbox, una de ellas hará de servidor y la otra será el cliente. El servidor tiene la IPv4 192.168.2.1/24 y la IPv6 2001::1:1/64 mientras que el cliente tiene la IPv4 192.168.2.10/24 y la IPv6 2001::1:2/64.

Servidor y cliente NFS

Servidor y cliente NFS

Para que haya un enlace entre ellas he configurado una red interna en VirtualBox entre ellos. Para crear dicha conexión hay que ir a las propiedades de la máquina virtual y, en la sección de red, cambiar de NAT a Red Interna. Se le puede dar un nombre para distinguirla de otras redes, en mi caso la he llamado nfsIPv6, como muestro en la siguiente captura de pantalla:

Configuración de red interna

Configuración de red interna

2- Configuración del servidor

En la máquina virtual del servidor tengo dos interfaces de red: eth0 en modo NAT para conectarme a internet y poder instalar software o consultar manuales y eth1 para realizar la comunicación con el cliente en IPv6. Para asignar una dirección IPv6 al interfaz de red eth1 he utilizado el siguiente comando:

root@server:~# ifconfig eth1 inet6 add 2001::1:1/64

Instalación del servidor NFS:

root@server:~# apt-get install nfs-kernel-server nfs-common portmap

creación de las carpetas que voy a exportar:

root@server:~# mkdir /home/abian/test
root@server:~#mkdir /home/abian/test2
root@server:~#chown -R abian.abian /home/abian/test*

Edición del archivo /etc/exports:

/home/abian/test       2001::1:2(rw,sync,no_subtree_check)
/home/abian/test2    *(ro,root_squash,no_subtree_check)

Edición del archivo /etc/hosts.allow:

portmap:[2001::1:2]
nfs:[2001::1:2]

Edición del archivo /etc/hosts.deny:

ALL: PARANOID

Reinicio de los servicios con las nuevas configuraciones:

root@server:~# /etc/init.d/portmap restart
root@server:~# /etc/init.d/nfs-kernel-server restart

3- Configuración del cliente

En el cliente solo hay una interfaz de red. Para añadir una dirección de IPv6 utilizo el mismo comando que para el servidor:

root@linux:~# ifconfig eth1 inet6 add 2001::1:2/64

Montar la partición NFS con IPv6

root@linux:~# mount -t nfs [2001::1:1]:/home/abian/test /home/abian/nfs_folder

4- Consideraciones adicionales

En el archivo /etc/exports puse dos líneas. Eso quiere decir que estoy exportando dos directorios del servidor. El directorio /home/abian/test solo puede ser accedido desde la dirección IPv6 2001::1:2 pero el directorio /home/abian/test2 puede ser accedido desde cualquier dirección IP porque puse un “*”.

Lo bueno de esta configuración es que puedo utilizar el protocolo IPv4 para acceder a un directorio y el protocolo IPv6 para conectarme a otro como muestro en la siguiente captura de pantalla:

IPv4 e IPv6 son buenos amiguitos

IPv4 e IPv6 son buenos amiguitos

Espero que este post os haya gustado. Se lo dedico especialmente al Maño y a su asignatura de sistemas operativos. ¡Ya me invitarás a una cerveza cuando nos veamos! :-)

Esta semana entre unas cosas y otras he tenido que instalar el servidor de aplicaciones Glassfish unas 10 veces. El proceso es realmente sencillo y está perfectamente documentado.

Para instalarlo solo hay que seguir los 4 siguientes pasos:

1- Descargarlo de la página web de glassfish.

2- Descomprimir el zip o ejecutar el script de instalación.

3- Ejecutar el comando de inicio del servidor:

abian@server:~/glassfish3/bin$ ./asadmin start-domain domain1

4- Abrir en un navegador web la dirección http://127.0.0.1:4848

Página principal de Glassfish

Página principal de Glassfish

La primera vez que se abre esta página no pide password de administrador, a sí que la primera tarea de configuración post instalación será establecer un password para el usuario “admin” entrando en la sección “Dominio -> Contraseña de administración”.

También se pueden configurar los parámetros de la máquina virtual de java como la memoria máxima asignada al proceso que ejecuta el servidor glassfish (opción -Xmx). Para ello hay que ir a la sección “Configuración -> configuración del servidor -> JVM Options” como se puede ver en la siguiente captura de pantalla:

Opciones de la Máquina Virtual de Java

Opciones de la Máquina Virtual de Java

Del mismo modo, es buena idea crear un script para que arranque y pare el servidor. Para ello hay que copiar el siguiente código en un fichero en la carpeta /etc/init.d/

abian@server:~$ cat /etc/init.d/glassfish
#!/bin/bash  
GLASSFISHPATH=/home/abian/glassfish3/bin  #cambiad esto por la ruta de vuestra instalación
case “$1” in  
    start)  
      echo “starting glassfish from $GLASSFISHPATH”  
      # cambiad “abian” por el nombre de usuario que ejecutará el proceso glassfish
      sudo -u abian $GLASSFISHPATH/asadmin start-domain domain1  
      ;;  
    restart)  
      $0 stop  
      $0 start  
      ;;  
    stop)  
      echo “stopping glassfish from $GLASSFISHPATH”  
      # cambiad “abian” por el nombre de usuario que ejecutará el proceso glassfish
      sudo -u abian $GLASSFISHPATH/asadmin stop-domain domain1  
      ;;  
    *)
     #defaul value restart  
      $0 stop
      $0 start
      ;;  
esac 

No hay que olvidar asignar los permisos de ejecución a este nuevo script:

root@server:~# chmod +x /etc/init.d/glassfish

Después tan solo hay que ejecutar el comando update-rc.d (como root) para que se inicie glassfish automáticamente cuando arranca el ordenador:

root@server:~# update-rc.d glassfish defaults

Una de las cosas que resulta más cómoda es la visualización de logs ya que se puede acceder a ellos desde la sección “Servidor -> ver archivos de registro”. Glassfish permite buscar, filtrar, ordenar los eventos y errores producidos por las aplicaciones web desplegadas. Realmente es muy útil mientras se está desarrollando o realizando pruebas sobre una sección del código.

Ver archivos de log

Ver archivos de log

Un saludo

Cuando se está trabajando con equipos en una red local, seguro que nos encontramos con la necesidad de permitir que ciertos equipos accedan al disco duro de un equipo remoto. Una de las formas de hacerlo es utilizar NFS (Network File System). Utilizando NFS podemos exportar un directorio de un equipo (servidor) para que sea utilizado por otros equipos (clientes) tanto en modo solo lectura como de lectura-escritura.

Para instalarlo solo hay que teclear el siguiente comando:

sudo apt-get install nfs-kernel-server nfs-common portmap

Para tener una idea de qué acabamos de instalar, puedo deciros que portmap sirve para transformar identificadores de programa RPC en direcciones DARPA. Para ver un ejemplo de funcionamiento, se puede ejecutar el siguiente comando:

abian@server:~$ rpcinfo -p
program vers proto   port
100000    2   tcp    111  portmapper
100000    2   udp    111  portmapper
100024    1   udp  39034  status
100024    1   tcp  58076  status
100003    2   udp   2049  nfs
100003    3   udp   2049  nfs
100003    4   udp   2049  nfs
100021    1   udp  34156  nlockmgr
100021    3   udp  34156  nlockmgr
100021    4   udp  34156  nlockmgr
100003    2   tcp   2049  nfs
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100021    1   tcp  44829  nlockmgr
100021    3   tcp  44829  nlockmgr
100021    4   tcp  44829  nlockmgr
100005    1   udp  49504  mountd
100005    1   tcp  46117  mountd
100005    2   udp  49504  mountd
100005    2   tcp  46117  mountd
100005    3   udp  49504  mountd
100005    3   tcp  46117  mountd

Por otra parte, nfs-common contiene los binarios necesarios para utilizar el servicio NFS tanto en el cliente como en el servidor (lockd, statd, showmount, y nfsstat). Nfs-kernel-server contiene el soporte para el kernel de linux necesario para poder transformar nuestro equipo en un servidor NFS. Por supuesto, este último paquete no será necesario en el cliente.

Ahora está claro lo que se ha instalado, se puede pasar a la correcta configuración del servidor. Para ello hay que editar tres ficheros.

  1. El fichero /etc/exports contendrá una línea por cada directorio que se desee exportar. Por ejemplo, con el siguiente contenido estaríamos indicando que el equipo con la IP 192.168.10.25 tiene acceso de lectura y escritura al directorio /home/abian/test/ mientras que el equipo con la IP 192.168.10.26 tan sólo tiene acceso de lectura. He utilizado la opción no_subtree_check porque es la opción por defecto para la comprobación de subdirectorios pero puede que no sea la más aconsejable para un entorno de producción:

    abian@server:~$ cat /etc/exports
    /home/abian/test       192.168.10.25(rw,sync,no_subtree_check) 192.168.10.26(ro,sync,no_subtree_check)


    Éste es el ejemplo más sencillo, se puede exportar un directorio a una subred, utilizar opciones de mapeo de usuarios, escrituras asíncronas… Para ver más información y ejemplos útiles recomiendo (como siempre) utilizar el comando man:

    abian@server:~$ man exports

  2. El fichero /etc/hosts.allow contiene las directivas necesarias para controlar qué equipos acceden a qué servicios. En este caso tenemos que incluir dos líneas para que el sistema funcione.

    abian@server:~$ cat /etc/hosts.allow
    portmap:192.168.10.0/255.255.255.0
    nfs:192.168.10.0/255.255.255.0

    Con estas dos líneas estamos indicando que permita el acceso a todos los equipos de la subred 192.168.10.0 a los servicios portmap y nfs.

  3. El último fichero de configuración está relacionado con el anterior pero tiene justo la utilidad contraria. En /etc/hosts.deny hay que escribir las directivas adecuadas para impedir el acceso de algunos equipos a determinados servicios. Para hacer que Ramiro se sienta orgulloso de mi, voy a hacer publicidad de una de las mejores políticas de seguridad que conozco: “Permitir a todos y denegar a unos pocos” “Permitir a unos pocos y denegar al resto”. Por lo tanto en este archivo tan sólo debe aparecer la línea ALL: PARANOID.

    abian@server:~$ cat /etc/hosts.deny
    ALL: PARANOID

El servidor está completamente configurado. Para aplicar los cambios realizados en los distintos archivos de configuración, es recomendable/necesario reiniciar los servicios relacionados:

abian@server:~$ sudo /etc/init.d/portmap restart
abian@server:~$ sudo /etc/init.d/nfs-kernel-server restart

Para hacer una última comprobación se puede utilizar el comando exportfs:

abian@server:~$ exportfs
/home/abian/test
192.168.10.25
/home/abian/test
192.168.10.26

El siguiente paso es probar que realmente lo que hemos configurado funciona. Para ello hay que utilizar alguna máquina cliente (recordando que debe tener la IP 192.168.10.25 o 192.168.10.26) y utilizar el comando:

abian@client:~$ sudo apt-get install nfs-common
abian@client:~$ mkdir test
abian@client:~$ mount -t nfs server  /home/client/test/

Siempre es más cómodo utilizar para estos menesteres el fichero /etc/fstab. La línea necesaria en este fichero sería la siguiente:

server:/home/abian/test /home/client/test nfs timeo=10,intr

¿Algunas recomendaciones extras?

  • Muchos de los problemas de seguridad en las redes de las organizaciones o empresas vienen por el uso incorrecto de los servicios RPC o por vulnerabilidades en dichos servicios. Recomiendo encarecidamente mantener actualizado el software del servidor, tanto del kernel como del resto de los servicios. Además, el firewall se convierte en un elemento más importante si cabe (y sí, cabe) para impedir que se accedan a los servicios nfs y RCP desde el exterior de nuestra red local.
  • El sistema se puede hacer un lío con los identificadores de usuarios si intentamos escribir en el directorio que hemos exportado con un usuario que no existe en el servidor o algo similar. La utilización de un sistema centralizado de credenciales de usuario como LDAP podría solventar esta situación. Pero hasta que saque un rato para escribir un post sobre OpenLDAP os recomiendo la utilización de mappings de usuarios en la configuración del archivo /etc/exports. Utilizando anonuid=190 y anongid=110 podéis hacer creer al sistema que 190 es el user id del usuario anónimo pero puede corresponder al propietario del directorio que se está exportando. Lo mismo sucede con el anongid. El tercer y el cuarto campo del fichero /etc/passwd contienen respectivamente el identificador de usuario y grupo.

Espero que os haya resultado de utilidad. Un saludo