7. Compartir Fitxers en Xarxa (NFS)

Utilitzarem el Network File System (NFS), perquè és un sistema relativament senzill.
NFS és un protocol de sistema de fitxers en xarxa originalment desenvolupat per Sun Microsystems el 1983.
Permet a un ordinador client accedir a fitxers d'un ordinador (anomenat servidor) a través de la xarxa.
Els ordinadors s'identifiquen a través de la adreça IP.

En principi suposarem que treballem dins d'una xarxa domèstica on cada ordinador té assignada una IP diferent (IP estàtica).
Per tant primer el que farem és identificar la IP de cada ordinador i forçar a que mantingui sempre la mateixa IP.
Un cop fet això, procedirem a configurar els ordinadors.
Seguirem la majoria de passos d'aquest tutorial.

També es possible connectar dos ordinadors directament (sense router).
Aquesta possibilitat la comentarem al final de tot.
Només necessitarem un cable normal d'Ethernet (el cable que habitualment fem servir per connectar l'ordinador al router).
Farem servir el cable d'Ethernet per connectar directament els dos ordinadors.
Per transferir fitxers farem servir el NFS, tal i com s'explica a continuació.



Programari necessari i preparatius per a tots els ordinadors

Obrim un terminal i instal·lem els paquets nfs-common i nfs-kernel-server (el segon paquet només el necessitem al servidor):

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

Necessitem saber quin és el nom de cada ordinador en xarxa.

El nom de cada ordinador client es troba en el fitxer /etc/hostname.
Si no en sabem el nom fem en un terminal:

sudo cat /etc/hostname

i ens sortira el nom amb el que s'identifica el ordinador quan està en xarxa.

Si no ens agrada el nom el podem canviar (editant el fitxer /etc/hostname), però per fer efectiu el canvi haurem de reiniciar la màquina o fer:

sudo hostname newname

on newname és el nou nom de la màquina.

El meu servidor es dirà debsony.



Configuració del servidor

Primer li hem de dir al servidor quins son els nostres clients.
A cada client li posarem el nom de la màquina corresponent.

Llista de clients a /etc/hosts

En el servidor, editem la "llista de clients" fent:

sudo gedit /etc/hosts

A les primeres dues linies apareix el nom de la màquina. Per exemple pot aparèixer

127.0.0.1    debcinta localhost.localdomain localhost
127.0.1.1    debcinta.home    debcinta


La paraula localhost identifica també el nostre ordinador (en aquest cas el servidor).
L'extensió .home (el localdomain) és arbitrària, però és important que tots els ordinadors tinguin la mateixa.
A tots els ordinadors de la meva xarxa els he posat com a localdomain la paraula home.

Afegim, a continuació d'aquestes dues línies, la llista dels clients, especificant la IP i el nom amb la corresponent extensió de cada client. Per exemple:

192.168.1.16    debsony.home    debsony
192.168.1.15    ecc.home     ecc
192.168.1.10     debsonic.home     debsonic
192.168.1.13     debacer.home     debacer
192.168.1.14    debnote.home     debnote


D'aquesta manera ja tenim "fitxats" els clients.
El següent pas consisteix en autoritzar l'accés dels clients al servidor.

Autorització dels clients per a muntar la carpeta a compartir

Per a autoritzar els clients, editem el fitxer /etc/hosts.allow fent

sudo gedit /etc/hosts.allow

i afegim:

mountd: .home

per a autoritzar-los tots de cop.

D'aquesta manera autoritzem tots els clients amb localdomain home (dels que tenim a la llista /etc/hosts).
Si només volguéssim autoritzar-ne un, en posaríem el nom.

El següent pas és crear la carpeta a compartir.

Creació de la carpeta a compartir

Creem una carpeta i canviem els permisos.
A la carpeta li direm "compartir"
Per exemple podem crear una carpeta a l'escriptori:

mkdir /home/cinta/Escriptori/compartir
 
Posem de propietari nobody i de grup posem a root.

Ara cal dir-li al sistema NFS que aquesta és la carpeta que volem compartir.
A més caldrà dir-li amb quins dels clients autoritzats volem compartir aquesta carpeta en concret.
Per a fer això, anem a la carpeta /etc i editem el fitxer /etc/exports fent:

cd /etc
sudo gedit exports


seguint l'exemple que tenim entre comentaris en el fitxer /etc/exports, afegim (en el meu cas i per a cadascun dels meus ordinadors):

