domingo, 20 de agosto de 2017

Acceso a múltiples servidores de TeamSpeak mediante subdominios sobre la misma IP en Linux usando TSDNS

Escenario

Tenemos un servidor dedicado con dirección pública (1.2.3.4) en el que tenemos ya corriendo un server de ts3 en la dirección 1.2.3.4:9987 (comportamiento por defecto de ts3). A dicho servidor se puede acceder utilizando esa dirección ip:puerto, nuestro nombre de dominio sysfiend.host y sus subdominios *.sysfiend.host. La idea ahora es montar un nuevo server de ts3 en la misma máquina al que se debe poder acceder solo desde priv.sysfiend.host y que correrá en la dirección 1.2.3.4:9988.

El plan

Una vez montado el segundo servidor (utilizando una herramienta como YaTQA), vamos a configurar el servicio TSDNS que nos proporciona TS3 y a crear un nuevo registro SVN en nuestro DNS.

Fire!

Accedemos a la carpeta tsdns:
cd tsdns

Copiamos el fichero tsdns_settings.ini.sample y editamos el nuevo:
cp tsdns_settings.ini.sample tsdns_settings.ini
nano tsdns_settings.ini

Al final de este, añadimos:
priv.sysfiend.host=1.2.3.4:9988
sysfiend.host=1.2.3.4:9987
*.sysfiend.host=NORESPONSE

De esta manera priv.sysfiend.host siempre resolverá en nuestro nuevo server corriendo en el puerto 9988, mientras que sysfiend.host resolverá en el antiguo, corriendo en el puerto 9987. Además, utilizando la línea de *.sysfiend.host=NORESPONSE, evitamos que cualquier subdominio (menos los especificados) resuelvan en algún servidor de TeamSpeak.
Una vez configurado, lanzamos el ejecutable del servicio que se encuentra en esta misma carpeta con el argumento --update para que actualice los datos:
./tsdnsserver --update

Si todo ha ido bien, debería aparecer un texto tal que así:
Scanned tsdns_settings.ini, number of entries ipv4: 2 normal and 1 wildcards; ipv4+6:2 normal and 1 wildcards.

Finalmente, pero no menos importante, añadimos un registro SVN a nuestro servidor DNS para que el servicio TSDNS sea alcanzable desde _tsdns._tcp.sysfiend.host:
ADD NEW RECORD > SRV Record
Service: _tsdns
Protocol: _tcp
Priority: 0
Weight: 1
Port: 41144 (este es el puerto por defecto de tsdns, en caso de tener uno diferente, modificarlo)
Target: sysfiend.host

Done!

Ahora solo nos queda esperar que los servidores DNS se actualicen y ya no tendremos que tocarlos más para estos temas. 

jueves, 9 de febrero de 2017

¿Cómo protege WhatsApp las conversaciones?

Seguridad en WhatsApp

En este post solo explicaré que mecanismo usa WhatsApp para proteger las conversaciones, no hablaré de los fallos que este tiene ni de los "backdoors" de los que ya se ha hablado mucho (aunque también lo haré en algún momento futuro). Pues bien, con esto aclarado, vamos a ello.

Para proteger las conversaciones, WhatsApp utiliza la encriptación de los mensajes utilizando cifrado asimétrico, impidiendo así que nadie, menos el destinatario, pueda leerlos. Para ello, cada usuario cuenta con una clave privada y 100 claves públicas temporales asociadas a esa única privada.
En la práctica, mandar un mensaje de A a B sería algo como esto:
  1. A pide a B su clave pública.
  2. A cifra el mensaje con la clave pública de B.
  3. A envía el mensaje cifrado a B.
  4. B recibe el mensaje cifrado.
  5. B utiliza su clave privada para descifrar el mensaje.
Y listo, una vez "desbloqueado" el mensaje, B ya puede gozárselo con información super privilegiada de A mientras que C se limita a seguir dando rienda suelta a su imaginación...

jueves, 2 de febrero de 2017

Ser un vago es lo mejor que te puede pasar o la historia de cómo hice el trabajo de varios días en 2 horas

