Staram się zrozumieć, dlaczego wszystkie serwery FTP wymagają użycia zakresu portów dla kanałów danych w trybie pasywnym, a nie tylko jednego portu danych dla wszystkich połączeń z kanałami danych przychodzących.
Serwery FTP obsługują wielu jednocześnie podłączonych klientów na porcie 21. Serwery WWW obsługują wiele jednocześnie połączonych klientów na porcie 80. Itd.
Dlaczego więc serwer FTP nie może używać tylko jednego portu kanału danych dla wszystkich przychodzących pasywnych połączeń danych (i nadal być w stanie obsłużyć wielu jednocześnie podłączonych klientów na tym porcie, powiedzmy port 1024)?
A może to?
Chcę poznać szczegóły techniczne, dlaczego nie jest to możliwe lub nie jest zalecane.
Odpowiedzi:
To będzie szalone przypuszczenie, ponieważ go nie testowałem, powinieneś spróbować sam i sprawdzić, czy są jakieś inne problemy, które mogłem przeoczyć.
Przypuszczam , że możesz ograniczyć zakres portów pasywnych do jednego portu . W rzeczywistości można zobaczyć w tym pytaniu, że w praktyce wykorzystywane są małe zakresy portów . Teoretycznie do obsługi wielu równoczesnych połączeń potrzebne są tylko 4 wartości: lokalny adres IP, lokalny port, zdalny adres IP, zdalny port są unikalne. W ten sposób rozróżniasz różne połączenia.
Jeśli zablokujesz port na serwerze do jednej pojedynczej wartości, jedyną pozostałą zmienną jest port używany przez klienta. Nie stanowi to problemu, o ile klient ma wystarczająco dużą pulę wolnych portów efemerycznych do wyboru. O ile nie powoduje to ciężkiego NAT, nie musisz się o to martwić. Ostrzegamy, że będzie to czysto teoretyczna sprawa : jeśli używałeś wielu portów na swoim serwerze, możesz pomnożyć liczbę hipotetycznych równoczesnych połączeń, włączając
number of ports in range
połączenia na jeden port po stronie klienta. Ale tak się nie stanie w praktyce, ponieważ wątpię, aby istniała jakaś implementacja klienta FTP, która by to obsługiwała (ponieważ nie ma to większego sensu). Dodatkowo, jeśli klient musi udostępniać swoje efemeryczne porty w ten sposób i nie może po prostu otworzyć nowego, to ma o wiele poważniejsze problemy do rozwiązania. Tak więc z tej perspektywy powinieneś być całkowicie bezpieczny używając jednego portu.Zastanówmy się, dlaczego pojedynczy port może być niewystarczający .
Przede wszystkim mógłbym wymyślić sytuację, w której naprawdę błędna implementacja serwera FTP używa wyłącznie lokalnego numeru portu jako sposobu identyfikacji transferu danych klienta. Po raz kolejny nie sądzę, żeby zrobił to porządny FTPd.
Prawdziwy problem ( tak, można zignorować wszystko powyżej jako główną dygresję ;-)) polega na tym, że pasywny zakres portów znajduje się w zakresie nieuprzywilejowanym .
Oznacza to, że wybrany numer portu nie jest zarezerwowany per se , i w rzeczywistości każdy proces użytkownika (nie potrzebuje uprawnień roota ) może go pobrać, zanim zrobi to serwer FTP. Jeśli masz dużą pulę portów do wyboru, po prostu wybierz losowy, wolny. Jeśli musisz użyć jedynego, który jest już używany, nie będziesz w stanie poprawnie obsługiwać przelewów.
Przepraszamy, jeśli odpowiedź wydaje się zbyt spekulacyjna. Szczerze mówiąc, bardzo starałem się znaleźć powód, dla którego nie powinieneś używać jednego portu, a poza ostatnim nie mogłem wymyślić żadnych twardych dowodów przeciwko temu. Niemniej jednak stawiasz interesujące i trudne pytanie.
źródło
FTP opiera się na dwóch osobnych połączeniach, jednym dla strumienia sterującego lub polecenia, a drugim dla przekazywania plików danych i innych informacji, takich jak listy katalogów. Strumień kontrolny jest przenoszony przez tradycyjne połączenie TCP. Klient łączy się z wysokim nieuprzywilejowanym portem i wysyła żądanie połączenia do serwera FTP, który jest powiązany z portem 21. To połączenie służy do przekazywania poleceń.
W trybie Port lub aktywny klient informuje serwer, na którym drugorzędnym, nieuprzywilejowanym porcie będzie nasłuchiwał. Serwer następnie inicjuje połączenie danych z portu 20 do nieuprzywilejowanego portu określonego przez klienta.
Tryb pasywny, nowszy mechanizm, jest domyślny, gdy klient jest przeglądarką internetową. Zamiast przywiązania do portu 20, serwer mówi klientowi, którego wysokiego portu użyć do przesyłania danych. Dane są następnie przesyłane przez nieuprzywilejowane porty między klientem a serwerem.
Aby uzyskać więcej informacji, zobacz:
http://tools.ietf.org/html/rfc959
EDYTOWAĆ
Jeśli chodzi o blokowanie serwera na konkretnym pojedynczym porcie, może być możliwe na niektórych serwerach. Na przykład w vsftpd masz następujące opcje konfiguracji.
Jeśli ustawisz oba porty na takie same, np. Pasv_max_port = 12345, pasv_min_port = 12345, możesz być w stanie uzyskać to, czego szukasz. Podejrzewam, że ograniczy to liczbę jednoczesnych sesji FTP obsługiwanych przez serwer. Sprawdź, aby się upewnić.
źródło
Serwer FTP może być w stanie dopasować połączenie portu danych klienta do połączenia portu kontrolnego na podstawie samego źródłowego adresu IP, a nie na podstawie użytego numeru portu.
Spowodowałoby to uszkodzenie FXP (co może nie być złą rzeczą), gdy klient łączy się z dwoma serwerami (jeden w trybie pasywnym), a następnie po otrzymaniu informacji PORT serwera pasywnego przekazuje ją do serwera trybu aktywnego jako polecenie PORT, dzięki czemu jest aktywny serwer trybu łączy się z serwerem trybu pasywnego.
I podejrzewam, że wiele serwerów nie tworzą gniazdo danych dopóki klient żąda trybu pasywnego. W takim przypadku, jeśli dwóch klientów zażąda jednocześnie trybu pasywnego, utworzone gniazda będą wymagały unikalnych numerów portów.
EDYCJA : wymyślono inny powód, dla którego serwery FTP tego nie robią: serwer nie mógł odróżnić wielu użytkowników o tym samym adresie IP.
źródło
Na portach 21 lub 80 (jak na wszystkich dobrze znanych portach) istnieje ustawiony protokół, którego klient używa, aby powiedzieć, czego chce. W ten sposób serwer wie, z czym się łączysz. Na porcie połączenia danych nie ma protokołu. Wszystko, co serwer wie - jedyne, co jest unikalne w tym połączeniu - to numer portu, z którym się łączysz.
Jeśli za każdym razem łączysz się z tym samym portem, serwer nie byłby w stanie stwierdzić, z którego pliku się łączysz. Numer portu służy jako łącze między żądaniem przesłania połączenia sterującego a połączeniem danych.
Gdyby dwóch klientów zażądało transferu w tym samym czasie, gdy serwer akceptuje połączenie na jednym porcie, serwer nie byłby w stanie powiedzieć, który plik ma zostać przesłany. Oczywiście, serwer może użyć adresu IP klienta do podjęcia decyzji (w rzeczywistości wiele serwerów FTP sprawdza, czy adres IP klienta odpowiada adresowi IP użytemu w połączeniu kontrolnym, dla bezpieczeństwa).
Ale to nie zadziała dla:
Zobacz także Ponowne użycie połączeń danych FTP .
źródło
Nie widziałem tego tutaj wspomnianego, więc wrzucę to. Przypisanie zakresu portów miało być rodzajem funkcji bezpieczeństwa, w której nie można było monitorować jednego portu pod kątem ruchu danych, dane zostały wysłane na losowym porcie w zakres, którego nie można łatwo ustalić. Bezpieczeństwo dzięki niejasnościom.
źródło
Wygląda na to, że już wiesz o portach kontrolnych i portach danych, więc przejdę do sedna sprawy. Porty kontrolne są z natury komunikacją przerywaną, podobnie jak port 80 dla stron internetowych. mogą obsłużyć wiele różnych żądań (nie jednocześnie, ale cholernie blisko, ponieważ są tak szybkie do spełnienia). z drugiej strony porty danych to miejsce, w którym magia dzieje się z FTP. Jeśli ograniczysz się do jednego portu danych, jednorazowo odbywa się tylko jeden transfer danych. rozważ duży transfer plików. Przy otwartym pojedynczym porcie danych żadne inne dane nie mogą się przenieść, dopóki transfer nie zostanie ukończony. Oznacza to, że podczas przesyłania drugi użytkownik nie będzie mógł nawet wyświetlić zawartości katalogu w folderze ftp. Pewnie będą mogli się zalogować, ale ich zachowanie będzie takie samo, jakby porty danych w ogóle nie były otwarte. Jeśli nie masz nic przeciwko, pojedynczy port będzie dla ciebie świetny. Należy pamiętać, że niektórzy klienci ftp (domyślam się 1 od razu) domyślnie konfigurują wiele połączeń w jednej sesji do pobrania. Dlatego dla tego klienta w scenariuszu z jednym portem rozważ transfer wsadowy 1 dużego pliku i 4 małych plików.
Klient inicjuje przesyłanie pierwszego dużego pliku, cały przystojniak. Następnie, podczas transferu, rozpoczyna się drugi plik. Nie ma kości. Następnie trzeci, również zilch (termin techniczny). Na koniec dziennik powinien pokazywać 1 udane i 4 nieudane transfery. Obejściem byłoby ograniczenie klienta do pojedynczego połączenia na sesję i dobrze byś poszedł (zakładając, że ktoś inny nie dostał stopy w drzwi, jeden mikrosekundowy transfer zostaje zakończony, a inny jeszcze się nie rozpoczął. )
źródło