Warum erfordert der passive FTP-Modus einen Portbereich anstelle nur eines Ports?

34

Ich kämpfe, um zu verstehen , warum alle FTP-Server die Verwendung eines Portbereichs für Datenkanäle im passiven Modus erfordern, anstatt nur einen Datenport für alle eingehenden Datenkanalverbindungen zu verwenden.

FTP-Server verarbeiten viele gleichzeitig verbundene Clients an Port 21. Webserver verarbeiten viele gleichzeitig verbundene Clients an Port 80. usw.

Warum kann ein FTP-Server dann nicht nur einen Datenkanalport für alle eingehenden passiven Datenverbindungen verwenden (und dennoch viele gleichzeitig verbundene Clients an diesem Port verarbeiten, z. B. Port 1024)?

Oder kann es?

Ich interessiere mich für die technischen Details, warum dies nicht möglich ist oder nicht empfohlen wird.

Kurt
quelle
1
Dies könnte Sie interessieren: w3.org/Protocols/rfc959
Matt Simmons
1
Vielen Dank, Matt. Ja, ich habe das meiste von RFC 959 gelesen, aber ich habe das Gefühl, dass ich keine klare Antwort darauf bekommen habe, worüber ich mich wunderte. Die Antwort von Karol Piczak ist eher die Art von Information, nach der ich gesucht habe.
Kurt

Antworten:

20

Eine klare und technische Erklärung in Bezug auf das Problem mehrerer gleichzeitiger FTP-Sitzungen beim Sperren des Datenports auf nur einen Port ist das, woran ich am meisten interessiert bin. Wann kann es funktionieren, wann wird es nicht funktionieren, warum kann es nicht empfohlen werden, etc.

Dies wird eine wilde Vermutung sein, da ich es nicht getestet habe. Sie sollten es selbst ausprobieren und sehen, ob es noch andere Probleme gibt, die ich möglicherweise übersehen habe.

Ich nehme an, Sie könnten den passiven Portbereich auf einen einzelnen Port beschränken . Tatsächlich können Sie in dieser Frage sehen, dass in der Praxis kleine Portbereiche verwendet werden . Theoretisch müssen zur Unterstützung mehrerer gleichzeitiger Verbindungen nur die vier Werte angegeben werden: lokale IP, lokaler Port, entfernte IP, entfernter Port , um eindeutig zu sein. So können Sie zwischen verschiedenen Verbindungen unterscheiden.

Wenn Sie den Port auf Ihrem Server auf einen einzelnen Wert beschränken, bleibt nur der vom Client verwendete Port als Variable übrig. Dies ist kein Problem, solange der Client über einen ausreichend großen Pool an freien ephemeren Ports verfügt, aus denen er auswählen kann. Sie müssen sich keine Gedanken darüber machen, es sei denn, es macht etwas schweres NAT. Seien Sie gewarnt, dies wird nur theoretischer Natur sein : Wenn Sie mehrere Ports auf Ihrem Server verwendet haben, können Sie die Anzahl der hypothetischen gleichzeitigen Verbindungen durch Aktivieren multiplizierennumber of ports in rangeVerbindungen pro Port clientseitig. In der Praxis wird dies jedoch nicht passieren, da ich bezweifle, dass es eine Implementierung eines FTP-Clients gibt, die dies unterstützt (da dies wenig sinnvoll ist). Wenn der Kunde seine kurzlebigen Ports auf diese Weise freigeben muss und nicht einfach einen neuen öffnen kann, hat er schwerwiegendere Probleme. Aus dieser Perspektive sollten Sie also mit einem einzigen Port absolut sicher sein.

Lassen Sie uns überlegen, warum ein einzelner Port möglicherweise nicht ausreicht .

Zuallererst könnte ich auf eine Situation kommen, in der eine wirklich fehlerhafte FTP-Server-Implementierung ausschließlich die lokale Portnummer verwendet, um die Client-Datenübertragung zu identifizieren. Auch hier denke ich, dass kein anständiger FTPd dies tun würde.

Das eigentliche Problem ( ja, Sie können alles oben als großen Exkurs ignorieren ;-)) ist, dass der passive Portbereich in einem nicht privilegierten Bereich liegt .

Dies bedeutet, dass die von Ihnen ausgewählte Portnummer nicht per se reserviert ist und tatsächlich jeder Benutzerprozess (der keine Root- Rechte benötigt) sie abrufen kann, bevor Ihr FTP-Server dies tut. Wenn Sie über eine große Auswahl an Ports verfügen, greifen Sie einfach zu einem zufälligen freien Port. Wenn Sie nur die eine verwenden müssen und diese bereits verwendet wird, können Sie die Übertragungen nicht ordnungsgemäß verarbeiten.

