JustPaste.it

Aktywny i pasywny tryb FTP

Jedno z najczęściej zadawanych pytań związanych z zagadnieniami łączności internetowej dotyczy różnicy pomiędzy aktywnym i pasywnym trybem FTP, jak również sposobów ich obsługi.

Jedno z najczęściej zadawanych pytań związanych z zagadnieniami łączności internetowej dotyczy różnicy pomiędzy aktywnym i pasywnym trybem FTP, jak również sposobów ich obsługi.

 

Niniejszy tekst jest tłumaczeniem artykułu Active FTP vs. Passive FTP, a Definitive Explanation, którego autorem jest Jay Ribak. Tłumaczenie przygotował Michał Wojciechowski.

Spis treści:

  • Wprowadzenie
  • Podstawy
  • Aktywny tryb FTP
  • Przykład aktywnego trybu FTP
  • Pasywny tryb FTP
  • Przykład pasywnego trybu FTP
  • Podsumowanie
  • Bibliografia
  • Dodatek 1: Konfiguracja popularnych serwerów FTP

Wprowadzenie

Jedno z najczęściej zadawanych pytań związanych z firewallami i innymi zagadnieniami łączności internetowej dotyczy różnicy pomiędzy aktywnym i pasywnym trybem FTP, jak również sposobów ich obsługi. Mam nadzieję, że niniejszy artykuł pomoże zrozumieć, jak poradzić sobie z obsługą FTP w sieci chronionej firewallem.

Wbrew temu, co głosi tytuł, może niekoniecznie jest to cała prawda na temat aktywnego i pasywnego FTP, jednak dochodziło do mnie wiele pozytywnych komentarzy i widziałem sporo odnośników do tego artykułu, wiem więc, że dla wielu osób był pomocny. Ciągle jednak staram się go ulepszać, jeśli więc jakiś fragment byłby nie całkiem jasny lub wymagałby szerszego omówienia, proszę mi o tym powiedzieć. Ostatnio dodałem przykłady sesji z klientem FTP, zarówno dla aktywnego jak i pasywnego trybu FTP. Powinny one ułatwić zrozumienie pewnych zagadnień. Można także dzięki nim zobaczyć, co dzieje się "za kulisami" sesji FTP. A teraz do rzeczy.

Podstawy

FTP jest usługą opartą wyłącznie na protokole TCP i nie ma odpowiednika dla protokołu UDP. Szczególną cechą FTP jest to, że w komunikacji wykorzystywane są dwa porty, port 'danych' i port 'poleceń' (zwany także portem sterowania). Zgodnie z tradycją port poleceń ma numer 21, a port danych 20. Okazuje się jednak, że w zależności od trybu transmisji FTP, port danych niekoniecznie musi mieć numer 20.

Aktywny tryb FTP

W trybie aktywnym klient FTP łączy się przez dowolny port nieuprzywilejowany (N > 1024) z portem poleceń serwera FTP, o numerze 21. Następnie klient rozpoczyna nasłuchiwanie na porcie N+1 i wysyła do serwera FTP polecenie PORT N+1. Serwer łączy się wówczas z określonym przez klienta portem przez własny port danych, czyli port 20.

Patrząc z punktu widzenia firewalla po stronie serwera, transmisja FTP w trybie aktywnym wymaga, by możliwe były następujące połączenia:

  • do portu 21 serwera FTP skądkolwiek (klient nawiązuje połączenie)
  • od portu 21 serwera FTP do portu > 1024 (serwer wysyła odpowiedź do portu poleceń klienta)
  • od portu 20 serwera FTP do portu > 1024 (serwer przesyła dane do portu danych klienta)
  • do portu 20 serwera FTP od portu > 1024 (klient wysyła potwierdzenie ACK do portu danych serwera)

Poniższy rysunek przedstawia przebieg połączenia:

1065f1b868229655aabdeabc21cd6d36.png W fazie 1 klient nawiązuje połączenie między swoim portem poleceń a portem poleceń serwera, następnie wysyła polecenie PORT 1027. Serwer odpowiada wysyłając potwierdzenie ACK do portu poleceń klienta, jest to faza 2. W fazie 3 serwer otwiera połączenie między swoim portem danych a uzgodnionym wcześniej portem danych klienta. Ostatecznie, w fazie 4, klient przesyła do serwera potwierdzenie ACK.

Podstawowy problem związany z aktywnym trybem FTP leży po stronie klienta. Klient FTP nie nawiązuje połączenia z portem danych serwera, lecz po prostu informuje serwer, na którym porcie nasłuchuje, a serwer zajmuje sie nawiązaniem połączenia z tym portem klienta. Z punktu widzenia firewalla po stronie klienta wygląda to na próbę nawiązania połączenia z zewnątrz z lokalnym komputerem - takie połączenia są zwykle blokowane.

