Riscos de usar o modo FTP ativo em vez do modo passivo

1

Em um servidor estou usando um script Perl que está programado para baixar regularmente alguns arquivos usando FTP de outro servidor. Infelizmente, há algum problema no módulo FTP do Perl que faz com que o script falhe e termine inesperadamente de tempos em tempos. Descobri que este problema pode ser facilmente resolvido mudando do modo passivo para o modo ativo.

Se eu entendi a diferença entre esses dois modos FTP corretamente, usar o modo ativo significa que eu preciso abrir um determinado intervalo de portas dentro do meu firewall. Eu presumo que isso vem com alguns riscos de segurança. Então, minha pergunta é se há alguma solução alternativa ou uma boa prática para que eu possa usar o modo ativo no meu servidor de uma forma que não cause riscos adicionais.

    
por NumberFour 18.07.2011 / 20:23

3 respostas

6

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.

    
por 18.07.2011 / 20:53
1

Com o modo ativo, o cliente conecta-se ao servidor na porta 21 para um canal de controle e, quando um download é iniciado, o cliente começa a escutar em um soquete com um número de porta aleatório acima de 1024.

Para permitir o modo ativo FTP, o firewall do cliente precisa permitir todo o tráfego de entrada acima da porta 1024, o que anula a finalidade de um firewall .

Modo passivo significa que o servidor escuta na porta 20 e o cliente inicia a conexão.

Você deve sempre usar o modo passivo com o FTP. Ou melhor ainda, não use o FTP. Se você estiver baixando um arquivo, é melhor usar o HTTP. Se você precisar fazer upload de um arquivo, ainda faça isso com HTTP (ou outro protocolo como o scp).

    
por 18.07.2011 / 20:39
1

a questão não tem nada a dever com o próprio Perl. Mais, a solução de estabelecer conexões FTP ativas em vez de conexões passivas é exatamente a prova.

Na verdade, o problema acima ocorrerá ao tentar listar o conteúdo de um diretório FTP, não ao conectar ou fazer o upload / download. Portanto, o problema está relacionado ao firewall.

Você tem que verificar se o seu firewall permite que as conexões FTP passivas passem, leia a excelente descrição do loopforever acima.

Uma captura, se estiver usando um firewall baseado em Linux, é descarregar a memória nf_conntrack_ftp.

    
por 26.09.2012 / 14:11