Sorry, wenn die Antwort etwas zu spekulativ erscheint. Um ehrlich zu sein, habe ich mich sehr bemüht, einen Grund zu finden, warum Sie nicht einen einzigen Port verwenden sollten, und mir fiel, abgesehen vom letzten, kein schwerer Beweis dafür ein. Trotzdem eine interessante und herausfordernde Frage, die Sie stellen.

Karol J. Piczak
quelle
Übrigens, zögern Sie nicht, verpasste Punkte und Unstimmigkeiten hier zu kommentieren. Sogar ich selbst habe das Gefühl, als würde ich mich auf eine einfache Antwort beschränken - ja, das kannst du. ;-)
Karol J. Piczak
Vielen Dank, Karol! Dies ist genau die Information, nach der ich gesucht habe (und die ich wirklich nirgendwo anders gefunden hatte). Der Hauptgrund für diese Frage ist, dass ich wissen möchte, ob es sicher ist, einen FTP-Server in Windows Azure einzurichten und den passiven Modus auf nur einen Port zu beschränken (da Azure die Endpunkte beschränkt). Ich habe es versucht, es funktioniert, und mit Ihren Informationen fühle ich mich auch sicher, es zu tun. Das einzige verbleibende Problem ist jedoch, dass der Azure-Lastenausgleich die Steuerungsverbindung nach 1 Minute während der Dateiübertragung trennt (da sie inaktiv ist). Daher arbeite ich an einem TCP-Tunnel mit Keep Alive, um dies zu beheben.
Kurt
1
Ich glaube, der wahre Grund ist, dass das Datenkanalprotokoll keine identifizierenden Informationen enthält. Der Server weiß nur anhand der Portnummer, welche Datei von welchem ​​Client übertragen wird.
Monstieur
4

FTP ist auf zwei separate Verbindungen angewiesen, eine für den Steuerungs- oder Befehlsstrom und eine für die Übergabe der Datendateien und anderer Informationen wie Verzeichnislisten. Der Steuerstrom wird über eine herkömmliche TCP-Verbindung übertragen. Der Client bindet an einen hochprivilegierten Port und sendet eine Verbindungsanforderung an den FTP-Server, der an Port 21 gebunden ist. Über diese Verbindung werden Befehle weitergeleitet.

Im Port- oder Aktivmodus teilt der Client dem Server mit, auf welchem ​​sekundären, nicht privilegierten Port er empfangsbereit ist. Der Server initiiert dann die Datenverbindung von Port 20 zu dem nicht privilegierten Port, den der Client angegeben hat.

Der passive Modus, ein neuerer Mechanismus, ist die Standardeinstellung, wenn der Client ein Webbrowser ist. Anstatt an Port 20 gebunden zu sein, teilt der Server dem Client mit, welcher High-Port für die Datenübertragung verwendet werden soll. Die Daten werden dann über nichtprivilegierte Ports zwischen Client und Server übertragen.

Weitere Einzelheiten finden Sie unter:

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

BEARBEITEN

Das Sperren des Servers an einen bestimmten einzelnen Port ist bei einigen Servern möglicherweise möglich. In vsftpd haben Sie beispielsweise die folgenden Konfigurationsoptionen.

   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)

Wenn Sie beide Ports auf den gleichen Wert setzen, z. B. pasv_max_port = 12345, pasv_min_port = 12345, können Sie möglicherweise feststellen, wonach Sie suchen. Ich vermute, dies wird die Anzahl der gleichzeitigen FTP-Sitzungen begrenzen, die Ihr Server unterstützen wird. Bitte testen Sie, um sicher zu sein.