12 Reasons Why Every Linux System Administrator Should be Lazy <- Una buena lectura hablando del tema

Desde bien pequeño ya me decían que era un vago y que nunca hacía nada, y en parte tenían razón... Nunca me gustó hacer más de lo estrictamente necesario en temas que no me interesaban suficiente y siempre he intentado optimizar lo más posible trabajos repetitivos. Por ejemplo, cada vez que había comida familiar, era necesario coger unas cuentas sillas extra del garaje para los invitados y siempre intentaba hacer el menor número de viajes posibles, ya fuera encajando una encima de otra, arrastrándolas o como fuera, pero siempre el menor tiempo perdido posible.
Esta manera de ver las cosas la he ido utilizando siempre y me ha llevado a ser, o eso quiero creer, un vago eficiente.

A la hora de administrar un servidor, una red o incluso algo tan simple como un fichero al que hay que hacer cambios, te encuentras demasiadas veces en situaciones en las que, si tuvieras los conocimientos necesarios no necesitarías más que ejecutar un comando, crear un pequeño script o utilizar alguna aplicación ya existente para ahorrarte, en ocasiones, horas de trabajo. Es por eso que siempre que se me plantea un trabajo grande y repetitivo, en lo primero que pienso es en una manera de automatizarlo, en alguna manera de imponer el conocimiento a la fuerza bruta. A veces resulta que tardas más tiempo buscando una solución del que habrías gastado haciendo lo que sea que tenías que hacer pero, la próxima vez, es algo que ya tienes aprendido.


Pasemos a algo más práctico... ¿por qué debes ser un vago?

Pues bien, si ya has tenido que enfrentarte a administrar algo, sea lo que sea, sabrás de sobra de lo que voy a hablar y, en caso de que no sea así, apunta.
Administrar, ya solo como palabra, mete miedo. Significa tener el control absoluto de algo, ver lo que hace, cuando y por qué, supervisar su correcto funcionamiento, tomar decisiones, hablar con gente y un sin fin de responsabilidades asociadas. Es por esto que debemos ser lo más vagos de toda la oficina. Serán necesarios conocimientos que puede que no tengas en un principio y tiempo dedicado a leer, de todo, logs, artículos, preguntas y respuestas, y necesitarás hackear cada proceso, buscar sus vulnerabilidades y usarlas a tu favor. Aquí va un ejemplo de hackear un proceso, por si no queda claro el concepto:
Mi escenario era simple: tenía delante una página web (example.com) en la que había unos 4.000 emails públicos que me interesaban y no podía usar un email crawler ya existente por x motivo. En mi poder tenía un plugin para Chrome llamado Email Extractor que recolectaba todos los emails existentes en la página actual (un email crawler sin profundidad, básicamente). Lo único que sabía era que en un apartado de la web había una lista con todas las entidades de las que necesitaba obtener los correos y estaba organizado de la siguiente manera:

ID
NOMBRE ENTIDAD
TELÉFONO
ID2
NOMBRE ENTIDAD2
TELÉFONO2
ID3
NOMBRE ENTIDAD3
TELÉFONO3

Siendo cada ID un enlace a una página con un script de redirección, por lo que, clickar en ID hacía lo siguiente:
Click en ID ->
-> example.com/redireccion.php?id=$ID -> 
-> example.com/entidades/nombre_entidad (no necesariamente igual al de la tabla)
Viendo el panorama, la solución más obvia era visitar 4000 páginas diferentes para conseguir esos correos, pero lo mismo no.

Obtener el link de cada una de las páginas era fácil, tan solo había que copiar el ID y utilizarlo luego en la url, pero ¿cómo sacar el email de manera automatizada? "¡Ya está! Uso curl para descargar todas las páginas y hago un grep '@' y ya está" pensé. Ciertamente funcionaba, pero me devolvía, mínimo, 5 emails por página y algunos elementos que no eran para nada emails como "deportist@s", así que no era suficiente. Y entonces fue cuando vino el momento de aprender algo. Pensé que seguramente habría algún tipo de programa que te permitiría extraer contenido de un fichero html dándole, como referencia, su anidación. Por ejemplo, dado un fichero con el contenido:

