Dlaczego tryb pasywny FTP wymaga zakresu portów, a nie tylko jednego portu?


34

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.


1
To może Cię zainteresować: w3.org/Protocols/rfc959
Matt Simmons

1
Dzięki Matt. Tak, przeczytałem większość rfc 959, ale wydaje mi się, że tak naprawdę nie byłem w stanie uzyskać jasnej odpowiedzi na to, o czym się zastanawiałem. Odpowiedź Karola Piczaka jest raczej rodzajem informacji, której szukałem.
Kurt

Odpowiedzi:


20

jasne i techniczne wyjaśnienie dotyczące problemu wielu równoczesnych sesji FTP podczas blokowania portu danych tylko na jednym porcie jest tym, co najbardziej interesuje mnie dogłębnie. Kiedy może działać, kiedy nie działa, dlaczego może nie być zalecany itp.

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ącnumber of ports in rangepołą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.


BTW, skomentuj tutaj pominięte punkty i niespójności. Nawet ja czuję, że zastanawiam się nad prostą odpowiedzią - tak, możesz. ;-)
Karol J. Piczak

Wielkie dzięki Karol! Jest to punkt w rodzaju informacji, których szukałem (i naprawdę nie znalazłem nigdzie indziej). Głównym powodem, dla którego zadałem to pytanie, jest to, że chcę wiedzieć, czy można bezpiecznie skonfigurować serwer FTP w systemie Windows Azure i zablokować tryb pasywny tylko do 1 portu (ponieważ platforma Azure ogranicza punkty końcowe). Próbowałem, to działa, a dzięki twoim informacjom czuję się bezpiecznie, aby to zrobić. Pozostaje jednak tylko problem: moduł równoważenia obciążenia platformy Azure porzuca połączenie sterujące po 1 minucie podczas przesyłania plików (ponieważ jest bezczynny), więc pracuję w tunelu TCP, aby utrzymać go przy życiu, aby to naprawić.
Kurt

1
Uważam, że prawdziwym powodem jest to, że protokół kanału danych nie ma informacji identyfikujących. Serwer wie tylko, który plik jest przesyłany z którego klienta na podstawie numeru portu.
Monstieur

4

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.

   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)

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ć.


1
Dzięki za odpowiedź. Jednak chcę wiedzieć, dlaczego w trybie pasywnym serwer ftp nie może powiedzieć wszystkim klientom, aby korzystali z tego samego portu dla kanału danych (na przykład portu 1024), zamiast dawać każdemu klientowi losowy port z określony zakres portów? Jakie są ewentualne przyczyny techniczne, dla których podanie tylko jednego portu danych w konfiguracji zakresu portów serwera FTP nie jest możliwe lub zalecane? Myślałem, że serwer ftp może obsłużyć wiele / wiele jednoczesnych połączeń nawet na jednym porcie kanału danych, prawda?
Kurt

1
Ponieważ FTP jest diabłem i musi w końcu umrzeć. : D

1
Dziękujemy za edycję dotyczącą zablokowania serwera na konkretnym pojedynczym porcie. Właściwie myślałem o tej metodzie (i właśnie to chcę osiągnąć), ale nie do końca rozumiem, dlaczego ograniczyłoby to liczbę jednoczesnych sesji FTP obsługiwanych przez serwer. Co dokładnie uniemożliwiłoby serwerowi obsługę wielu jednoczesnych sesji FTP w tym przypadku? Ponieważ każdy serwer FTP oczywiście obsługuje wiele jednoczesnych połączeń na porcie 21, dlaczego więc nie na porcie 12345, wzięty z twojego przykładu? Będę musiał przetestować to bardziej szczegółowo.
Kurt

Nie może ograniczać liczby jednoczesnych połączeń. To naprawdę zależy od tego, jak serwer śledzi połączenia w wielu sesjach. Spróbuj!
dmourati

btw będę musiał poczekać z zaznaczeniem dowolnej odpowiedzi jako zaakceptowanej, ponieważ jasne i techniczne wyjaśnienie dotyczące problemu wielu jednoczesnych sesji FTP podczas blokowania portu danych tylko jednego portu jest tym, co najbardziej interesuje mnie dogłębnie. Kiedy może działać, kiedy nie działa, dlaczego nie może być zalecany itp.
Kurt

1

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.


Dzięki. Chyba nie rozumiem, dlaczego te gniazda kanałów danych wymagają unikalnego portu (na serwerze), jeśli dwóch lub więcej klientów zażąda trybu pasywnego w tym samym czasie? Bo myślę, że dwóch lub więcej klientów można oczywiście podłączyć jednocześnie do portu 21, więc dlaczego nie powiedzieć portu 1024 (dla kanału danych) w tym samym czasie? Wydaje mi się, że to głupie pytanie, ale zrzekam się tego, że nie śpię już zbyt długo :)
Kurt

Samo gniazdo musi być unikalne. Możesz utworzyć jedno gniazdo nasłuchujące na porcie i zaakceptować tyle połączeń, ile chcesz z tego jednego gniazda, lub możesz utworzyć jedno gniazdo na użytkownika na różnych portach i zaakceptować jedno połączenie z każdego gniazda. Jeśli zaprojektowałeś serwer do pracy z jednym gniazdem na użytkownika, to zasadniczo przepisujesz wszystko, aby zmienić go na odwrót, a na końcu osoby na hostach współdzielonych lub za tym samym adresem IP nie będą w stanie łączą się w tym samym czasie, ponieważ nie byłoby sposobu rozróżnienia połączeń danych.
DerfK,

Dzięki. Jestem wdzięczny za wszystkie odpowiedzi, które otrzymałem na ten temat i myślę, że zaczynam sobie z tym radzić.
Kurt

0

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:

  • Wiele połączeń z tego samego komputera (większość klientów FTP obsługuje równoległe transfery / kolejki).
  • Połączenie z różnych komputerów w tej samej (korporacyjnej) sieci, ponieważ mają one ten sam zewnętrzny adres IP.

Zobacz także Ponowne użycie połączeń danych FTP .


-1

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.


1
Czy masz jakieś odniesienia do tego roszczenia?
Martin Prikryl

-2

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ął. )


2
Co? To jest całkowicie niepoprawne. Gniazdo TCP jest zdefiniowane przez 4-krotkę (źródłowy adres IP, port źródłowy, port docelowy, docelowy adres IP). Wiele gniazd TCP może być tworzonych i obsługiwanych jednocześnie z tego samego portu docelowego: mapowanie IP. Proces serwera FTP może obsługiwać dane dwa i od dowolnej liczby klientów sieciowych jednocześnie.
EEAA
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.