/home/cinta/Escriptori/compartir debsony(rw,sync,no_subtree_check)
/home/cinta/Escriptori/compartir ecc(rw,sync,no_subtree_check)
/home/cinta/Escriptori/compartir debsonic(rw,sync,no_subtree_check)
/home/cinta/Escriptori/compartir debacer(rw,sync,no_subtree_check)
/home/cinta/Escriptori/compartir debnote(rw,sync,no_subtree_check)

Fixem-nos bé de que només deixem un espai entre el nom de la carpeta i el nom del client que autoritzem i que no em deixat espais a dins de les opcions.

finalment fem

exportfs -ra

per a què el sistema NFS llegeixi el fitxer /etc/exports.

I aquí conclou la feina de configuració del servidor.



Configuració del client


Un cop configurat el servidor, la única cosa que hem de fer des del client és muntar la carpeta que comparteix el servidor.
Creem aleshores una carpeta a l'escriptori (o a on vulguem), on muntarem la carpeta del servidor.

Per muntar la carpeta del servidor fem:

sudo mount -t nfs 192.168.1.11:/home/cinta/Escriptori/compartir /home/eduard/Desktop/compartir


on 192.168.1.11 és la IP del meu servidor i /home/eduard/Desktop/compartir la carpeta a on munto la carpeta del servidor (/home/cinta/Escriptori/compartir).

Per desmuntar la carpeta fem:

sudo mount -t nfs 192.168.1.11:/home/cinta/Escriptori/compartir

Resulta pràctic posar-ho en una llançadora per a no tenir que escriure el text cada vegada.



Velocitat de transferència

Amb una fast ethernet card hauríem de tenir una velocitat de transferència d'uns 100Mb/s, és a dir, al voltant de 12MB/s.
Si veiem que la velocitat de transferència es mes baixa, podem comprovar el següent.
En el client fem:

sudo nfsstat -rc

Si veiem que la variable retrans no és zero, agafem el servidor, i editem el fitxer

sudo gedit /etc/init.d/nfs-kernel-server

i incrementem el valor de la variable RPCNFSDCOUNT fins a 32 (per defecte acostuma a ser 8). Es pot incrementar fins valors molt superiors (com per exemple 256).

Un altre element a provar és a enviar la informació en paquets més grans.
Utilitzem aleshores aquesta instrucció per connectar-nos al servidor des del client:

sudo mount -t nfs -o rsize=65536,wsize=65536,intr,noatime 192.168.1.18:/home/cinta/Escriptori/compartir /home/eduard/Desktop/compartir

on ja veiem que hem afegit unes quantes opcions.

Bona sort!



Connexió directa de dos ordinadors amb un cable d'Ethernet

Simplement haurem d'establir una IP fixa a cada ordinador, per a poder utilitzar el protocol NFS.
Amb el Network Manager, definim manualment una connexió amb els següents paràmetres:

IP:    192.168.0.X         on X és un valor diferent per a cada ordinador.
Pel servidor podem assignar X = 18 i pel client X = 12, per dir dos números.

Netmask:    255.255.255.0

Gateway:   192.168.0.1

I ja està. Recordeu-vos-en de definir el client als fitxers corresponents del servidor per a poder tenir-hi accés.
No passa res si tenim el mateix ordinador definit amb diverses IPs diferents.



Tallafocs i Ports

Si instal·leu un tallafocs (Firewall) al vostre ordinador, és molt probable que els ports de comunicació es bloquegin i no pogueu transferir fitxers.
Això és degut a que NFS fa servir determinats ports de comunicació, i a més, utilitza els serveis de determinats daemons, que a la seva vegada utilitzen altres ports. Anem a veure de quins elements consta NFS:


