Em poucas palavras:
- Conexões FTP consistem em dois fluxos: comando (controle) e dados
- Quando um soquete é aberto e o código não se liga explicitamente a uma porta, o SO consumirá uma porta numerada alta em seu intervalo de portas efêmeras (
sysctl -a | grep ip_local_port_range
) - Processos não raiz devem usar portas > 1024
FTP no modo ativo
O cliente se conecta ao servidor pela porta 21 e estabelece um fluxo de comando:
client:32198 -> server:21
O cliente deve enviar ou receber alguns dados, por isso informa ao servidor para se conectar a ele em alguma porta. Para fazer isso, ele envia um comando PORT semelhante a este:
PORT 1,2,3,4,5,6
Este é o cliente que informa ao servidor que o servidor pode se conectar de volta ao cliente (no endereço 1.2.3.4 na porta (5 * 256) + 6 = 1286.
server:20 -> client:1286
Normalmente, é aí que você vê as sessões FTP do modo ativo morrerem; com respeito a firewalls e balanceadores de carga, o tráfego normalmente fluindo do cliente - > o servidor é esperado, mas as conexões iniciadas pelo servidor para o cliente geralmente são negadas (os balanceadores de carga geralmente são inteligentes o suficiente para associar esse fluxo de dados ao fluxo de comando existente).
Seu entendimento sobre a necessidade de abrir um intervalo de portas em seu firewall para facilitar esse comportamento está absolutamente correto.
FTP no modo passivo
Nesse cenário, o cliente estabelece uma sessão de comando como antes:
client:56221 -> server:21
Mas quando os dados são comunicados, o cliente envia uma primitiva de comando PASV
. O servidor responde com uma combinação IP: Port que o cliente deve conectar novamente (em um formato semelhante à solicitação PORT
anterior. Assim, o cliente se conecta ao servidor da seguinte forma:
client:12347 -> server:4566
Isso ignora os problemas de firewall descritos acima para o modo ativo porque as conexões são estabelecidas de maneira tradicional e esperada.
A desvantagem do modo passivo é que ele consome mais soquetes no servidor. A emissão frequente de primitivas PASV
em um ambiente altamente carregado pode levar ao esgotamento de portas. (Sockets permanecerão em um estado TIME_WAIT
por algum período de tempo definido pelo sistema operacional (~ 2 minutos eu acho nos sistemas Redhat).
Sobre o seu problema
A menos que você esteja realmente sofrendo de problemas de exaustão de porta, é altamente incomum que o modo passivo falharia e o modo ativo seria mais frequentemente bem-sucedido. Geralmente é o contrário. Se você puder postar mais sobre os erros que você recebe ocasionalmente, podemos depurá-lo ainda mais.
Eu recomendaria usar o modo passivo sempre que possível e, portanto, eu recomendaria investigar as falhas específicas do modo passivo para encontrar a causa raiz do problema antes de admitir o uso do FTP no modo ativo.