<div class="foo">

    <div class="bar">

      <p>correo@example.com</p>

    </div>

</div>

... el programa sería capaz de sacar lo que hubiese dentro de <p> solo cuando estuviese dentro del div .bar y .foo respectivamente, y así era, este programa existía, por lo que me lo descargué, leí el manual, hice una prueba y me preparé para ahorrarme el trabajo de varios días de una manera bastante elegante.

Con todo esto aprendido, tan solo quedaba escribir un pequeño script que se descargase cada una de las páginas donde se encontraban los emails y que posteriormente la analizase y me sacase como resultado a un fichero todos y cada uno de esos 4000 correos. Y de esa manera, en unas 2 horas, hice el trabajo de varios días.


Al igual que este ejemplo, hay miles y todos tienen una fácil solución: ser un vago.

martes, 17 de enero de 2017

No puedo acceder remotamente a mi aplicación | Algunas soluciones comunes

Antes de nada, esto no vale para todos y cada uno de los problemas que se puedan afrontar tras una instalación (supuestamente) exitosa, pero ayuda a en muchos casos.

Escenario:

He instalado x aplicación, la cual tiene un interfaz de administración web, en mi Raspberry Pi.
Puedo acceder por SSH a la Pi y al interfaz web desde ella, pero desde otro equipo en la misma red, no.

Comandos útiles para comprobaciones:

netstat -punta | grep LISTEN #localmente
netstat -punta | grep miaplicacion
nmap -p80 dirección.ip.raspberry #desde el exterior


Troubleshooting:

Puesto que podemos hacer SSH a la Pi, nuestro abanico de posibles problemas se cierra bastante y nos quedamos con problemas de firewall, iptables, selinux o errores de configuración.

Firewall

Por defecto viene deshabilitado en las Pi, así que, a no ser que hayamos configurado nosotros uno, nos olvidamos. En caso de haber instalado uno, comprueba que acepta conexiones desde el exterior o, al menos, la misma red.

Iptables

Solución rápida; borrar nuestra configuración:

iptables -F


Solución menos rápida, comprobar la configuración y hacer los ajustes necesarios, en caso de ver algún error:

iptables -L #Configuración actual

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #Abrir puerto TCP 80 (ejemplo)


Un poco de ayuda con el tema de Iptables -> https://help.ubuntu.com/community/IptablesHowTo

Selinux (desgraciado...)

En caso de que no esté ya, lo deshabilitamos:

vi /etc/selinux/config #la ruta puede variar un poco dependiendo de vuestro OS

Cambiamos
SELINUX=permissive
por
SELINUX=disabled
sestatus #comprobamos que, en efecto, lo hemos deshabilitado


Errores de configuración

Si has llegado a este punto, es porque todo lo anterior ha fallado y sigues sin poder acceder a tu aplicación. En ese caso, solo nos queda lidiar con los ficheros de configuración de dicha aplicación
(y su manual) para comprobar que no hay ninguna opción que impida aceptar tráfico desde el exterior. Una opción común de este tipo hace referencia a algo como LISTEN, NETWORK INTERFACES seguido de una dirección de red (en caso de ser 127.0.0.1, habría que cambiarla por la de nuestra red o 0.0.0.0 para aceptar tráfico desde cualquier parte).

lunes, 10 de octubre de 2016

Chrome: 5 extensiones que te solucionan la vida

1. Session Box

Nos permite tener más de una cuenta abierta de manera simultánea en un mismo sitio web y guardar dichas sesiones, para poder acceder a ellas mediante un simple click desde su menú desplegable.

Chrome extensions SessionBox


2. LastPass

Con esta extensión podemos almacenar y gestionar fácilmente usuarios y contraseñas, rellenar campos comunes de formularios y guardar notas de manera segura. Toda esta información es almacenada en nuestra cuenta, a la que podemos acceder desde cualquier navegador, y puede ser compartida de manera segura con otros usuarios.

Chrome extensions LastPass

3. Hola!