nfsd (rpc.nfsd - NFS server process

The rpc.nfsd program implements the user level part of the NFS service.
The main functionality is handled by the nfsd.o kernel module; the user space program merely starts the specified number of kernel threads.
The rpc.mountd server provides a service needed to satisfy mount requests by NFS clients. 
By default, rpc.nfsd will listen on port 2049.


mountd (rpc.mountd - NFS mount daemon

The rpc.mountd program implements the NFS mount protocol.
When receiving a MOUNT request from an NFS client, it checks the request against the list of currently exported file systems.
If the client is permitted to mount the file system, rpc.mountd obtains a file handle for requested directory and returns it to the client. 
It binds to a random port number assigned by the portmapper.


statd (rpc.statd, NFS status daemon)

The rpc.statd service is a subsystem of the NFS protocol.
It is used so that if an NFS server crashes and comes back alive, it can notify clients that this event happened.
Actually, it is used by the NFS file locking service, rpc.lockd, to implement lock recovery when the NFS server machine crashes and reboots.
For each NFS client or server machine to be monitored, rpc.statd creates a file in /var/lib/nfs/statd/sm.
When starting, it iterates through these files and notifies the peer rpc.statd on those machines.  
By default, rpc.statd will ask portmap(8) to assign it a port number.
There is not a standard port number that portmap always or usually assigns.


portmap (rpc.portmap, or rpcbind)

The port mapper  is an Open Network Computing Remote Procedure Call (ONC RPC) service that runs on network nodes that provide other ONC RPC services. When an ONC RPC server is started, it will tell the port mapper, what port number it is using for that particular transport protocol.
Clients wishing to make an ONC RPC call to a particular version of a particular ONC RPC service must first contact the port mapper on the server machine to determine the actual TCP or UDP port to use.
The port mapper service always uses TCP or UDP port 111; a fixed port is required for it, as a client would not be able to get the port number for the port mapper service from the port mapper itself.


lockd (rpc.lockd - start kernel lockd process

The rpc.lockd program starts the NFS lock manager (NLM) on kernels that don't start it automatically.
However, since most kernels do start it automatically, rpc.lockd is usually not required.


rquotad (rpc.rquotad

rquotad returns quotas for a user of a local filesystem which is mounted by a remote machine over the NFS. It also allows setting of quotas on NFS mounted filesystem. The results are used by quota(1) to display user quotas for remote filesystems and by edquota(8) to set quotas on remote filesystems. The rquotad daemon is normally started at boot time from the system startup scripts.  


Ja veiem doncs que necessitem tenir accés als ports 111 i 2049 del servidor més tres altres ports que prenen valors aleatoris.
Caldrà doncs forçar les coses per a que tots els processos tinguin lloc sempre als mateixos ports.
Necessitem que l'assignació dels ports sigui estàtica i després dir-li al tallafocs que deixi oberts els ports que necessitem.
Concretant, necessitarem els ports 111 2049 32765 32766 32767.



Modificacions


A
. Ports per a statd. Editem el fitxer /etc/default/nfs-common tot fent en un terminal,

sudo gedit /etc/default/nfs-common

Modifiquem la variable STATDOPTS i la deixem de la seguent manera:

STATDOPTS="-p 32765 -o 32766"

D'aquesta manera assignem un port de sortida i un port d'entrada (listening).


B. Port per a mountd. Editem el fitxer  /etc/default/nfs-kernel-server

sudo gedit  /etc/default/nfs-kernel-server

Modifiquem la variable RPCMOUNTDOPTS de la següent manera:

RPCMOUNTDOPTS="-p 32767"

Amb aquests canvis és suficient (recordeu d'obrir els ports en el tallafocs).
Reiniciar NFS per a validar els canvis fent:

sudo /etc/init.d/nfs-kernel-server restart




SEGURETAT

Per incrementar la seguretat del sistema NFS, seguirem una serie de passos.

Restringir l'accés dels daemons. Per a aquest pròposit, editem el fitxer hosts.deny

sudo gedit /etc/hosts.deny

i afegim:

portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL


De tota manera activar l'opció

ALL: PARANOID

ens dona la màxima seguretat.

Editem també el fitxer hosts.allow per a permetre l'accés a tota la LAN a la que pertanyem

portmap:192.168.1.0/255.255.255.0
lockd:192.168.1.0/255.255.255.0
rquotad:192.168.1.0/255.255.255.0
mountd:192.168.1.0/255.255.255.0
statd:192.168.1.0/255.255.255.0


o només a certes màquines:

portmap: 192.168.1.1 , 192.168.1.2
lockd: 192.168.1.1 , 192.168.1.2
rquotad: 192.168.1.1 , 192.168.1.2
mountd: 192.168.1.1 , 192.168.1.2
statd: 192.168.1.1 , 192.168.1.2


Reiniciar NFS per a validar els canvis fent:

sudo /etc/init.d/nfs-kernel-server restart




Si necessiteu resoldre algun dubte, poseu-vos en contacte a través d'aquest enllaç.