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:
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
testbox1:{/home/p-t/slacker/public_html}%<strong>ftp-dtestbox2</strong>
Connected totestbox2.slacksite.com.
220testbox2.slacksite.com FTP server ready.
Name(testbox2:slacker):<strong>slacker</strong>
--->USER slacker
331Password required forslacker.
Password:<strong>TmpPass</strong>
--->PASS XXXX
230User slacker logged in.
--->SYST
215UNIX Type:L8
Remote system type isUNIX.
Using binary mode totransfer files.
ftp><strong>ls</strong>
ftp:setsockopt(ignored):Permission denied
--->PORT192,168,150,80,14,178
200PORT command successful.
--->LIST
150Opening ASCII mode data connection forfile list.
drwx------ 3slacker users 104Jul2701:45public_html
226Transfer complete.
ftp><strong>quit</strong>
--->QUIT
221Goodbye.
|
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:
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
testbox1:{/home/p-t/slacker/public_html}%<strong>ftp-dtestbox2</strong>
Connected totestbox2.slacksite.com.
220testbox2.slacksite.com FTP server ready.
Name(testbox2:slacker):<strong>slacker</strong>
--->USER slacker
331Password required forslacker.
Password:<strong>TmpPass</strong>
--->PASS XXXX
230User slacker logged in.
--->SYST
215UNIX Type:L8
Remote system type isUNIX.
Using binary mode totransfer files.
ftp><strong>passive</strong>
Passive mode on.
ftp><strong>ls</strong>
ftp:setsockopt(ignored):Permission denied
--->PASV
227Entering Passive Mode(192,168,150,90,195,149).
--->LIST
150Opening ASCII mode data connection forfile list
drwx------ 3slacker users 104Jul2701:45public_html
226Transfer complete.
ftp><strong>quit</strong>
--->QUIT
221Goodbye.
|
Podsumowanie
Poniższy schemat powinien ułatwić administratorom zapamiętanie sposobów działania obu trybów FTP:
1
2
3
4
5
6
7
|
Tryb<aclass="gTagLink"href="http://www.eioba.pl/t/aktywny">aktywny</a>FTP:
polecenia: klient>1024 -> serwer21
dane: klient>1024 <- serwer20
Tryb pasywny FTP:
polecenia: klient>1024 -> serwer21
dane: <aclass="gTagLink"href="http://www.eioba.pl/t/klient">klient</a>>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.