VPN gratis, a todas horas y con un interfaz amigable, poco más se necesita decir.

Chrome extensions Hola!


4. Pocket

La herramienta perfecta para guardar sitios web para posterior lectura desde cualquier tipo de dispositivo.

Chrome extensions Pocket


5. Dark Skin for Youtube

Es de noche, la luz está apagada, el silencio es tan abrumador que escuchas los latidos de tu propio corazón y como la sangre fluye por tus venas, no hay guerras en el mundo... y aún así, ahí está Youtube con su imponente claridad cegando a la humanidad y, por suerte, esta extensión para solucionarlo.

Chrome extensions Dark skin for youtube

miércoles, 5 de octubre de 2016

Rsync: 5 ejemplos prácticos de uso en Linux

Rsync (Remote Sync) nos permite mantener sincronizados nuestros ficheros en tantos equipos como queramos de una manera muy simple y eficaz. Es importante decir que rsync no actúa como nfs, por lo que los ficheros sincronizados estarán almacenados en cada uno de los equipos en los que estén presentes.
Este comando es muy útil cuando necesitamos tener el mismo fichero replicado en varios equipos y queremos ahorrarnos tiempo y modificarlo solo una vez, y para mantener una copia de seguridad remota.

Instalación


Sistemas basados en Red Hat:
yum install rsync -y

Sistemas basados en Debian:
apt-get install rsync -y

Opciones más comunes

  • -v : verbose
  • -a : modo archivo, permite copiar ficheros recursivamente y preserva los symlinks, permisos, propietario (usuario y grupo) y timestamps.
  • -r : recursividad. No preserva timestamps ni permisos.
  • -z : comprime los datos.
  • -h : muestra los datos numéricos de una manera fácil de comprender.

1. Sincronización de un directorio

Pongamos como ejemplo que queremos sincronizar el directorio local /opt/data con el directorio remoto /home/sysfiend/data:

rsync -razvh /opt/data/ sysfiend@192.168.0.50:/home/sysfiend/data/

2. Sincronización sobre ssh

Rsync también nos permite realizar la sincronización utilizando ssh para que esta se realice de manera encriptada y segura. Para este ejemplo, sincronizamos el directorio local /opt/data con el directorio remoto  /home/sysfiend/data utilizando la opción '-e':

rsync -razvhe ssh /opt/data/ sysfiend@192.168.0.50:/home/sysfiend/data/

3. Sincronización sobre ssh especificando el puerto

Como comentaba en el post Seguridad básica de un servidor en Internet, es recomendable tener un puerto diferente al predeterminado para ssh, así que si queremos utilizar rsync, deberemos especificarle el puerto (por ejemplo, el 456):


rsync -razvh -e "ssh -p 456" /opt/data/ sysfiend@192.168.0.50:/home/sysfiend/data/

4. Mostrar el progreso 

Si queremos ver el progreso mientras transferimos los datos, lo podemos hacer con la opción '--progress':

rsync -razvh --progress /opt/data/ sysfiend@192.168.0.50:/home/sysfiend/data/

5. Incluír y excluír ficheros

Utilizando la opción '--include', especificamos los ficheros que queremos incluír y con '--exclude' los que queremos excluír. Por ejemplo, si queremos incluír solo los ficheros que terminan en '.tar' y excluír el resto, utilizaríamos:


rsync -razvh --include '*.tar' --exclude '*' /opt/data/ sysfiend@192.168.0.50:/home/sysfiend/data/

viernes, 30 de septiembre de 2016

Seguridad básica de un servidor en Internet: Acceso y Firewall

Típico post que acabas leyendo cuando las cosas malas ya han pasado, lo sé. De todos modos, más vale tarde que nunca, ¿no?
Este post se adapta a cualquier sistema operativo, aunque algunos comandos pueden variar.

Acceso al servidor (Las cosas por defecto, caca)


Estas medidas pueden ser tomadas en su totalidad o solo algunas de ellas, pero os recomendaría no dejar nada.

Usuarios 


Cambiamos la contraseña de root:

passwd

