Linux

Roteador Linux DIY - Parte 7 - Compartilhamento de Arquivos

Esta é a sétima parte de uma série sobre como montar seu próprio roteador Linux.

Nos artigos anteriores, instalamos o sistema operacional, configuramos a funcionalidade de internet do gateway usando PPPoE, servidor DNS com unbound e configuramos recursos como Jellyfin e Nextcloud.
Agora é hora de adicionar recursos de compartilhamento de arquivos ao nosso servidor.

Compartilhamento de Arquivos
Compartilhamento de Arquivos no Macmini

Índice

Introdução

Para um Core 2 Duo antigo com dois núcleos, temos um servidor bastante funcional rodando o mais recente Kernel Linux fazendo muita coisa e com espaço para fazer mais.

Uma das funcionalidades mais solicitadas para um homelab é o compartilhamento de arquivos. Ter um servidor de Compartilhamento de Arquivos envolve algumas questões importantes, como RAID e Backup. Ninguém quer acordar de manhã com um SSD quebrado e perceber que tudo o que é importante foi perdido. Não abordamos backup e resiliência neste artigo. Apenas o Compartilhamento de Arquivos.

Requisitos

Antes de configurarmos nosso servidor de compartilhamento de arquivos, existem alguns requisitos, conforme segue:

  • Armazenamento para alocar arquivos.
  • Usuários para o compartilhamento SMB.
  • Serviço de SMB.
  • Serviço de NFS.
  • Configuração de Firewall.

Avahi-daemon

Para tornar o servidor de arquivos visível na rede, precisamos configurar avahi-daemon.
Avahi-daemon é um servidor mDNS que faz com que diferentes serviços sejam visíveis para a rede. Você pode verificar quais os serviços disponíveis na sua rede disponibilizados pelo avahi-daemon usando o comando avahi-browse -a.

/etc/nixos/modules/services.nix

{ config, pkgs, ... }:

{
  services = {
    ...
    avahi = {
      publish.enable = true;
      publish.userServices = true;
      nssmdns4 = true;
      enable = true;
    };
    ...
  };
}

Firewall para Avahi-daemon

Abra as portas para o serviço mDNS na porta 5353 e, opcionalmente, o tráfego Bonjour.

/etc/nixos/nftables/services.nft

  chain avahi_server_input {
    udp dport 5353 ct state {new, established } counter accept comment "mDNS"
  }

/etc/nixos/nftables/zones.nft

  chain LAN_INPUT {
    ...
    jump avahi_server_input
    ...
  }

Serviço de Compartilhamento de Arquivos NFS

Instale o serviço NFS. Basta ativar o serviço NFS no nosso arquivo services.nix.

/etc/nixos/modules/services.nix

{ config, pkgs, ... }:

{
  services = {
    ...
    nfs.server.enable = true;
  };
}

Criar Compartilhamentos ZFS

Como mencionado na documentação do NixOS, ZFS tem a capacidade de criar compartilhamentos NFS com a propriedade sharenfs. No meu caso, não me preocupo em filtrar IPs no serviço NFS porque todo o tráfego de rede é tratado pelo NFTables.

Vou assumir que o pool de dados foi nomeado zdata. Substitua pelo nome do seu pool de dados.

zfs create -o sharenfs="*(rw,sync,no_subtree_check,no_root_squash)" zdata/srv/Files

Crie todos os compartilhamentos que você precisar.

Firewall para ZFS

Há um conjunto de portas que precisam ser configuradas para que o NFS funcione corretamente. Vamos adicionar os serviços necessários e vinculá-los às zonas esperadas.

/etc/nixos/nftables/services.nft

  chain nfs_server_input {
    tcp dport 2049 ct state {new, established } counter accept comment "Servidor NFS"
  }

/etc/nixos/nftables/zones.nft

  chain LAN_INPUT {
    ...
    jump nfs_server_input
    ...
  }

Serviço de Compartilhamento de Arquivos SMB

O compartilhamento de arquivos do Windows é gerenciado pelo serviço SMB (Server Message Block). Vamos criar o serviço Samba para o nosso servidor.

