Por que o modo passivo FTP requer um intervalo de portas em oposição a apenas uma porta?

34

Estou lutando para entender por que todos os servidores FTP exigem o uso de um intervalo de portas para canais de dados no modo passivo, em vez de usar apenas uma porta de dados para todas as conexões de canal de dados de entrada.

Os servidores FTP lidam com muitos clientes conectados simultaneamente na porta 21. Os servidores Web lidam com muitos clientes conectados simultaneamente na porta 80. Etc.

Por que um servidor FTP não pode usar apenas uma porta de canal de dados para todas as conexões de dados passivas recebidas (e ainda conseguir lidar com muitos clientes conectados simultaneamente nessa porta, por exemplo, porta 1024)?

Ou pode?

Estou interessado em conhecer os detalhes técnicos sobre por que isso não é possível ou não é recomendado.

Kurt
fonte
11
Isso pode lhe interessar: w3.org/Protocols/rfc959
Matt Simmons
11
Obrigado Matt. Sim, li a maior parte do rfc 959, mas sinto que não fui capaz de obter uma resposta clara disso para o que estava pensando. A resposta de Karol Piczak é mais o tipo de informação que eu estava procurando.
Kurt

Respostas:

20

uma explicação clara e técnica sobre o problema de várias sessões simultâneas de FTP ao bloquear a porta de dados em apenas uma porta é o que mais me interessa conhecer em profundidade. Quando pode funcionar, quando não funciona, por que não é recomendado, etc.

Este será um palpite, já que eu não testei, você deve tentar por si mesmo e verificar se há outros problemas que talvez eu tenha esquecido.

Suponho que você possa limitar o intervalo de portas passivas a uma única porta . De fato, você pode ver nesta pergunta que pequenos intervalos de portas são usados ​​na prática . Teoricamente, para oferecer suporte a várias conexões simultâneas, você só precisa dos 4 valores: IP local, porta local, IP remoto, porta remota para ser exclusivo. É assim que você discerne entre diferentes conexões.

Se você bloquear a porta do servidor em um único valor, a única variável restante será a porta usada pelo cliente. Isso não é um problema, desde que o cliente tenha um pool grande o suficiente de portas efêmeras livres para escolher. A menos que esteja fazendo um NAT pesado, você não precisa se preocupar com isso. Agora, esteja avisado de que isso será puramente teórico : se você usou várias portas no servidor, pode multiplicar o número de conexões simultâneas hipotéticas ativandonumber of ports in rangeconexões por uma porta do lado do cliente. Mas isso não acontecerá na prática, pois duvido que exista alguma implementação de um cliente FTP que suporte isso (porque não faz muito sentido). Além disso, se o cliente tiver que compartilhar suas portas efêmeras dessa maneira e não puder simplesmente abrir uma nova, ele terá problemas muito mais graves. Portanto, dessa perspectiva, você deve estar totalmente seguro usando uma única porta.

Vamos pensar por que uma única porta pode não ser suficiente .

Antes de tudo, eu poderia me deparar com uma situação em que uma implementação de servidor FTP realmente incorreta usa apenas o número da porta local como uma maneira de identificar a transferência de dados do cliente. Mais uma vez, acho que nenhum FTPd decente faria isso.

O problema real ( sim, você pode desconsiderar tudo acima como uma digressão principal ;-)) é que o intervalo de portas passivas está em um intervalo não privilegiado .

Isso significa que o número da porta selecionada não é reservado em si e, de fato, qualquer processo do usuário (não precisa de privilégios de root ) pode obtê-lo antes do servidor FTP. Se você tem um conjunto abundante de portas para escolher, basta pegar uma gratuita e aleatória. Se você for obrigado a usar o único e ele já estiver sendo usado, não poderá lidar com as transferências corretamente.

Desculpe, se a resposta parece um pouco especulativa. Para ser sincero, tentei muito encontrar uma razão pela qual você não deveria usar uma única porta e, além da última parte, não consegui pensar em nenhuma evidência concreta contra ela. No entanto, uma pergunta interessante e desafiadora que você coloca.

Karol J. Piczak
fonte
Entre, sinta-se à vontade para comentar sobre pontos perdidos e inconsistências aqui. Mesmo eu, sinto como se estivesse dando uma resposta simples - sim, você pode. ;-)
Karol J. Piczak
Muito obrigado Karol! Este é o tipo de informação que eu estava procurando (e realmente não havia encontrado em nenhum outro lugar). Meu principal motivo para fazer essa pergunta é que quero saber se é seguro configurar um servidor FTP no Windows Azure e bloquear o modo passivo em apenas uma porta (já que o Azure limita os pontos de extremidade). Eu tentei, funciona e, com suas informações, também me sinto seguro em fazê-lo. No entanto, o único problema que resta é que o balanceador de carga do Azure interrompe a conexão de controle após 1 minuto durante a transferência de arquivos (porque está ocioso), por isso estou trabalhando em um túnel TCP com keep alive para corrigi-lo.
Kurt
11
Acredito que a verdadeira razão é que o protocolo do canal de dados não possui informações de identificação. O servidor sabe apenas qual arquivo está sendo transferido de qual cliente, com base no número da porta.
Monstieur 25/10
4