Y las de cualquier usuario que nos hayan dado por defecto o, directamente, los eliminamos y creamos uno nuevo que será con el que trabajemos:

userdel usuariopordefecto
useradd miusuario
passwd miusuario

Posteriormente vamos a deshabilitar el acceso como root por ssh al servidor y accederemos como miusuario, así que, para evitarnos trabajo, vamos a dejar que miusuario tenga privilegios para hacer lo que le plazca:

nano /etc/sudoers


Buscamos root ALL=(ALL:ALL) ALL y añadimos debajo:

miusuario ALL=(ALL:ALL) ALL



Credenciales


Por muy larga y compleja que sea nuestra contraseña, siempre es más fácil, rápido y seguro tener un par de claves para acceder, así que vamos a generarlas. Suponiendo que tenemos Linux como sistema operativo en nuestro PC, el procedimiento es el siguiente:

ssh-keygen

Una vez generadas, tendremos un fichero con la clave privada, por defecto  ~/.ssh/id_rsa y otro con la clave pública, que por defecto es  ~/.ssh/id_rsa.pub
Pasamos la clave pública al servidor:


ssh-copy-id miusuario@miserver

En el caso de estar en Windows, podemos utilizar PuTTYgen, que nos creará una pareja de claves, la privada  nos la quedamos nosotros y la pública la pasamos al servidor copiándola en el fichero   /home/miusuario/.ssh/authorized_keys.



SSH


Vamos a:
  • Cambiar el puerto de conexión del 22 a uno cualquiera no utilizado(Por ejemplo: 597).
  • Deshabilitar el acceso root.
  • Deshabilitar el acceso por contraseñas.
nano /etc/ssh/sshd_config

Port 597
PermitRootLogin no
PasswordAuthentication no

Reiniciamos el servicio:

systemctl restart sshd

Ahora, antes de nada, es importante comprobar que todo funciona como debiera para no llevarnos sustos. Intentamos conectarnos al servidor iniciando otra conexión (SIN CERRAR la actual) y comprobamos que todo vaya bien. Qué tiene que pasar:
  • No nos dejará conectarnos por el puerto 22.
  • Se establece la conexión por el puerto 597.
  • Una vez introducido el usuario, entramos directamente sin necesidad de introducir contraseña.
  • Al mover nuestra clave privada de lugar e intentar conectarnos, no nos deja.

Firewall

En este apartado hay varias alternativas que se pueden tomar, pero en mi caso recomiendo utilizar APF(Advanced Policy Firewall) ya que tiene una enorme cantidad de opciones que puede que lleguemos a utilizar algún día.

1. Instalamos APF:

cd /usr/local/src
wget http://www.rfxn.com/downloads/apf-current.tar.gz
tar -xzvf apf-current.tar.gz
cd apf-*
./install.sh

2. Una vez la instalación se haya completado, tenemos que editar el fichero de configuración de APF para abrir los puertos que necesitamos (pongamos que necesitamos abrir, además del 597 para ssh, el 80 para una web):

nano /etc/apf/conf.apf

DEVEL_MODE="0"
IG_TCP_CPORTS="80,597"

3. Iniciamos el firewall:

apf -s

Además de esto, APF cuenta también con unos ficheros en los que podemos añadir IPs o rangos de IPs denegadas/permitidas. Estos ficheros son /etc/apf/allow_hosts.rules/etc/apf/deny_hosts.rules.

miércoles, 28 de septiembre de 2016

Zabbix 3.2: Instalación y configuración [CentOS 7.2]

zabbix instalacion

Zabbix se presenta como una gran herramienta de código abierto orientada a la monitorización de grandes cantidades de dispositivos, y tras darle bastante caña, puedo asegurar que cumple muy bien con lo prometido, así que hoy veremos como hacer una instalación bastante simple entre un server y un agent.

Conceptos importantes

  • Server: encargado de recopilar la información de los agents, almacenarla, procesarla y mostrarla en el interfaz web.
  • Agent: máquina monitorizada. Un server puedes ser a su vez un agent.
  • Proxy: encargado de recopilar la información de los agents, almacenarla y reenviarla al server. No es esencial para el funcionamiento de Zabbix sin embargo, sí es muy recomendable y hablaremos de él en el futuro.
  • Gráfica: representación visual de los datos. Por ejemplo: tráfico en eth0
  • Screen: agrupación de gráficas.