Przykład aktywnego trybu FTP

Poniższy przykład przedstawia prawdziwą sesję FTP w trybie aktywnym. Na potrzeby przykładu zmienione zostały nazwy serwerów, adresy IP oraz nazwy użytkowników. Klient FTP działa na komputerze z systemem Linux, testbox1.slacksite.com (192.168.150.80), serwerem jest również komputer z systemem Linux, testbox2.slacksite.com (192.168.150.90), z uruchomionym ProFTPd 1.2.2RC2. Klient FTP ma włączoną opcję pokazywania informacji diagnostycznych (-d), dzięki czemu widać, co dzieje się "za kulisami". Informacje diagnostyczne oznaczone są kolorem czerwonym i pokazują polecenia FTP rzeczywiście wysyłane do serwera oraz odpowiedzi od serwera. Zwyczajne komunikaty serwera wypisane są kolorem czarnym, a polecenia wpisywane przez użytkownika czcionką pogrubioną.

Warto zwrócić uwagę na kilka rzeczy. Zauważmy, że gdy wysyłane jest polecenie PORT, jego parametrem jest port klienta (192.168.150.80), a nie serwera. Odwrotna sytuacja ma miejsce w pasywnym trybie FTP. Skoro już przy tym jesteśmy, przyjrzyjmy się budowie polecenia PORT. Jak widać na poniższym przykładzie, w skład polecenia wchodzi sześć liczb oddzielonych przecinkami. W pierwszych czterech oktetach zapisany jest adres IP, kolejne dwa zawierają numer portu, który będzie wykorzystywany do transmisji danych. By poznać rzeczywisty numer portu, należy pomnożyć piąty oktet przez 256 i dodać szósty oktet. Tak więc port z przykładu poniżej ma numer ((14*256) + 178), czyli 3762. Można to szybko sprawdzić korzystając z polecenia netstat.

testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8

Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PORT 192,168,150,80,14,178

200 PORT command successful.
---> LIST
150 Opening ASCII mode data connection for file list.
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 Goodbye.

Pasywny tryb FTP

Aby zaradzić sytuacji, w której serwer nawiązuje połączenie z klientem, wymyślono inny sposób dokonywania połączeń FTP. Jest on zwany trybem pasywnym, lub też PASV, ponieważ takim właśnie poleceniem klient informuje serwer, że pracuje w trybie pasywnym.

W pasywnym trybie FTP klient nawiązuje oba połączenia z serwerem, unikając w ten sposób problemu firewalla blokującego połączenie z portem danych klienta nawiązywane przez serwer. Rozpoczynając połączenie FTP, klient otwiera dwa dowolne porty nieuprzywilejowane (N > 1024 oraz N+1). Pierwszy port wykorzystywany jest do połączenia z portem 21 serwera, jednak zamiast wysyłania polecenia PORT i oczekiwania na połączenie od serwera, klient wysyła polecenie PASV. Serwer otwiera wówczas dowolny port nieuprzywilejowany (P > 1024) i wysyła do klienta polecenie PORT P. Klient nawiązuje następnie połączenie między swoim portem N+1 a portem serwera P w celu transmisji danych.

Patrząc z punktu widzenia firewalla po stronie serwera, transmisja FTP w trybie pasywnym wymaga, by możliwe były następujące połączenia:

  • do portu 21 serwera FTP skądkolwiek (klient nawiązuje połączenie)
  • od portu 21 serwera FTP do portu > 1024 (serwer wysyła odpowiedź do portu poleceń klienta)
  • do portu > 1024 serwera FTP skądkolwiek (klient nawiązuje połączenie z portem danych określonym przez serwer)
  • od portu > 1024 serwera FTP do portu > 1024 (serwer wysyła potwierdzenie ACK oraz dane do portu danych klienta)

Poniższy rysunek przedstawia przebieg połączenia:

40ee8ad34c1eef065bbfedd815f272ab.png W fazie 1 klient nawiązuje połączenie z portem poleceń serwera i wysyła polecenie PASV. Serwer odpowiada w fazie 2, wysyłając polecenie PORT 2024, informując w ten sposób klienta, na jakim porcie będzie nasłuchiwać. W fazie 3 klient nawiązuje połączenie między własnym portem danych a wskazanym portem danych serwera. Na koniec, w fazie 4, serwer wysyła potwierdzenie ACK do portu danych klienta.

