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)
Leave a Reply