Instalación

- Server

Aunque existen tres maneras diferentes de hacer la instalación, nosotros la vamos a hacer desde los paquetes del repo de Zabbix.

1. Instalamos el paquete de configuración del repositorio:

rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm

2. Instalamos los paquetes necesarios para el server:

yum install zabbix-server-mysql zabbix-web-mysql -y

Configuración base de datos 

En nuestro caso estamos utilizando MariaDB, pero otros  gestores de bases de datos están soportados.
Una vez la instalación se haya completado, deberemos configurar una base de datos por medio de los scripts que la propia instalación nos proporciona. 
mysql -uroot -pcontraseñaroot
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by 'contraseña';
mysql> quit;
cd /usr/share/doc/zabbix-server-mysql-3.2.3/
gunzip create.sql.gz
mysql -uzabbix -pcontraseña  zabbix < create.sql

Configuración y arranque servicios del server

1. Modificamos el fichero de configuración:

vi /etc/zabbix/zabbix_server.conf

DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=contraseña

2. Arrancamos el servicio:

systemctl start zabbix-server

Configuración de PHP

1. En el fichero /etc/httpd/conf.d/zabbix.conf podemos modificar el comportamiento de nuestro frontend, pero por lo de ahora solo vamos a descomentar y editar la opción date.timezone:


php_value max_execution_time 300
php_value memory_limit 128M
php_value post_max_size 16M
php_value upload_max_filesize 2M
php_value max_input_time 300
php_value always_populate_raw_post_data -1
php_value date.timezone Europe/Madrid

Para saber cual es tú timezone, aquí tienes una lista con todas las posibles.

2. Reiniciamos apache:

systemctl restart httpd

Una vez llegados a este punto, ya podemos acceder al interfaz web, desde el que añadiremos hosts, configuraremos que datos queremos monitorizar y demás, pero vamos primeramente a hacer la instalación de un agent

- Agent


1. Instalamos el paquete de configuración del repositorio:

rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm

2. Instalamos zabbix-agent:

yum install zabbix-agent -y

3. Editamos el fichero de configuración

vi /etc/zabbix/zabbix_agentd.conf

Server=zabbix.server         # Ip del server
ServerActive=zabbix.server   # Ip del server
Hostname=el_agent            # Nombre que le daremos posteriormente a este host para su monitorización

4. Reiniciamos el servicio:

systemctl restart zabbix-agent


Interfaz web

A partir de aquí, ya solo queda añadir el host agent que hemos configurado al server. Esto se lleva a cabo desde el interfaz web y se plantea mucho más intuitivo que todo lo que llevamos hecho.
Si la instalación se realizó correctamente, al acceder a http://localhost/zabbix desde nuestro server deberíamos ver algo como esto:

Login

Con el usuario Admin y la contraseña zabbix entramos con privilegios de superusuario y lo siguiente a hacer es crear otra cuenta, darle privilegios de superusuario, ponerle una contraseña seria y deshabilitar la cuenta por defecto, Admin. Es algo bastante fácil de hacer, por lo que no voy a hablar de ello pero si tenéis alguna duda, aquí os dejo la documentación oficial hablando al respecto.

Creación de un nuevo host

1. Creamos un nuevo host
Configuration > Hosts > Create host

1.1 Pestaña Host:


1.2 Pestaña Templates:

Select > Seleccionamos los que queramos (en este caso "Template OS Linux") > Add

1.3 Añadimos el nuevo host desde el botón "Add" que aparece en cualquiera de las pestañas:


¡Listo!

De aquí a unos segundos, se empezarán a crear las gráficas para nuestro nuevo host y podremos ir viendo todo lo que va pasando. De aquí en adelante, al ser todo a base de interfaz web (a no ser que os interese utilizar la API para la gestión en masa) solo os queda cacharrear y descubrir todo lo que Zabbix nos ofrece.

