Eu tenho um servidor FTP que suporta o modo de servidor passivo (usando o comando PASV). Isso funciona bem com o Windows XP. Quando desejo acessar este servidor no Windows Vista ou Windows 7 com firewall ativado, sofro um desligamento imediato da conexão. Um pacote de reset é enviado ao servidor, e o soquete é sinalizado que o servidor reinicializou a conexão (o que não é verdade).
O problema desaparece quando o firewall é desativado.
As conexões com outros servidores FTP funcionam corretamente. A diferença é que a resposta do servidor ao PASV não coloca o campo de endereço entre parênteses. Isso é legal conforme documentado na RFC-959 e RFC-1132.
Como posso configurar o firewall para impedir esse mau comportamento?
Responder1
Não creio que a culpa seja dos parênteses.
Prefiro pensar que o intervalo de portas dinâmico alocado por esse servidor discorda do Vista/7.
Para uma discussão sobre o assunto, veja este artigo:
O intervalo de portas dinâmicas padrão para TCP/IP foi alterado no Windows Vista e no Windows Server 2008
Para visualizar o intervalo de portas dinâmicas em seu computador para ipv4, use o seguinte comando:
netsh int ipv4 show dynamicport tcp
Para definir o intervalo de portas dinâmicas para TCP, use, por exemplo:
netsh int ipv4 set dynamicport tcp start=1024 num=30000
Mais comandos são descritos no artigo acima.
EDIT: Observe que o firewall do Windows pode ser inteligente o suficiente para abrir uma porta dinâmica especificada na resposta PASV, mesmo que essa porta não esteja dentro do intervalo padrão para portas dinâmicas. Mas pode ser que ainda não seja inteligente o suficiente para compreender a resposta sem os parênteses. Pode valer a pena dar uma olhada na possibilidade de estender o intervalo padrão para portas dinâmicas.
Responder2
Isso me lembra de um problema que tive com Java e FTP em execução no Windows 7.
Acabou sendo um bug do firewall da Microsoft com conexões FTP, modo passivo e IPv6 (o endereço não precisava ser IPv6, apenas o software que fazia a conexão o fazia usando a pilha IPv6).
O sintoma descrito na sua pergunta parece muito semelhante a esse problema, então vou vincular e resumir aqui (mesmo que essa pergunta não tenha nada a ver com Java, a correção pode ser a mesma)
Um resumo de algumas soluções mencionadas lá:
- Correção da Microsoft:http://support.microsoft.com/kb/2754804
- Tente fazer com que seu cliente FTP rodando no Vista/7 rode com uma pilha IPv4 (pode ser possível, pode não ser)
- Desative o FTP com estado do firewall do Windows usando
netsh advfirewall set global StatefulFTP disable
(no entanto, isso desativará as conexões FTP de modo não passivo que atravessam seu firewall)
Responder3
Você não pode configurar o firewall porque ele está cheio de bugs.
Contanto que você não possa alterar o servidor FTP para enviar as informações da porta entre parênteses porque ele está integrado em dispositivos antigos em campo, você precisará de um cliente especial com o seguinte comportamento.
Este cliente deve enviar um TYPE I
comando imediatamente antes de cada PASV
comando para manter o firewall em bom estado. Se precisar de uma transferência não binária, você pode alterar o parâmetro do comando TYPE.