Debugando Pure-FTPd travado na mensagem de boas-vindas em cPanel/OVH#
Durante a manutenção de um servidor VPS sob cPanel utilizando o Pure-FTPd como daemon FTP, encontrei uma falha clássica de infraestrutura: o cliente FTP (como o FileZilla) estabelecia a conexão TCP inicial com sucesso, mas ficava travado indefinidamente na seguinte etapa:
Estado: Conexão estabelecida, esperando mensagem de boas-vindas...
Nesse cenário, o socket TCP é aberto corretamente (o handshake de três vias SYN -> SYN/ACK -> ACK é concluído), mas o banner de aplicação do protocolo (ex: 220 Welcome to Pure-FTPd) não alcança o cliente. Este artigo apresenta o diagnóstico sistemático por camadas, cobrando auditoria de serviço, logs, portas passivas, CSF, firewall de borda do provedor, TLS/SSL e rede local.
1) Backup preventivo das configurações#
Antes de realizar modificações nas configurações do Pure-FTPd ou regras do firewall CSF, faça backup das definições locais:
# Fazer backup das configurações locais do Pure-FTPd
cp /var/cpanel/conf/pureftpd/local /var/cpanel/conf/pureftpd/local.bak.$(date +%Y%m%d)
# Fazer backup das configurações do firewall CSF
cp /etc/csf/csf.conf /etc/csf/csf.conf.bak.$(date +%Y%m%d)
# OU criar um arquivo compactado tar com todos os arquivos críticos
tar czf /root/ftp-backup-$(date +%Y%m%d).tar.gz /var/cpanel/conf/pureftpd/ /etc/csf/csf.conf
2) Status do serviço e auditoria de logs#
Antes de analisar o firewall, valide se o Pure-FTPd está em execução, ouvindo nas portas padrão e respondendo localmente.
# 1. Verificar o status do daemon via systemd
systemctl status pure-ftpd
# 2. Obter a identificação de processos (PIDs) ativos do Pure-FTPd
ps aux | grep pure-ftpd
pgrep -c pure-ftpd
# 3. Validar escuta da porta de controle 21 em sockets IPv4 e IPv6
ss -lntp | grep ":21"
ss -lntp6 | grep ":21"
# 4. Verificar o status do SELinux (comum em Rocky/AlmaLinux/RHEL)
sestatus
Se o serviço estiver ativo, teste a resposta local usando o loopback de rede para descartar bloqueios de firewalls externos. Como o utilitário telnet não é instalado por padrão em distribuições modernas, utilize o nc (netcat) ou curl para inspecionar o banner de aplicação:
# Testar conexão local direta ao banner do FTP usando netcat (nc)
echo "QUIT" | nc -w 5 127.0.0.1 21
# Alternativa via curl conectando ao protocolo FTP
curl -v ftp://127.0.0.1/ --connect-timeout 5
(Se o banner 220 Welcome to Pure-FTPd aparecer localmente mas falhar externamente, o gargalo está na rede, TLS ou firewall intermediário. Se falhar localmente, a causa está nas configurações locais, recursos do daemon ou políticas restritivas do SELinux).
Inspecione os logs do FTP e do cPanel para encontrar erros de conexões e timeouts. Em distribuições baseadas em systemd (como Rocky 8+ ou Ubuntu 20.04+), o arquivo /var/log/messages pode não estar presente; nesses casos, utilize o journalctl:
# Consultar os logs do daemon FTP no systemd
journalctl -u pure-ftpd --since "1 hour ago"
# Ler as últimas linhas do arquivo de log estático (se ativo no syslog)
tail -100 /var/log/pure-ftpd.log
grep -i "error\|refused\|timeout" /var/log/pure-ftpd.log | tail -20
# Consultar logs de erros do cPanel relativos ao FTP
tail -100 /usr/local/cpanel/logs/error_log | grep -i ftp
3) Conflitos de serviços e alocação de recursos#
É essencial verificar se não existem múltiplos daemons de FTP concorrentes tentando se vincular à porta 21, ou arquivos de configurações de outros servidores (como vsftpd ou proftpd) gerando colisões de sockets:
# Buscar outros processos de servidores FTP em execução
ps aux | grep -E "vsftpd|proftpd|pure-ftpd" | grep -v grep
# Listar qualquer arquivo de configuração residual de outros daemons
ls -la /etc/vsftpd* /etc/proftpd* 2>/dev/null
Falhas no envio do banner também podem ser provocadas por falta de espaço físico em disco ou inodes esgotados no servidor, o que impede a escrita de arquivos temporários de sessão:
# Inspecionar o espaço livre nas partições do sistema
df -h
# Verificar o limite e uso de inodes do disco
df -i
# Validar espaço específico nos diretórios temporários e de spool do cPanel
df -h /var/cpanel
df -h /tmp
4) Configuração de portas passivas e auditoria do CSF#
O FTP em modo passivo exige um intervalo de portas abertas para tráfego de dados. No cPanel, configure a faixa de portas de forma persistente:
# Criar ou editar o arquivo de configuração local do cPanel
nano /var/cpanel/conf/pureftpd/local
Adicione a diretiva contendo a faixa de portas altas reservadas:
PassivePortRange: 49152 65535
Reconstrua a configuração efetiva e reinicie o Pure-FTPd através dos utilitários do cPanel:
# Forçar a montagem do arquivo de configuração baseado no template local
/scripts/setupftpserver pure-ftpd --force
# Reiniciar o serviço de FTP de forma segura
/scripts/restartsrv_pureftpd
# Verificar a faixa de portas passivas configurada no cPanel
grep -i "PassivePortRange" /var/cpanel/conf/pureftpd/local
# Simular uma conexão passiva real e auditar se a resposta "Entering Passive Mode" é retornada
curl -v --ftp-pasv ftp://127.0.0.1/ --connect-timeout 5
Alinhamento no configserver security & firewall (CSF):#
Garanta que a faixa passiva e a porta 21 estejam liberadas nas diretivas de entrada (TCP_IN) e saída (TCP_OUT) no arquivo /etc/csf/csf.conf:
TCP_IN = "...,21,49152:65535"
TCP_OUT = "...,21,49152:65535"
Aplique o reload do firewall local CSF e audite seu funcionamento (testando com o IP público da estação cliente, visto que o CSF não bloqueia ou filtra conexões locais de loopback por padrão):
# Recarregar as regras do CSF
csf -r
# Validar se o CSF está ativo e qual sua versão
csf -v
# Listar as primeiras regras de tráfego ativas
csf -l | head -20
# Consultar se há bloqueios ao IP público de testes
csf -g $(curl -s ifconfig.me)
# Verificar se o IP de testes foi bloqueado na lista de negação
grep "21" /etc/csf/csf.deny | head -5
5) Auditoria do TLS/SSL do FTP#
Se o servidor forçar o uso de FTPS (FTP sobre TLS) e houver falhas de certificados ou incompatibilidade de cifras criptográficas, a conexão travará antes do banner.
# Verificar o nível de exigência de criptografia TLS configurado
cat /etc/pure-ftpd/conf/TLS
# Auditar as permissões e o arquivo de certificado PEM do Pure-FTPd
ls -la /etc/ssl/private/pure-ftpd.pem
# Verificar a validade e datas do certificado ativo
openssl x509 -in /etc/ssl/private/pure-ftpd.pem -noout -dates
Teste a negociação TLS diretamente a partir do terminal local usando o comando (passando o comando QUIT via pipe para evitar que o cliente trave aguardando input manual após o handshake):
# Iniciar conexão segura de controle e disparar o comando STARTTLS de forma não interativa
echo "QUIT" | openssl s_client -connect 127.0.0.1:21 -starttls ftp -quiet
6) Redes e provedores externos (OVH, AWS, etc.)#
Em instâncias hospedadas em nuvem ou VPS (como OVH, AWS EC2, Azure), existe uma camada de firewall externa antes do host Linux (Security Groups, ACLs ou Firewalls de Rede de Borda).
A liberação das portas passivas (49152:65535) e de controle (21) deve ser feita tanto no CSF (firewall interno do Linux) quanto nas regras do painel do provedor de infraestrutura.
No caso específico da OVH, o Network Firewall (disponível na aba "IP" ou "Network" do painel de administração da OVH) atua como um filtro ativo de borda. Se as regras passivas não estiverem explicitamente liberadas ali para o IP do seu servidor, os pacotes de dados serão dropados silenciosamente na borda do provedor, mesmo que o CSF local esteja 100% aberto.
Verificação de interfaces de rede e conectividade externa:#
# Inspecionar as interfaces e IPs vinculados ao host
ip addr show
# Auditar a tabela de roteamento local
ip route show
# Validar se o IP público detectado corresponde ao IP do painel do provedor
curl -s ifconfig.me
# Consultar o DNS Reverso (rDNS) do IP público do servidor
dig -x $(curl -s ifconfig.me) +short
# Enviar pacotes ICMP externos para testar a latência do link
ping -c 3 $(curl -s ifconfig.me)
Testes com clientes FTP alternativos sem exposição de credenciais:#
# 1. Testar conexão usando o cliente lftp de forma segura usando variável de ambiente
LFTP_PASSWORD="${FTP_PASSWORD}" lftp -u "${FTP_USER}" ftp://$(curl -s ifconfig.me)
# 2. Testar conexão via curl utilizando arquivo temporário .netrc (seguro contra bisbilhoteiros de processos)
echo "machine $(curl -s ifconfig.me) login ${FTP_USER} password ${FTP_PASSWORD}" > ~/.netrc
chmod 600 ~/.netrc
curl -v --ftp-ssl --netrc ftp://$(curl -s ifconfig.me)/
rm -f ~/.netrc
# 3. Verificar se a porta 21 está aberta externamente usando o netcat (nc)
nc -zv $(curl -s ifconfig.me) 21
Checklist: debug FTP - banner não aparece#
Utilize este roteiro de troubleshooting para triar chamados de indisponibilidade de FTP em servidores cPanel.
1. Triagem local#
- [ ] Criar backups das configurações:
/var/cpanel/conf/pureftpd/locale/etc/csf/csf.conf - [ ] Verificar espaço livre e inodes no disco (
df -h/df -i) - [ ] Validar status do daemon Pure-FTPd (
systemctl status/ss -lntp | grep :21) - [ ] Verificar se há daemons FTP concorrentes (vsftpd/proftpd) ativos na porta 21
- [ ] Testar acesso ao banner localmente de forma não interativa:
echo "QUIT" | nc -w 5 127.0.0.1 21
2. Mapeamento de firewall e portas passivas#
- [ ] Confirmar o range passivo no Pure-FTPd (
PassivePortRange: 49152 65535) - [ ] Executar setupftpserver e reiniciar o serviço FTP do cPanel
- [ ] Confirmar liberação do range passivo e porta 21 no arquivo
csf.conf - [ ] Aplicar reload do CSF (
csf -r) e checar se há bloqueios ao IP público cliente (csf -g IP) - [ ] Validar liberação do range passivo no painel de borda do provedor (Network Firewall da OVH, AWS SG, etc.)
3. Validação do canal de criptografia#
- [ ] Verificar a validade do certificado PEM do Pure-FTPd (
openssl x509) - [ ] Testar a negociação TLS local de forma não interativa:
echo "QUIT" | openssl s_client -connect 127.0.0.1:21 -starttls ftp -quiet - [ ] Testar conexões externas com lftp (usando
LFTP_PASSWORD) e curl (usando.netrc) para validar cifras e credenciais sem expô-las nops aux - [ ] Auditar políticas locais do SELinux (
sestatus//var/log/audit/audit.log)
Este artigo foi útil?
Deixe uma reação rápida para apoiar o conteúdo:
Este post está licenciado sob CC BY-NC.



Comentários
Participe da discussão abaixo.
0 comentários