Ich habe einen FTP-Server, der den passiven Servermodus unterstützt (mit dem PASV-Befehl). Dies funktioniert unter Windows XP einwandfrei. Wenn ich von Windows Vista oder Windows 7 aus mit aktivierter Firewall auf diesen Server zugreifen möchte, wird die Verbindung sofort unterbrochen. Ein Reset-Paket wird an den Server gesendet und dem Socket wird signalisiert, dass der Server die Verbindung zurückgesetzt hat (was nicht stimmt).
Das Problem verschwindet, wenn die Firewall deaktiviert wird.
Verbindungen zu anderen FTP-Servern funktionieren einwandfrei. Der Unterschied besteht darin, dass die Antwort des Servers auf PASV das Adressfeld nicht in Klammern einschließt. Dies ist zulässig, wie in RFC-959 und RFC-1132 dokumentiert.
Wie kann ich die Firewall konfigurieren, um dieses schädliche Verhalten zu unterbinden?
Antwort1
Ich glaube nicht, dass die Klammern schuld sind.
Ich würde eher denken, dass der von diesem Server zugewiesene dynamische Portbereich nicht mit Vista/7 übereinstimmt.
Eine Erörterung dieses Themas finden Sie in diesem Artikel:
Der standardmäßige dynamische Portbereich für TCP/IP hat sich in Windows Vista und Windows Server 2008 geändert.
Um den dynamischen Portbereich für IPv4 auf Ihrem Computer anzuzeigen, verwenden Sie den folgenden Befehl:
netsh int ipv4 show dynamicport tcp
Um den dynamischen Portbereich für TCP festzulegen, verwenden Sie beispielsweise:
netsh int ipv4 set dynamicport tcp start=1024 num=30000
Weitere Befehle sind im obigen Artikel beschrieben.
EDIT: Bitte beachten Sie, dass die Windows-Firewall möglicherweise intelligent genug ist, um einen in der PASV-Antwort angegebenen dynamischen Port zu öffnen, auch wenn dieser Port nicht in den Standardbereich für dynamische Ports fällt. Es kann jedoch sein, dass sie immer noch nicht intelligent genug ist, um die Antwort ohne die Klammern zu verstehen. Es lohnt sich möglicherweise, die Möglichkeit zu prüfen, den Standardbereich für dynamische Ports zu erweitern.
Antwort2
Das erinnert mich an ein Problem, das ich mit Java und FTP unter Windows 7 hatte.
Letztendlich handelte es sich um einen Fehler in der Firewall von Microsoft bei FTP-, Passivmodus- und IPv6-Verbindungen (die Adresse musste nicht IPv6 sein, die Software, die die Verbindung herstellte, tat dies lediglich über den IPv6-Stapel).
Das in Ihrer Frage beschriebene Symptom scheint diesem Problem sehr ähnlich zu sein, daher werde ich hier einen Link dazu angeben und es zusammenfassen (auch wenn diese Frage nichts mit Java zu tun hat, kann die Lösung dieselbe sein).
Eine Zusammenfassung einiger dort erwähnter Lösungen:
- Microsoft-Hotfix:http://support.microsoft.com/kb/2754804
- Versuchen Sie, Ihren FTP-Client unter Vista/7 mit einem IPv4-Stack zum Laufen zu bringen (ist möglicherweise möglich, muss aber nicht)
- Deaktivieren Sie Stateful FTP der Windows-Firewall
netsh advfirewall set global StatefulFTP disable
(hierdurch werden allerdings FTP-Verbindungen im nicht-passiven Modus deaktiviert, die Ihre Firewall durchdringen).
Antwort3
Sie können die Firewall nicht konfigurieren, da sie einfach fehlerhaft ist.
Sofern Sie den FTP-Server nicht so umstellen können, dass er die Port-Angaben in Klammern mitsendet, weil dies bei alten Geräten im Feld eingebaut ist, benötigen Sie einen speziellen Client mit folgendem Verhalten.
Dieser Client muss TYPE I
unmittelbar vor jedem PASV
Befehl einen Befehl senden, um die Firewall in einem vernünftigen Zustand zu halten. Wenn Sie eine nicht-binäre Übertragung benötigen, können Sie den Parameter des TYPE-Befehls ändern.