No exemplo abaixo, faço uso do compartilhamento NFS criado anteriormente. Você pode criar compartilhamentos distintos para SMB e NFS como desejar, e também pode configurar backups do Time Machine para Macs Apple se quiser. Mais informações podem ser encontradas na Wiki do NixOS.

/etc/nixos/modules/smb.nix

{ config, pkgs, ... }:

{
  services.samba = {
    enable = true;
    securityType = "user";
    extraConfig = ''
      workgroup = WORKGROUP
      security = user
    '';

    shares = {
      "Files" = {
        path = "/srv/Files";
        browseable = true;
        readOnly = false;
        guestOk = false;
      };
    };
  };
  services.samba-wsdd.enable = true;
  environment.etc."avahi/services/samba.service".text = ''
  <?xml version="1.0" standalone='no'?>
  <!DOCTYPE service-group SYSTEM "avahi-service.dtd">
  <service-group>
    <name replace-wildcards="yes">%h</name>
    <service>
      <type>_smb._tcp</type>
      <port>445</port>
    </service>
    <service>
      <type>_device-info._tcp</type>
      <port>0</port>
      <txt-record>model=Macmini</txt-record>
    </service>
    <service>
      <type>_adisk._tcp</type>
      <txt-record>dk0=adVN=timemachine,adVF=0x82</txt-record>
      <txt-record>sys=waMa=0,adVF=0x100</txt-record>
    </service>
  </service-group>
  '';
}

Adicione o arquivo de configuração ao configuration.nix.

/etc/nixos/configuration.nix

  imports =
    [
      ...
      ./modules/smb.nix
      ... 
    ]

Persistir Senhas do SMB

O Samba gerencia suas próprias senhas persistindo os dados na pasta /var/lib/samba/private/. Se você escolher instalar o sistema de arquivos como impermanente, você precisa adicionar o caminho mencionado neste arquivo ao /etc/nixos/modules/impermanence.nix. Caso não escolha instalar o sistema de arquivos como impermanente, você pode pular este passo.

/etc/nixos/modules/impermanence.nix

  ...
  environment.persistence."/nix/persist/system" = {
    hideMounts = true;
    directories = [
      "/var/lib/nixos"
      "/var/lib/samba/private/" #Adicione este caminho. Deixe o resto do arquivo como está.
    ];
    ...
  };
  ...

Firewall para SMB

Para permitir conexões SMB e o serviço WSDD (Web Services Discovery Daemon) no nosso servidor, precisamos abrir as seguintes portas:

Portas SMB

  • TCP 139: Serviço de Sessão NetBIOS.
  • TCP 445: SMB direto sobre TCP.

Portas WSDD

  • UDP 3702: Protocolo de descoberta multicast Web Services Dynamic Discovery.

Segue a configuração:

/etc/nixos/nftables/services.nft

  chain smb_server_input {
    tcp dport 139 ct state {new, established } counter accept comment "Serviço NetBIOS SMB"
    tcp dport 445 ct state {new, established } counter accept comment "Serviço SMB sobre TCP"
  }

  chain wsdd_discovery_input {
    udp dport 3702 ct state {new, established } counter accept comment "Descoberta de serviço WSDD"
  }

/etc/nixos/nftables/zones.nft

  chain LAN_INPUT {
    ...
    jump smb_server_input
    jump wsdd_discovery_input
    ...
  }

Reconstruir a Configuração do NixOS

Por fim, reconstrua a configuração do NixOS com o comando:

sudo nixos-rebuild switch

Usuários SMB

Agora precisamos adicionar os usuários como usuários SMB para que possam acessar o servidor:

sudo smbpasswd -a username

Conclusão

Agora você pode acessar seu Servidor de Arquivos a partir de máquinas Windows e Linux.

Acesso SMB no Windows

Basta acessar o compartilhamento SMB abrindo \\[ip_do_servidor]\Files.

Acesso NFS no Linux

Use o seguinte comando para montar um compartilhamento NFS:

sudo mount -t nfs [ip_do_servidor]:/srv/Files /mnt

keywords: macmini • roteador • linux • nixos • arquivo • nas • smb • nfs • compartilhamento • compartilhamento-de-arquivos

This article in other languages