FTP Erro 500 Comando de porta ilegal - o comando PORT envia um IP diferente da fonte de solicitação

1

O problema que estou enfrentando é que estou recebendo um "comando 500 PORT ilegal" Resposta de um servidor FTP ao tentar carregar um arquivo programaticamente.

Este programa é um pequeno aplicativo c # que se conecta a um site FTP e copia arquivos para o diretório padrão. Este programa está em produção há vários anos e estou confiante de que o código funciona bem. Também testei o aplicativo conectando-me ao meu próprio site FTP usando o mesmo aplicativo e ele funciona. O modo passivo não parece ser uma opção.

Ao tentar se conectar ao site FTP de nosso parceiro, o programa é executado conforme o esperado até que o comando "put" do FTP seja executado. Tenho notado ao executar o Wireshark que o IP de origem da minha solicitação é diferente do endereço IP que o comando PORT está enviando. Eu carreguei uma imagem de uma captura aqui (todas as informações confidenciais foram removidas usando minhas incríveis habilidades em photoshop):

.

Eu entrei em contato com o proprietário do site FTP onde estamos tentando transferir os arquivos e eles abriram o firewall para o novo endereço IP estático. Posso conectar-me ao site deles usando clientes FTP de máquinas em ambos os IPs da LAN, mas esses comandos PORT são sempre enviados usando o mesmo IP da LAN que a origem da solicitação. Eu também tentei usar ftp.exe do servidor onde o programa reside, e é bem-sucedido (mas o comando PORT usa o mesmo IP que a fonte).

Então eu acho que a grande questão é como eu posso controlar qual endereço IP o comando PORT usa? Ou, se eu não posso controlá-lo, como o endereço IP e a porta são determinados pelo programa ftp?

    
por Gage Trader 19.02.2013 / 19:30

1 resposta

1

Acontece que a resposta realmente tem a ver com a biblioteca FTP que eu estava usando. Eu pensei com certeza que isso não era um problema de codificação, mas depois que eu cheirei como a biblioteca está criando a solicitação, acho que encontrei a resposta.

Aqui está a seção relevante usando o ILSpy (eu coloquei o espaço em torno da linha mais importante):

private Socket CreateDataSocketActive()
{
    Socket socket = new Socket(2, 1, 6);
    IPHostEntry iPHostEntry = Dns.Resolve(Dns.GetHostName());

    IPEndPoint iPEndPoint = new IPEndPoint(iPHostEntry.get_AddressList()[0], 0);

    socket.Bind(iPEndPoint);
    socket.Listen(5);
    int port = ((IPEndPoint)socket.get_LocalEndPoint()).get_Port();
    IPAddress address = ((IPEndPoint)socket.get_LocalEndPoint()).get_Address();
    this.SetDataPort((IPEndPoint)socket.get_LocalEndPoint());
    return socket;
}

Parece que a biblioteca está criando o endpoint IP simplesmente pegando o primeiro endereço na lista de endereços IP disponíveis. Para a maioria das soluções, isso é provavelmente aceitável, mas como tenho várias NICs no meu servidor, não funciona para mim.

Sei que usando o FTP.exe, o servidor aceitará conexões de ambas as sub-redes IP da LAN, desde que o comando PORT seja emitido usando o mesmo endereço IP da LAN que a origem da solicitação.

Eu estou supondo que há algum tipo de validação feita pelo servidor FTP que compara os dois endereços para verificar se eles são os mesmos. Caso contrário, eu poderia teoricamente transferir um arquivo para algum outro dispositivo em uma rede completamente diferente, uma vez que eu fiz login no site FTP.

Agora eu só tenho que descobrir uma solução alternativa, mas isso deve ser apenas uma questão de encontrar uma nova biblioteca ou rolar a minha. Se ajudar alguém que possa ter o mesmo problema, a biblioteca que eu estava usando era com.enterprisedt.net.ftp.

    
por 20.02.2013 / 17:04