O FTP conta com duas conexões separadas, uma para o fluxo de controle ou comando e outra para transmitir os arquivos de dados e outras informações, como listagens de diretório. O fluxo de controle é transportado por uma conexão TCP tradicional. O cliente liga-se a uma porta alta sem privilégios e envia uma solicitação de conexão ao servidor FTP, que está vinculado à porta 21. Essa conexão é usada para passar comandos.

No modo Porta ou ativo, o cliente informa ao servidor em qual porta secundária privilegiada ele escutará. O servidor inicia a conexão de dados da porta 20 para a porta não privilegiada especificada pelo cliente.

O modo passivo, um mecanismo mais recente, é o padrão quando o cliente é um navegador da web. Em vez de estar vinculado à porta 20, o servidor informa ao cliente qual porta alta usar para transferência de dados. Os dados são então transmitidos por portas não privilegiadas entre o cliente e o servidor.

Para mais detalhes, consulte:

http://tools.ietf.org/html/rfc959

EDITAR

Quanto ao bloqueio do servidor para uma porta única específica, pode ser possível em alguns servidores. Por exemplo, no vsftpd, você tem as seguintes opções de configuração.

   pasv_max_port
          The maximum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

   pasv_min_port
          The minimum port to allocate for PASV style data connections. Can be used to specify a narrow port range to assist firewalling.

          Default: 0 (use any port)

Se você definir as duas portas da mesma forma, por exemplo, pasv_max_port = 12345, pasv_min_port = 12345, poderá conseguir o que procura. Eu suspeito que isso limitará o número de sessões simultâneas de FTP suportadas pelo servidor. Por favor, teste para ter certeza.

dmourati
fonte
11
Obrigado pela sua resposta. No entanto, o que estou interessado em saber é por que, no modo passivo, o servidor ftp não pode dizer a todos os clientes para usar a mesma porta para o canal de dados (por exemplo, porta 1024) em vez de fornecer a cada cliente uma porta aleatória de um intervalo de portas especificado? Quais são os motivos técnicos, se houver, por que especificar apenas uma porta de dados na configuração do intervalo de portas do servidor FTP não é possível ou recomendado? Eu acho que um servidor ftp poderia lidar com muitas / muitas conexões simultâneas, mesmo em apenas uma porta de canal de dados, não?
Kurt
11
Porque o FTP é o diabo e precisa finalmente morrer. : D
11
Obrigado pela sua edição no que diz respeito ao bloqueio do servidor em uma única porta específica. Na verdade, pensei sobre esse método (e é isso que desejo realizar), mas o que não entendo direito é por que isso limitaria o número de sessões simultâneas de FTP que o servidor pode suportar. O que exatamente impede o servidor de suportar várias sessões simultâneas de FTP neste caso? Como qualquer servidor FTP obviamente suporta várias conexões simultâneas na porta 21, por que não também na porta 12345, tirada do seu exemplo? Vou ter que testar isso com mais profundidade.
Kurt
Pode não limitar o número de conexões simultâneas. Realmente depende de como o servidor controla as conexões em várias sessões. Experimente!
Dmourati
btw, terei de esperar marcando qualquer resposta como resposta aceita, porque uma explicação clara e técnica com relação à questão de várias sessões simultâneas de FTP ao bloquear a porta de dados em apenas uma porta é o que mais me interessa conhecer em profundidade. Quando se pode trabalhar, quando é que ele não funciona, por que ele não pode ser recomendada, etc.
Kurt
1

Um servidor FTP pode conseguir corresponder a conexão da porta de dados do cliente à conexão da porta de controle com base apenas no IP de origem, e não no número da porta usada.

Isso quebraria o FXP (que pode não ser uma coisa ruim), onde o cliente se conecta a dois servidores (um no modo passivo) e, depois de receber as informações PORT do servidor passivo, passa isso para o servidor no modo ativo como um comando PORT, para que servidor de modo se conecta ao servidor de modo passivo.

Eu suspeito que muitos servidores não criar o socket de dados até que o cliente solicita o modo passivo. Nesse caso, se dois clientes solicitassem o modo passivo ao mesmo tempo, os soquetes criados precisariam de números de porta exclusivos.

EDIT : pensou em outra razão pela qual os servidores FTP não fazem isso: o servidor não conseguiu distinguir vários usuários com o mesmo endereço IP.

