02 - Modos Ativo e Passivo
video: https://youtu.be/... no frontmatter da nota.Modos Ativo e Passivo do FTP
1. Definição
O FTP (File Transfer Protocol, RFC 959) é um protocolo assimétrico de dupla conexão: utiliza uma conexão TCP persistente para controle (porta 21) e conexões TCP separadas e efêmeras para transferência de dados. A forma como a conexão de dados é estabelecida define os dois modos operacionais do FTP:
- Modo Ativo (PORT): o servidor inicia a conexão de dados em direção ao cliente.
- Modo Passivo (PASV): o cliente inicia a conexão de dados em direção ao servidor.
Essa dualidade existe porque o FTP foi projetado em 1971 (RFC 114) e reformulado em 1985 (RFC 959), quando a topologia típica era cliente com IP público se conectando diretamente a servidor com IP público — sem NAT, sem firewall pessoal, sem CGNAT. A proliferação de NAT e firewalls stateful a partir dos anos 1990 tornou o modo ativo problemático, e o modo passivo tornou-se o padrão de fato em clientes modernos.
Comparação Rápida
| Característica | Modo Ativo | Modo Passivo |
|---|---|---|
| Comando | PORT |
PASV |
| Quem inicia dados | Servidor → Cliente | Cliente → Servidor |
| Porta dados (servidor) | 20 (fixa) | Alta efêmera |
| Porta dados (cliente) | Informada no comando | Aleatória local |
| Atravessa NAT cliente | Não (na maioria) | Sim |
| Atravessa firewall servidor | Sim | Requer config de range |
| Padrão em clientes | Não | Sim |
2. Modo Ativo (PORT)
No modo ativo, o cliente FTP envia o comando PORT informando o endereço IP e porta em que está escutando. O servidor então abre uma conexão TCP de sua porta 20 em direção àquele endereço/porta do cliente.
Sintaxe do Comando PORT
O formato é PORT h1,h2,h3,h4,p1,p2, onde h1.h2.h3.h4 é o IP e a porta é p1*256 + p2:
C: PORT 192,168,0,10,4,1
S: 200 PORT command successful
Isso informa: "estou escutando em 192.168.0.10:1025" (4*256+1=1025). O servidor conectará de sua porta 20 para 192.168.0.10:1025.
Fluxo da Conexão (Modo Ativo)
Cliente (192.168.0.10) Servidor (203.0.113.5)
| -- TCP SYN --> 203.0.113.5:21 ---->|
|<-- SYN-ACK (controle estabelecido) |
| -- USER, PASS, PORT 192,168,0,10,4,1 -->|
|<-- 200 PORT command successful |
|<-- TCP SYN da porta 20 p/ 1025 ----| (servidor inicia dados)
|<-- ACK (canal de dados estabelecido)|
|<-- dados do arquivo (LIST, RETR) ---|
Problemas do Modo Ativo
- NAT no cliente: o cliente informa seu IP privado (
192.168.0.10), inválido na internet. NATs com ALG (Application Layer Gateway) podem reescrever o comandoPORT, mas é frágil. - Firewall no cliente: deve aceitar conexões TCP entrantes em portas altas (1024-65535). Em estações Windows/Mac com firewall pessoal, requer regra explícita.
- Incompatível com CGNAT: o cliente atrás de CGNAT do provedor (comum em 4G/5G) nunca é alcançável do exterior.
- Inseguro: o cliente abre portas em escuta, expondo superfície de ataque.
3. Modo Passivo (PASV)
No modo passivo, o cliente envia PASV e o servidor responde com o IP e porta em que ele próprio está escutando. O cliente então abre a conexão de dados em direção ao servidor.
Sintaxe da Resposta PASV
C: PASV
S: 227 Entering Passive Mode (203,0,113,5,195,80).
Isso indica: "conecte-se em 203.0.113.5:50000" (195*256+80=50000). O cliente abre conexão TCP de uma porta local aleatória para 203.0.113.5:50000.
Fluxo da Conexão (Modo Passivo)
Cliente (192.168.0.10) Servidor (203.0.113.5)
| -- TCP SYN --> 203.0.113.5:21 ---->|
| -- USER, PASS, PASV -------------->|
|<-- 227 (203,0,113,5,195,80) |
| -- TCP SYN --> 203.0.113.5:50000 ->| (cliente inicia dados)
|<-- ACK (canal de dados estabelecido)|
| -- RETR arquivo.txt --------------->|
|<-- dados do arquivo ----------------|
Vantagens do Modo Passivo
- Compatível com NAT no cliente: o cliente só faz conexões saintes, que NATs stateful permitem naturalmente.
- Funciona em CGNAT: o cliente só precisa de conectividade sainte (HTTP-like), sem portas entrantes.
- Padrão moderno: todos os clientes (FileZilla, lftp, curl, browsers) usam passivo por padrão.
Desafios no Servidor
O servidor precisa abrir portas altas entrantes para o cliente conectar. Exige configurar range de portas passivas (pasv_min_port=40000, pasv_max_port=50000 no vsftpd), abrir esse range no firewall do servidor e, em NAT do servidor, configurar pasv_address para o IP público e encaminhar o range de portas. Em firewalls stateful, FTP ALG pode reescrever IPs do PASV, mas isso quebra com FTPS/SFTP.
Configuração típica no vsftpd:
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=50000
pasv_address=203.0.113.5
pasv_addr_resolve=NO
4. Modo Passivo Estendido (EPSV)
Definido na RFC 2428, EPSV (Extended Passive Mode) é a versão IPv6-friendly do PASV. Em vez de incluir o IP na resposta (problemático para IPv6 e NAT), usa formato simplificado que pressupõe o mesmo IP do canal de controle:
C: EPSV
S: 229 Entering Extended Passive Mode (|||50000|)
Os separadores | indicam que o endereço é o mesmo da conexão de controle. Companheiro do EPRT (Extended PORT) para modo ativo em IPv6, suportado por todos os servidores e clientes modernos.
5. Tabelas de Fluxo Comparativo
Conexões Envolvidas
| Modo | Conexão dados (origem) | Conexão dados (destino) |
|---|---|---|
| Ativo | Servidor:20 | Cliente:porta_informada no PORT |
| Passivo | Cliente:porta_alta | Servidor:porta_alta (do range) |
Cenários e Recomendação
| Cenário | Modo | Motivo |
|---|---|---|
| Cliente atrás de NAT residencial | Passivo | Cliente só faz conexões saintes |
| Cliente em rede 4G/5G (CGNAT) | Passivo | CGNAT não permite conexões entrantes |
| Servidor em datacenter com IP público | Passivo | Mais simples para clientes externos |
| Servidor atrás de NAT (raro) | Ativo ou Passivo com ALG | Requer encaminhamento de portas |
| Cliente Unix via CLI legado | Ativo | ftp tradicional assume ativo |
| Cliente moderno (FileZilla, lftp) | Passivo (padrão) | Compatibilidade universal |
6. Configuração por Cliente
FileZilla
Configurações → Conexão → FTP → Modo de transferência: Passivo (recomendado).
lftp (~/.lftp/rc)
set ftp:passive-mode on
set ftp:use-mdtm off
curl
curl -P - ftp://servidor/arquivo.txt # Forçar ativo
curl ftp://servidor/arquivo.txt # Passivo (padrão)
curl --ftp-method singlecwd ftp://[2001:db8::1]/arquivo # EPSV (IPv6)
Cliente ftp BSD/Linux legado
ftp> passive
Passive mode: on; fallback to active mode: off.
ftp> ls
wget usa modo passivo por padrão desde a versão 1.8.
7. Diagnóstico de Problemas Comuns
| Sintoma | Causa Provável | Solução |
|---|---|---|
Login OK, mas ls trava |
Firewall bloqueando dados (ativo com NAT) | Trocar para modo passivo |
| Conexão recusada em porta alta | Range passivo fechado no firewall | Abrir pasv_min_port-pasv_max_port |
425 Can't open data connection |
Servidor não conecta ao cliente (ativo) | Usar passivo |
500 Invalid PORT command |
NAT não reescreveu IP privado | Usar passivo ou configurar ALG |
| Lista em IPv4 mas falha em IPv6 | Cliente envia PORT em vez de EPRT |
Forçar EPSV/EPRT |
Inspeção com tcpdump e ALG
tcpdump -ni eth0 'port 21 or (port >= 40000 and port <= 50000)'
modprobe nf_conntrack_ftp
iptables -A FORWARD -m conntrack --ctstate RELATED -m helper --helper ftp -j ACCEPT
8. Boas Práticas
| Prática | Recomendação |
|---|---|
| Modo padrão cliente | Passivo |
| Range passivo no servidor | Limitar a 1000-2000 portas |
| NAT do servidor | masquerade_address (ProFTPD) ou pasv_address (vsftpd) com IP público |
| ALG no firewall | Desativar se FTPS/SFTP em uso (ALG quebra TLS) |
| Log de conexões | xferlog_enable=YES, log_ftp_protocol=YES |
| Timeout dados | data_connection_timeout=300 |
| IPv6 | Habilitar EPSV/EPRT em dual-stack |
| Substituição | Migrar para SFTP/FTPS sempre que possível |
9. Conclusão
A dualidade ativo/passivo do FTP é consequência direta do design de 1971, que pressupunha topologia sem NAT e IPs roteáveis globalmente. O modo ativo (PORT) obriga o servidor a conectar-se ao cliente, incompatível com NAT, CGNAT e firewalls pessoais modernos. O modo passivo (PASV) inverte a lógica — o cliente conecta-se ao servidor — e tornou-se o padrão universal em clientes modernos. Em ambientes IPv6 ou complexos, EPSV/EPRT (RFC 2428) oferecem versão limpa do protocolo. Ainda assim, a complexidade de dois canais TCP e a dificuldade de firewalls stateful rastrearem a porta dinâmica tornam o FTP cada vez mais obsoleto frente ao SFTP (porta 22, canal único SSH) e HTTPS.