Para más información, os dejo la documentación por aquí.

lunes, 26 de septiembre de 2016

NFS: Instalación, configuración y reglas firewall [Ubuntu y CentOS]

Las pelis y series ocupan demasiado espacio y somos demasiado vagos como para ponernos a mover hardware de un lado para el otro, así que aprovecharemos que Linux nos ofrece NFS para compartir espacio de almacenamiento y nos ahorramos el esfuerzo.

NFS funciona con un modelo cliente-servidor, por lo que vamos a hacer la instalación uno por uno.

Server side (Ubuntu 14.04.4)



1. Como siempre, antes de instalar nada, actualizamos:

apt-get update -y

2. Instalamos los paquetes necesarios para el server:

apt-get install nfs-common nfs-kernel-server -y

3. Editamos /etc/exports para que se ajuste a nuestras necesidades, en nuestro caso:

#Ubicación a compartir      IP/máscara cliente               Opciones                 
/home/almacen      192.168.0.10/255.255.255.0(rw,sync,no_subtree_check)

  •  En este caso, la IP con la que vamos a compartir hace referencia a una sola máquina, aunque también es posible hacerlo con todas las máquinas de una red. Por ejemplo, si quisiéramos que todas las máquinas de esta red tuvieran acceso a los datos del servidor, escribiríamos 192.168.0.0/255.255.255.0
  • Opciones posibles:
    • ro: solo lectura 
    • rw: lectura y escritura
    • no_root_squash: permite al usuario root remoto tener los mismos privilegios que el root local. 
    • subtree_check: especifica que, al ser exportado un directorio en vez de un sistema de ficheros completo, es necesario que el host compruebe la ubicación de los archivos y directorios en el sistema de ficheros host. Esta opción, orientada a evitar la escalabilidad de privilegios, suele causar muchos problemas en la mayoría de sistemas, por lo que es mejor tomar otra serie de medidas en caso de que exista tal riesgo.
    • no_subtree_check: el host no comprueba la localización en el sistema de ficheros host.
    • sync: mantiene sincronizados los ficheros compartidos.
    • async: ignora las sincronizaciones para favorecer la velocidad.

4. Para que nuestro servidor NFS funcione, necesitamos tener en funcionamiento dos servicios, rpcbind y nfs-kernel-server, así que los iniciaríamos. Al estar en Ubuntu, ambos están ya corriendo, así que los reiniciamos:

service rcpbind restart


service nfs-kernel restart


# # # # # # # # # # # # # # # # # #

Pudiera ser que cuando estéis leyendo esto, el nombre de los paquetes haya cambiado, así que si los que yo he utilizado no os aparecen, podéis hacer la siguiente consulta y buscarlos:

apt-cache search nfs


# # # # # # # # # # # # # # # # # #



Client Side (CentOS 7.2.1511)


Por la parte del cliente, la cosa se pone todavía más fácil...

1. Actualizamos:

yum update -y

2.. Instalamos nfs-utils:

yum install nfs-utils -y


3. Montamos:

mount 192.168.0.10:/home/almacen /mas_pelis


¡Listo! En dos minutos ya tenemos más espacio para almacenar sin límites (más o menos) toda nuestra basura. A partir de ahora, todo lo que guardemos en /mas_pelis se almacenará en nuestro servidor y lo tendremos accesible desde ambos equipos.
A todas estas alegrías, sin embargo, hay que ponerle una pega (la de siempre) los permisos. Para poder darle uso al directorio que hemos montado, deberemos tener un usuario con el mismo UID y GID en ambas máquinas. Esto es necesario porque no le estamos dando privilegios al root del equipo cliente para actuar como tal sobre este directorio, así que si preferís que sea al contrario, cambiad las opciones en el /etc/exports y listo.



Configuración del firewall


En el caso de tener que lidiar con un firewall, necesitaréis abrir los puertos 2049 y 111, ambos en TCP y UDP.
De todos modos, os recomiendo también echarle una lectura a este artículo en el que se explica mucho más en detalle todo lo relevante a este tema y la seguridad en NFS.