DerfK
fonte
Obrigado. Acho que o que não entendo é por que esses soquetes do canal de dados exigiriam uma porta exclusiva (no servidor) se dois ou mais clientes solicitassem o modo passivo ao mesmo tempo? Porque eu estou pensando, obviamente, dois ou mais clientes podem estar conectados à porta 21 ao mesmo tempo. Por que não dizer a porta 1024 (para o canal de dados) ao mesmo tempo? Eu sinto isso pode ser uma pergunta estúpida, mas minha renúncia é que eu fui acordado por muito tempo já :)
Kurt
O soquete em si precisa ser exclusivo. Você pode criar um soquete escutando em uma porta e aceitar quantas conexões desejar desse soquete ou criar um soquete por usuário em portas diferentes e aceitar uma conexão de cada soquete. Se você projetou o servidor para trabalhar com um soquete por usuário, basicamente reescreveu tudo para alterá-lo ao contrário e, no final, as pessoas em hosts compartilhados ou atrás do mesmo endereço IP não conseguiriam conectar-se ao mesmo tempo, porque não havia como diferenciar suas conexões de dados.
DerfK
Obrigado. Sou grato por todas as respostas que recebi sobre o assunto e acho que estou começando a entender o assunto agora.
Kurt
0

Nas portas 21 ou 80 (como em todas as portas conhecidas), existe um protocolo definido, que o cliente usa para dizer o que deseja. Dessa forma, o servidor sabe para o que você está se conectando. Na porta de conexão de dados, não há protocolo. Tudo o que o servidor sabe - a única coisa única nessa conexão - é o número da porta à qual você se conecta.

Se você se conectasse à mesma porta todas as vezes, o servidor não seria capaz de dizer para qual arquivo você está se conectando. O número da porta serve como um link entre uma solicitação de transferência na conexão de controle e uma conexão de dados.

Se dois clientes solicitarem uma transferência ao mesmo tempo, quando o servidor aceitar uma conexão em uma única porta, o servidor não poderá informar qual arquivo transferir. Obviamente, o servidor pode usar um IP do cliente para a decisão (na verdade, muitos servidores FTP validam que o IP do cliente corresponde ao IP usado na conexão de controle, por segurança).

Mas isso não funcionaria para:

  • Várias conexões da mesma máquina (a maioria dos clientes FTP suporta transferências / filas paralelas).
  • Conexão de máquinas diferentes na mesma rede (corporativa), como aquelas com o mesmo IP externo.

Consulte também a reutilização de conexões de dados FTP .

Martin Prikryl
fonte
-1

Eu não vi isso mencionado aqui, então vou incluí-lo. A atribuição do intervalo de portas era para ser um tipo de recurso de segurança, onde você não podia monitorar uma porta para o tráfego de dados, os dados eram enviados em uma porta aleatória em o intervalo, que não pôde ser facilmente determinado. Segurança através da obscuridade.

Grantnoturbus
fonte
11
Você tem alguma referência para esta reivindicação?
Martin Prikryl
-2

Parece que você já sabe sobre portas de controle e portas de dados, então vou direto ao ponto. As portas de controle são uma comunicação intermitente por natureza, assim como a porta 80 para sites. eles podem lidar com muitas solicitações diferentes (não simultaneamente, mas muito perto, pois são muito rápidos para concluir). as portas de dados, por outro lado, são onde a mágica acontece com o FTP. Se você se limitar a uma única porta de dados, apenas uma transferência de dados acontece por vez. considere uma grande transferência de arquivos. Com uma única porta de dados aberta, nenhum outro dado pode se mover até que a transferência seja concluída. Isso significa que, durante a transferência, um segundo usuário nem será capaz de listar o conteúdo do diretório da pasta ftp. Certamente eles poderão fazer login com êxito, mas o comportamento deles será o mesmo como se as portas de dados não estivessem abertas. Se você está bem com isso, uma única porta funcionará muito bem para você. Lembre-se de que alguns clientes ftp (posso pensar em 1 logo de cara) por padrão configuram várias conexões em uma única sessão para download. Portanto, para esse cliente, em um cenário de porta única, considere uma transferência em lote de 1 arquivo grande e 4 arquivos pequenos.

O cliente inicia a transferência para o primeiro arquivo grande, tudo em grande escala. Então, enquanto essa transferência estiver em andamento, ele inicia um segundo arquivo. Sem dados. Em seguida, o terceiro, também zilch (termo técnico). No final, o log deve mostrar 1 transferências bem-sucedidas e 4 com falha. A solução seria limitar o cliente a uma única conexão por sessão e você estaria pronto (supondo que outra pessoa não entrasse na porta, no mesmo microssegundo uma transferência é concluída e a outra ainda não foi iniciada. )

Andrew
fonte
2
O que? Isso está completamente incorreto. Um soquete TCP é definido pelas quatro tuplas (IP de origem, porta de origem, porta de destino, IP de destino). Muitos soquetes TCP podem ser criados e atendidos simultaneamente a partir da mesma porta de destino: mapeamento de IP. O processo do servidor FTP pode servir dados dois e de qualquer número de clientes de rede ao mesmo tempo.
EEAA 27/04