Pasywny tryb FTP rozwiązuje co prawda wiele problemów występujących po stronie klienta, prowadzi jednak do powstania nowych problemów po stronie serwera. Najpoważniejszy z nich dotyczy konieczności zezwolenia na połączenia z zewnątrz z nieuprzywilejowanymi portami na serwerze. Na szczęście wiele demonów FTP, w tym popularny WU-FTPD, pozwala administratorowi określić zakres wykorzystywanych portów. Więcej informacji na ten temat można znaleźć w Dodatku 1.

Kolejny problem dotyczy obsługi klientów, którzy korzystają z trybu pasywnego, jak również tych, którzy z niego nie korzystają. Na przykład klient FTP w systemie Solaris nie obsługuje trybu pasywnego, w tym wypadku wymagany byłby więc inny klient FTP, jak choćby ncftp.

Ze względu na ogromną popularność WWW, wiele osób używa przeglądarki stron WWW jako klienta FTP. Większość przeglądarek, gdy poda im się URL ftp://, działa wyłącznie w trybie pasywnym. Czy to dobrze, czy źle, zależy od konfiguracji serwerów i firewalli.

Przykład pasywnego trybu FTP

Poniższy przykład przedstawia prawdziwą sesję FTP w trybie pasywnym. Na potrzeby przykładu zmienione zostały nazwy serwerów, adresy IP oraz nazwy użytkowników. Klient FTP działa na komputerze z systemem Linux, testbox1.slacksite.com (192.168.150.80), serwerem jest również komputer z systemem Linux, testbox2.slacksite.com (192.168.150.90), z uruchomionym ProFTPd 1.2.2RC2. Klient FTP ma włączoną opcję pokazywania informacji diagnostycznych (-d), dzięki czemu widać, co dzieje się "za kulisami". Informacje diagnostyczne oznaczone są kolorem czerwonym i pokazują polecenia FTP rzeczywiście wysyłane do serwera oraz odpowiedzi od serwera. Zwyczajne komunikaty serwera wypisane są kolorem czarnym, a polecenia wpisywane przez użytkownika czcionką pogrubioną.

Zwróćmy uwagę na różnicę w poleceniu PORT użytym w powyższym przykładzie w porównaniu z przykładem aktywnego trybu FTP. Port jest tu otwierany na serwerze (192.168.150.90), a nie na kliencie. Format polecenia PORT został omówiony wcześniej, w przykładzie aktywnego trybu FTP.

testbox1: {/home/p-t/slacker/public_html} % ftp -d testbox2
Connected to testbox2.slacksite.com.
220 testbox2.slacksite.com FTP server ready.
Name (testbox2:slacker): slacker
---> USER slacker
331 Password required for slacker.
Password: TmpPass
---> PASS XXXX
230 User slacker logged in.
---> SYST
215 UNIX Type: L8

Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode on.
ftp> ls
ftp: setsockopt (ignored): Permission denied
---> PASV

227 Entering Passive Mode (192,168,150,90,195,149).
---> LIST
150 Opening ASCII mode data connection for file list
drwx------ 3 slacker users 104 Jul 27 01:45 public_html
226 Transfer complete.
ftp> quit
---> QUIT
221 Goodbye.

Podsumowanie

Poniższy schemat powinien ułatwić administratorom zapamiętanie sposobów działania obu trybów FTP:

 Tryb aktywny FTP:
polecenia : klient >1024 -> serwer 21
dane : klient >1024 <- serwer 20

Tryb pasywny FTP:
polecenia : klient >1024 -> serwer 21
dane : klient >1024 -> serwer >1024

Podsumujmy krótko argumenty za i przeciw w odniesieniu do obu trybów FTP:

Aktywny tryb FTPjest wygodny dla administratora serwera FTP, jednak kłopotliwy dla klienta. Serwer FTP stara się nawiązać połączenie z nieuprzywilejowanym portem klienta, co najprawdopodobniej zostanie udaremnione przez firewall po stronie klienta. Tryb pasywny jest wygodny dla klienta, lecz kłopotliwy dla administratora serwera FTP. Oba połączenia nawiązuje klient, ale jedno z nich dotyczy nieuprzywilejowanego portu, i naprawdopodobniej będzie zablokowane przez firewall po stronie serwera.

