Como instalar um servidor FTP no Linux com vsftpd, criar usuário só para FTP, configurar modo passivo, firewall e TLS no AlmaLinux, Rocky e Ubuntu.
O vsftpd é o servidor FTP padrão do AlmaLinux, do Rocky e do Ubuntu: leve, estável e seguro quando bem configurado. Este guia monta um servidor em que cada usuário fica preso na própria pasta, com modo passivo para funcionar atrás de firewall e com criptografia TLS.
Antes de começar
- Acesso SSH como
root(veja como acessar o SSH). - Nos exemplos, o servidor tem o IP
203.0.113.10e o usuário de FTP se chamacliente1.
1. Instale o vsftpd
# AlmaLinux e Rocky
sudo dnf install vsftpd
sudo systemctl enable --now vsftpd
# Ubuntu e Debian (o serviço já sobe ligado)
sudo apt install vsftpd
O arquivo de configuração fica em /etc/vsftpd/vsftpd.conf no AlmaLinux e no Rocky e em /etc/vsftpd.conf no Ubuntu e no Debian. Guarde uma cópia antes de mexer:
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.original # Ubuntu e Debian
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.original # AlmaLinux e Rocky
2. Configure o acesso e o modo passivo
Abra o arquivo com sudo nano e garanta que estas linhas existam uma vez só, sem o # na frente. Se a linha já existir com outro valor, altere em vez de duplicar:
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40100
anonymous_enable=NObloqueia o acesso sem senha.local_enableewrite_enabledeixam os usuários do sistema entrar e enviar arquivos.chroot_local_user=YESprende cada usuário na própria pasta, sem ver o resto do servidor. Oallow_writeable_chroot=YESpermite que essa pasta aceite gravação.- As linhas
pasv_fixam a faixa de portas do modo passivo, que precisa ser liberada no firewall.
Se o servidor está atrás de NAT (IP interno na placa e IP público no roteador), acrescente pasv_address=203.0.113.10 com o IP público. Não use espaço antes ou depois do =: o vsftpd recusa o arquivo.
Reinicie para aplicar:
sudo systemctl restart vsftpd
3. Crie um usuário só para FTP
O usuário abaixo entra no FTP mas não abre terminal no SSH, porque usa o shell nologin:
sudo useradd -m -s /usr/sbin/nologin cliente1
sudo passwd cliente1
O vsftpd só aceita usuários cujo shell esteja listado em /etc/shells. Acrescente o nologin uma única vez:
grep -qx /usr/sbin/nologin /etc/shells || echo /usr/sbin/nologin | sudo tee -a /etc/shells
O usuário cai na pasta /home/cliente1. Para que ele trabalhe direto na pasta de um site, crie o usuário com -d /var/www/site no lugar do -m e ajuste o dono da pasta com sudo chown -R cliente1: /var/www/site.
4. Libere as portas no firewall
# AlmaLinux e Rocky (firewalld)
sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --permanent --add-port=40000-40100/tcp
sudo firewall-cmd --reload
# Ubuntu (ufw)
sudo ufw allow 21/tcp
sudo ufw allow 40000:40100/tcp
Com CSF, acrescente 21 e 40000:40100 em TCP_IN no /etc/csf/csf.conf e rode csf -r. Problemas de FTP com o CSF estão em conexões FTP bloqueadas pelo firewall CSF.
5. Ative a criptografia TLS (recomendado)
Sem TLS, usuário, senha e arquivos trafegam em texto aberto. Gere um certificado próprio (ou use um do Let's Encrypt, se um domínio aponta para o servidor). Os caminhos padrão mudam entre as distribuições:
# Ubuntu e Debian
sudo openssl req -x509 -nodes -days 825 -newkey rsa:2048 \
-keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/certs/vsftpd.pem \
-subj "/CN=ftp.seudominio.com.br"
sudo chmod 600 /etc/ssl/private/vsftpd.key
# AlmaLinux e Rocky
sudo openssl req -x509 -nodes -days 825 -newkey rsa:2048 \
-keyout /etc/pki/tls/private/vsftpd.key -out /etc/pki/tls/certs/vsftpd.pem \
-subj "/CN=ftp.seudominio.com.br"
sudo chmod 600 /etc/pki/tls/private/vsftpd.key
Acrescente ao vsftpd.conf, com os caminhos da sua distribuição (no Ubuntu, troque as linhas rsa_ e ssl_enable que já existem no arquivo):
ssl_enable=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
force_local_logins_ssl=YES
force_local_data_ssl=YES
No AlmaLinux e no Rocky, as duas linhas rsa_ ficam rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem e rsa_private_key_file=/etc/pki/tls/private/vsftpd.key.
Reinicie com sudo systemctl restart vsftpd. No FileZilla, use Requer FTP explícito sobre TLS; no terminal, o lftp já negocia o TLS sozinho.
6. Teste
sudo ss -tlnp | grep ':21 '
lftp -u cliente1 203.0.113.10
O primeiro comando confirma que o vsftpd escuta na porta 21. O segundo, rodado de outra máquina, deve conectar e aceitar um ls. Com certificado próprio, o lftp reclama da verificação; para o teste, rode set ssl:verify-certificate no dentro dele. Veja mais em FTP pela linha de comando.
Problemas comuns
530 Login incorrect com a senha certa
Quase sempre é o shell: o usuário usa /usr/sbin/nologin, mas ele não está em /etc/shells (passo 3). Também confira se o usuário não está nas listas de bloqueio: /etc/ftpusers no Ubuntu e no Debian, /etc/vsftpd/ftpusers e /etc/vsftpd/user_list no AlmaLinux e no Rocky.
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Falta a linha allow_writeable_chroot=YES. Outra saída, mais rígida, é deixar a pasta do usuário sem permissão de escrita e criar uma subpasta para os envios.
500 OOPS: bad bool value in config file
Há espaço ao redor do = ou um valor inválido. O formato correto é opcao=YES, colado.
O login funciona, mas o ls trava ou dá 425
A faixa passiva não está liberada no firewall, ou o servidor está atrás de NAT sem o pasv_address. Revise os passos 2 e 4.
553 Could not create file
Permissão de pasta. Confira o dono com ls -ld. No AlmaLinux e no Rocky, se as permissões estão certas, o SELinux pode estar barrando: veja os booleanos com getsebool -a | grep ftpd; o ftpd_full_access libera a escrita do FTP (sudo setsebool -P ftpd_full_access on).