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.
Respostas:
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 ativando
number of ports in range
conexõ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.
fonte
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.
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.
fonte
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.
fonte
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:
Consulte também a reutilização de conexões de dados FTP .
fonte
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.
fonte
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. )
fonte