Na szczęście, istnieje pewien kompromis. Ponieważ administrator serwera FTP powinien umożliwić dostęp do serwera dla jak największej liczby klientów, powinien zapewnić obsługę pasywnego trybu FTP. Dostęp do nieuprzywilejowanych portów serwera może być ograniczony, dzięki określeniu zakresu portów używanych przez serwer FTP. W ten sposób inne porty, nie należące do tego zakresu, mogą być blokowane przez firewall po stronie serwera. Co prawda nie eliminuje to całkowicie zagrożenia serwera, ale bardzo je zmniejsza. Więcej informacji na ten temat można znaleźć w Dodatku 1.

Bibliografia

Znakomity opis działania rozmaitych protokołów internetowych oraz zagadnień związanych z firewallami można znaleźć w książce "Building Internet Firewalls", autorstwa Brenta Chapmana i Elizabeth Zwicky, wydanie drugie, wydanej przez O'Reilly and Associates (w Polsce książka ta została wydana pod tytułem "Internet Firewalls. Tworzenie zapór ogniowych").

Kompendium wiedzy o FTP jest dokument RFC 959, zawierający oficjalny opis techniczny protokołu FTP. Dokumenty RFC dostępne są w wielu miejscach, na przykład ftp://nic.merit.edu/documents/rfc/rfc0959.txt.

 

Dodatek 1: Konfiguracja popularnych serwerów FTP

Wprowadzenie

W dodatku opisane zostaną sposoby konfiguracji ograniczonej liczby portów nasłuchujących w trybie pasywnym w kilku popularnych serwerach FTP. Jak już zostało powiedziane w artykule, administratorzy serwerów FTP powinni zapewnić obsługę pasywnego trybu FTP, aby umożliwić dostęp do swoich zasobów jak największej liczbie klientów. Jednakże aby to zrealizować, firewall musi zezwalać na wiele połączeń z nieuprzywilejowanymi portami na serwerze. Na szczęście większość serwerów FTP można skonfigurować tak, by otwierane były tylko porty z wybranego zakresu, dzięki czemu niebezpieczeństwo maleje.

ProFTPd

Serwer ProFTPd (http://www.proftpd.net) zyskuje sobie coraz większą popularność, ze względu na swoją modularną strukturę i podobną do Apache'a konfigurację. Ponadto, ProFTPd "z marszu" obsługuje wirtualne hosty, w związku z czym często jest wykorzystywany przez firmy prowadzące serwery WWW.

Począwszy od wersji 1.20RC3 (w chwili pisania tego tekstu ostatnią wersją jest 1.2.4) w ProFTPd dostępna jest opcja PassivePorts. Ma ona globalne znaczenie w pliku konfiguracyjnym proftpd.conf (lokalizacja tego pliku zależy od tego, jak ProFTPd został zainstalowany i skonfigurowany). Opcja PassivePorts używana jest z dwoma parametrami, pierwszym z nich jest najmniejszy numer portu, drugim największy numer portu, oto przykład:

PassivePorts 51000 51999

W dokumentacji ProFTPd opcja PassivePorts została opisana następująco:

PassivePorts ogranicza zakres portów wybieranych przez serwer po otrzymaniu od klienta polecenia PASV. Serwer wybiera losowo jeden z numerów z podanego zakresu, aż znajdzie wolny port. Jeśli żaden z portów z zakresu nie będzie wolny, serwer wybiera port przydzielony domyślnie przez jądro, oraz zapisuje komunikat w logu.

Wybrany zakres portów musi należeć do przedziału portów nieuprzywilejowanych (od 1024 wzwyż); jest BARDZO WAŻNE, aby zakres był odpowiednio duży, by serwer był w stanie obsłużyć jednocześnie wiele pasywnych połączeń (na przykład zakres 49152-65534, wyznaczony przez IANA zakres portów efemerycznych).

Chcąc korzystać z przekazywania portów SSH, aby stworzyć tunel SSH dla bezpiecznej transmisji poleceń FTP (hasła nie są wówczas wysyłane w postaci czytelnego tekstu), należy pamiętać o ustawieniu w pliku proftpd.conf opcji AllowForeignAddress na "on". Jeśli nie jest ona ustawiona, próba nawiązania połączenia poprzez tunel nie powiedzie się, a ProFTPd zapisze komunikat:

SECURITY VIOLATION: Passive connection from a.b.c.d rejected
(NARUSZENIE BEZPIECZEŃSTWA: Pasywne połączenie z a.b.c.d zostało odrzucone)

Ważne: Należy koniecznie zapoznać się z dokumentacją opcji AllowForeignAddress przed jej zastosowaniem. Można narazić serwer FTP na ataki typu "bounce". Opcja ta nie powinna być stosowana na serwerach FTP zezwalających na anonimowe połączenia.

Przedruk dokonany za zgodą autora 

 

Źródło: Michał Wojciechowski