dmourati
quelle
1
Danke für deine Antwort. Was mich jedoch interessiert, ist, warum der FTP-Server im passiven Modus nicht allen Clients anweisen kann, denselben Port für den Datenkanal zu verwenden (z. B. Port 1024), anstatt jedem Client einen zufälligen Port von a zuzuweisen angegebener Portbereich? Welche technischen Gründe gibt es, warum die Angabe eines einzigen Datenports in der Konfiguration des FTP-Server-Portbereichs nicht möglich oder empfohlen ist? Ich würde denken, ein FTP-Server könnte viele / viele gleichzeitige Verbindungen auch nur auf einem Datenkanal-Port verarbeiten, nicht wahr?
Kurt
1
Denn FTP ist der Teufel und muss endlich sterben. : D
1
Vielen Dank für Ihre Bearbeitung in Bezug auf das Sperren des Servers an einen bestimmten Port. Ich habe tatsächlich über diese Methode nachgedacht (und das ist, was ich erreichen möchte), aber was ich nicht ganz verstehe, ist, warum dies die Anzahl der gleichzeitigen FTP-Sitzungen begrenzen würde, die der Server unterstützen kann. Was genau würde den Server in diesem Fall davon abhalten, mehrere gleichzeitige FTP-Sitzungen zu unterstützen? Da jeder FTP-Server offensichtlich mehrere gleichzeitige Verbindungen auf Port 21 unterstützt, warum also nicht auch auf Port 12345, wie in Ihrem Beispiel gezeigt? Ich werde das genauer testen müssen.
Kurt
Die Anzahl der gleichzeitigen Verbindungen kann nicht begrenzt werden. Es hängt wirklich davon ab, wie der Server die Verbindungen über mehrere Sitzungen hinweg verfolgt. Versuch es einmal!
Dmourati
Übrigens muss ich mit dem Markieren einer Antwort als akzeptierte Antwort warten, da eine klare und technische Erklärung in Bezug auf das Problem mehrerer gleichzeitiger FTP-Sitzungen beim Sperren des Datenports auf nur einen Port das ist, woran ich am meisten interessiert bin. Wann kann es funktionieren, wann wird es nicht funktionieren, warum kann es nicht empfohlen werden, etc.
Kurt
1

Ein FTP-Server kann möglicherweise die Datenanschlussverbindung des Clients anhand der Quell-IP-Adresse und nicht anhand der verwendeten Anschlussnummer an die Steueranschlussverbindung anpassen.

Dies würde FXP unterbrechen (was möglicherweise keine schlechte Sache ist), wenn der Client eine Verbindung zu zwei Servern (einer im passiven Modus) herstellt und diese nach dem Empfang der PORT-Informationen des passiven Servers als PORT-Befehl an den Server im aktiven Modus weiterleitet, so dass sie aktiv sind Modus-Server verbindet sich mit dem passiven Modus-Server.

Ich vermute, dass viele Server den Daten-Socket erst dann erstellen, wenn der Client den passiven Modus anfordert. In diesem Fall benötigen die erstellten Sockets eindeutige Portnummern, wenn zwei Clients gleichzeitig den passiven Modus anfordern.

BEARBEITEN : Ein weiterer Grund, warum FTP-Server dies nicht tun: Der Server konnte nicht mehrere Benutzer mit derselben IP-Adresse unterscheiden.

DerfK
quelle
Vielen Dank. Ich vermute, ich verstehe nicht, warum diese Datenkanal-Sockets einen eindeutigen Port (auf dem Server) benötigen, wenn zwei oder mehr Clients gleichzeitig den passiven Modus anfordern? Weil ich denke, dass zwei oder mehr Clients gleichzeitig mit Port 21 verbunden sein können, warum also nicht Port 1024 (für den Datenkanal) gleichzeitig sagen? Ich halte das für eine dumme Frage, aber mein Haftungsausschluss ist, dass ich schon viel zu lange wach bin :)
Kurt
Die Steckdose selbst muss eindeutig sein. Sie können einen Socket erstellen, der an einem Port empfangsbereit ist, und von diesem einen Socket beliebig viele Verbindungen annehmen, oder Sie können einen Socket pro Benutzer an verschiedenen Ports erstellen und von jedem Socket eine Verbindung annehmen. Wenn Sie den Server so konzipiert haben, dass ein Socket pro Benutzer funktioniert, würden Sie im Wesentlichen alles neu schreiben, um es anders herum zu ändern, und am Ende könnten Personen auf gemeinsam genutzten Hosts oder hinter derselben IP-Adresse dies nicht Stellen Sie gleichzeitig eine Verbindung her, da die Datenverbindungen nicht voneinander getrennt werden können.
DerfK
Vielen Dank. Ich bin dankbar für all die Antworten, die ich zu diesem Thema erhalten habe, und ich glaube, ich fange an, es jetzt ziemlich gut in den Griff zu bekommen.
Kurt
0

An den Ports 21 oder 80 (wie an allen bekannten Ports) gibt es ein festgelegtes Protokoll, mit dem der Client festlegt, was er will. Auf diese Weise weiß der Server, wofür Sie eine Verbindung herstellen. Auf dem Datenverbindungsport gibt es kein Protokoll. Alles, was der Server weiß - das einzige, was an dieser Verbindung einzigartig ist -, ist die Portnummer, mit der Sie sich verbinden.

Wenn Sie jedes Mal eine Verbindung zu demselben Port herstellen, kann der Server nicht feststellen, für welche Datei Sie eine Verbindung herstellen. Die Portnummer dient als Verbindung zwischen einer Übertragungsanforderung auf der Steuerverbindung und einer Datenverbindung.

Wenn zwei Clients gleichzeitig eine Übertragung anfordern und der Server eine Verbindung über einen einzelnen Port akzeptiert, kann der Server nicht angeben, welche Datei übertragen werden soll. Natürlich könnte der Server eine Client-IP für die Entscheidung verwenden (tatsächlich bestätigen viele FTP-Server aus Sicherheitsgründen, dass die Client-IP mit der IP übereinstimmt, die für die Steuerverbindung verwendet wird).

Aber das würde nicht funktionieren für:

  • Mehrere Verbindungen von demselben Computer (die meisten FTP-Clients unterstützen parallele Übertragungen / Warteschlangen).
  • Verbindung von verschiedenen Maschinen innerhalb desselben (Unternehmens-) Netzwerks, da diese dieselbe externe IP haben.

Siehe auch Wiederverwendung von FTP-Datenverbindungen .

Martin Prikryl
quelle
-1

Ich habe das hier nicht erwähnt, daher werde ich es hier einfügen. Die Zuweisung des Portbereichs war als eine Art Sicherheitsfunktion gedacht, bei der Sie nicht einen Port auf Datenverkehr überwachen konnten. Die Daten wurden über einen zufälligen Port in gesendet der Bereich, der nicht leicht zu bestimmen war. Sicherheit durch Dunkelheit.

Grantnoturbus
quelle
1
Haben Sie eine Referenz für diese Behauptung?
Martin Prikryl
-2

Klingt so, als wüssten Sie bereits etwas über Steuer- und Datenports, sodass ich gleich zur Sache komme. Steuerports sind von Natur aus Burst-Kommunikation, genau wie Port 80 für Websites. Sie können viele verschiedene Anfragen bearbeiten (nicht gleichzeitig, aber verdammt knapp, da sie so schnell erledigt werden können). Datenports hingegen sind der Ort, an dem die Magie mit FTP geschieht. Wenn Sie sich auf einen einzelnen Datenport beschränken, erfolgt jeweils nur eine Datenübertragung. Betrachten Sie eine große Dateiübertragung. Wenn ein einzelner Datenport geöffnet ist, können keine anderen Daten verschoben werden, bis die Übertragung abgeschlossen ist. Dies bedeutet, dass ein zweiter Benutzer während der Übertragung nicht einmal den Verzeichnisinhalt des FTP-Ordners auflisten kann. Sicher, sie können sich erfolgreich anmelden, aber ihr Verhalten ist das gleiche, als ob die Datenports überhaupt nicht geöffnet wären. Wenn Sie damit einverstanden sind, Ein einziger Port ist ideal für Sie. Denken Sie daran, dass einige FTP-Clients (ich kann mir einen sofort vorstellen) standardmäßig mehrere Verbindungen innerhalb einer Sitzung zum Herunterladen einrichten. Betrachten Sie für diesen Client in einem Szenario mit einem einzelnen Port eine Stapelübertragung von 1 großen Datei und 4 kleinen Dateien.

Der Client initiiert die Übertragung für die erste große Datei, allesamt "Hunky Dory". Während der Übertragung wird dann eine zweite Datei gestartet. Kein Würfel. Dann die dritte, ebenfalls zilch (Fachbegriff). Am Ende sollte das Protokoll 1 erfolgreiche und 4 fehlgeschlagene Übertragungen anzeigen. Die Lösung wäre, den Client auf eine einzige Verbindung pro Sitzung zu beschränken, und Sie können loslegen (vorausgesetzt, jemand anderes hat in der Mikrosekunde, in der eine Übertragung abgeschlossen ist, keinen Fuß in die Tür bekommen, und eine andere hat noch nicht begonnen). )

Andrew
quelle
2
Was? Das ist völlig falsch. Ein TCP-Socket wird durch das 4-Tupel definiert (Quell-IP, Quell-Port, Ziel-Port, Ziel-IP). Viele TCP-Sockets können gleichzeitig über denselben Zielport erstellt und bereitgestellt werden: IP-Zuordnung. Der FTP-Server-Prozess kann Daten von zwei und von einer beliebigen Anzahl von Netzwerk-Clients gleichzeitig bedienen.
EEAA