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.
Antworten:
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 multiplizieren
number of ports in range
Verbindungen 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.
quelle
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.
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.
quelle
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.
quelle
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:
Siehe auch Wiederverwendung von FTP-Datenverbindungen .
quelle
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.
quelle
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). )
quelle