Servidor de arquivos NFS

O que é

O Network File System ou NFS para os íntimos, é um software que cria um repositório remoto de arquivos na máquina(host) onde está instalado, configurado e funcionando.

A grosso modo, ele é um belo de um pen drive remoto.

Como funciona

O NFS libera e exporta para clientes cadastrados, através da porta 2049, uma pasta escolhida durante a configuração do NFS.

Assim computadores(clientes) podem associar uma pasta local, e está pasta conterá os arquivos da pasta do servidor após realizado o mount com sucesso.

O mount é o processo de “credenciamento” do cliente para manipular os arquivos.

Para realizar o mount é usado o rpcbind que escuta a porta 111, e informa em qual porta aleatória o rpc.mountd está escutando, então a requisição é repassada ao rpc.mountd que faz seu trabalho.

Como segurança é essencial, aconselho a fixar uma única porta ao rpc.mountd, tornando-o previsível, permitindo liberar no firewall uma porta específica para ele.

Resumindo:

O cliente envia uma solicitação de mount e o rpcbind verifica se o IP está liberado, quais permissões foram liberadas a ele e devolve com a confirmação.

Se positivo o cliente pode manipular os arquivos na pasta pelo NFS daemon, a manipulação ocorre como se fosse uma manipulação local, porém, tudo é sincronizado no servidor.

Configuração do servidor

Meu exemplo é Linux Ubuntu, porque fiz nele e é isso.

1- Liberação de portas

Liberar a porta 2049 para o NFS

ufw allow 2049/tcp
ufw allow 2049/udp

Liberar a porta para rpcbind

ufw allow 111/tcp
ufw allow 111/udp

Liberar a porta para rpc.mountd

ufw allow <porta-rpc.mountd>/tcp
ufw allow <porta-rpc.mountd>/udp

2- Instalação e preparação

apt install nfs-kernel-server
mkdir -p <caminho da pasta>
chmod -R 777 <caminho da pasta>
sudo chown nobody:nogroup <caminho da pasta>
sudo systemctl status rpcbind

3- Configurar arquivos

3.1- Criar uma permissão de mount

Consultar configurações possíveis

echo "<caminho da pasta> <IP específico ou *>(<permissões do mount>)" >> /etc/exports


// Exemplo:
// echo "<caminho da pasta> *(rw,sync,no_root_squash,subtree_check)" >> /etc/exports
//

3.2 – Fixar uma porta para o rpc.mountd no NFS

echo 'RPCMOUNTDOPTS="--port <porta-rpc.mountd>"'>> /etc/default/nfs-kernel-server


// Exemplo:
// echo 'RPCMOUNTDOPTS="--port 782"'>> /etc/default/nfs-kernel-server
//

3.3 – Fixar uma porta para o rpc.mountd

mkdir -p /etc/systemd/system/nfs-mountd.service.d

echo '[Service]
      ExecStart=
      ExecStart=/usr/sbin/rpc.mountd --port <porta-rpc.mountd>' >> /etc/systemd/system/nfs-mountd.service.d/override.conf


// Exemplo:
// echo '[Service]
      ExecStart=
      ExecStart=/usr/sbin/rpc.mountd --port 782' >> /etc/systemd/system/nfs-mountd.service.d/override.conf

4- Iniciar tudo

exportfs -ra
sudo systemctl start nfs-kernel-server
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart nfs-mountd

Como usar

No meu caso, o client vai ser um sistema MacOS. Logo, pode ser que algo fique ligeiramente diferente em outros OS.

Após configurado o servidor, em outra máquina verifique se tudo está liberado e peça o mount.

showmount -e <IP-do-servidor>

O retorno esperado é a pasta liberada

Verifique a conexão com a porta 2049

nc -zv <IP-do-servidor> 2049
//poderia usar o telnet também..

O retorno esperado é:

Connection to <IP-do-servidor> port 2049 [tcp/nfsd] succeeded!

Criar o mount

mkdir <caminho-da-pasta-local>
sudo mount -t nfs -o resvport <IP-do-servidor>:<pasta-exportada> <caminho-da-pasta-local>

Nenhum retorno é esperado.

Desfazer o mount

sudo umount <caminho-da-pasta-local>

Nenhum retorno é esperado.


Manual de permissões

Opções de configuração para uma liberação de cliente no etc/exports

Opções de acesso

  • ro: apenas leitura
  • rw: leitura e escrita

Controle de permissões

  • no_root_squash: permite que o root do cliente atue como root no servidor na pasta compartilhada (CUIDADO, inseguro na maioria dos casos)
  • root_squash: mapeia o root do cliente para o usuário anônimo no servidor (default)
  • all_squash: mapeia todos os usuários para o anônimo
  • anonuid=UID: define o UID do usuário anônimo
  • anongid=GID: define o GID do grupo anônimo

Desempenho e consistência

  • sync: escreve no disco imediatamente (mais seguro, padrão recomendado)
  • async: pode armazenar em cache antes de escrever (mais rápido, mas menos seguro)
  • wdelay: (default) aguarda para agrupar escritas
  • no_wdelay: escreve imediatamente, útil com async

Controle de subdiretórios

  • subtree_check: verifica se o arquivo está dentro da árvore exportada (default)
  • no_subtree_check: desativa essa checagem (mais rápido, evita erros se diretórios forem renomeados)

Controle de acesso por IP

  • insecure: permite conexões de portas não privilegiadas (>1024)
  • secure: só aceita conexões de portas <1024 (default)

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *