Programowanie Aplikacji Sieciowych

Transkrypt

Programowanie Aplikacji Sieciowych
Politechnika
Białostocka
Wydział Elektryczny
Katedra Telekomunikacji i Aparatury Elektronicznej
Pracownia Specjalistyczna
Programowanie Aplikacji Sieciowych
Ćwiczenie 6
Protokół FTP
opracował mgr inż. Grzegorz Kraszewski
Białystok 2007
Cel ćwiczenia
Celem ćwiczenia jest napisanie klienta protokołu FTP umożliwiającego pobranie wskazanego pliku z
serwera. Klient powinien połączyć się z serwerem teleinfo.pb.edu.pl na porcie 21, używając nazwy
użytkownika student oraz hasła 1234, a następnie pobrać plik o nazwie test.bmp i zapisać go na dysku.
Materiały źródłowe
Dokumenty RFC 959 (File Transfer Protocol) oraz RFC 1579 (Firewall-Friendly FTP).
Sposób wykonania zadania
Cechą wyróżniającą protokół FTP spośród innych protokołów warstwy aplikacji jest to, że wymaga on
do pracy nawiązania dwóch połączeń TCP, z których jedno służy do przesyłania komend do serwera
FTP i odbierania od niego odpowiedzi (tzw. połączenie kontrolne), drugie zaś tylko i wyłącznie do
transmisji danych (pobieranego lub wysyłanego pliku).
Należy zauważyć, że FTP jako protokół stary (RFC 959 pochodzi z października 1985 roku), posiada
szereg historycznych zaszłości takich jak praktycznie obecnie nie używane komendy i tryby pracy. W
tym skrypcie ograniczę się do najczęściej używanych cech i możliwości tego protokołu. Zainteresowanych dodatkowymi informacjami odsyłam do podanych materiałów źródłowych.
Wsyłanie komend
Każda komenda protokołu FTP jest linią tekstu zakończoną sekwencją <CRLF>. Pierwszym elementem jest nazwa komendy, jeżeli komenda posiada jakieś parametry, są oddzielone od nazwy spacją.
Komendy wysyłamy przez połączenie kontrolne. W odpowiedzi na każdą komendę serwer, również
przez połączenie kontrolne, przesyła odpowiedź, składającą się z kodu wykonania, oraz opisu
słownego. Kody wykonania to liczby trzycyfrowe, w których pierwsza cyfra, podobnie jak w protokole
HTTP, oznacza ogólny rezultat wykonania polecenia:
1 – odpowiedź pozytywna, serwer podejmie dalsze akcje,
2 – odpowiedź pozytywna, komendę wykonano w całości,
3 – odpowiedź pozytywna, serwer oczekuje na dodatkowe dane,
4 – odpowiedź negatywna, problem po stronie serwera,
5 – odpowiedź negatywna, błąd protokołu FTP.
Pełen wykaz błędów znajduje się w dokumencie RFC 959.
Standardowe numery portów
Standardowo serwer oczekuje na połączenia kontrolne od klientów na porcie 21 (ogólnie – na porcie s).
Po stronie klienta port połączenia kontrolnego jest wybierany automatycznie przez stos TCP (port k).
Połączenie danych serwer ustanawia w ten sposób, że po swojej stronie używa zawsze portu s-1 (a więc
standardowo będzie to port 20), natomiast port klienta, do którego nawiązywane jest połączenie, to k-1.
Klient może wymusić na serwerze nawiązanie połączenia danych do innego portu przez użycie
komendy PORT. Co ciekawe, połączenie PORT pozwala również na nawiązanie połączenia danych z
innym hostem niż połączenie kontrolne. Ze względów bezpieczeństwa jednak, niektóre serwery mogą
odmówić wykonania takiego polecenia.
Autoryzacja
Autoryzacja jest pierwszą czynnością, jaką trzeba wykonać po nawiązaniu połączenia. Polega to na
podaniu najpierw nazwy użytkownika komendą USER a następnie hasła komendą PASS. Zarówno
nazwa użytkownika jak i hasło, są przesyłane otwartym tekstem, co stanowi słabość protokołu FTP.
W systemach uniksowych z reguły jest to nazwa i hasło użytkownika konta, co dodatkowo zwiększa
niebezpieczeństwo. Niektóre serwery pozwalają na zastosowanie oddzielnych haseł tylko do FTP,
oprócz tego pozwalają na tzw. wirtualizację systemu plików. Wirtualizacja taka polega na tym, że
serwer tworzy sztuczne drzewo katalogów dla użytkownika, niekoniecznie mające cokolwiek wspólnego z rzeczywistym drzewem katalogów na dysku. Cechą charakterystyczną FTP jest użytkownik
anonimowy, używany w publicznych serwerach FTP. Logując się jako użytkownik anonimowy
podajemy jako nazwę użytkownika anonymous, a jako hasło swój adres e-mail, chociaż w praktyce
każdy ciąg znaków zawierający '@' i dalej przynajmniej jedną kropkę, zostanie przyjęty. Oczywiście
dany serwer FTP nie musi mieć użytkownika anonimowego.
Tryb pasywny
Przy standardowym połączeniu FTP wymagana jest symetryczna dwukierunkowa komunikacja między
serwerem a klientem. Ten warunek nie jest niestety spełniony w przypadku, kiedy klient znajduje się za
tzw. maskaradą IP, a więc nie posiada publicznego adresu. Do takiego klienta nie można nawiązać
połączenia z zewnątrz, a więc serwer FTP nie jest w stanie otworzyć połączenia danych. Rozwiązaniem
tego problemu jest tryb pasywny. W tym trybie serwer nie nawiązuje połączenia danych, a jedynie
podaje klientowi adres IP i port do nawiązania tego połączenia. Klient może zażądać trybu pasywnego
poleceniem PASV. Oto jak może wyglądać przejście w tryb pasywny:
220 ProFTPD 1.3.0 Server (teleinfo.pb.edu.pl) [212.33.95.179]
USER student
331 Password required for student.
PASS 1234
230 User student logged in.
PASV
227 Entering Passive Mode (212,33,95,179,12,251).
Odpowiedź na komendę PASV oznacza w tym przypadku akceptację i informację dla klienta, że
powinien nawiązać połączenie danych z hostem 212.33.95.179 na porcie 11357 (12 · 256 + 251).
Kolejność działań
1. Utworzenie gniazda do połaczenia kontrolnego.
2. Nawiązanie połączenia kontrolnego.
3. Odczytanie powitania serwera (uwaga, połączenie może zostać odrzucone, trzeba sprawdzić kod
wykonania w odpowiedzi).
4. Autoryzacja.
5. Teraz można korzystać z komend nie wymagających połączenia danych.
6. Ewentualne wykonanie polecenia PORT.
7. Stworzenie gniazda do połączenia danych.
8. Ustawienie tego gniazda w stan nasłuchiwania.
9. Użycie komendy wysyłającej lub odbierającej dane.
10. Odebranie połączenia danych.
11. Transmisja.
12.
13.
14.
15.
Odebranie wyniku trasmisji w połączeniu kontrolnym.
Zamknięcie połączenia danych (jeżeli nie będzie więcej transferów).
Wysłanie komendy QUIT.
Zamknięcie połączenia kontrolnego.
W przypadku użycia trybu pasywnego, po dojściu do punktu 5 wysyłamy komendę PASV, gniazdko
połączenia danych nie jest ustawiane w tryb nasłuchiwania, nawiązujemy połączenie aktywnie poprzez
connect(). Po każdej komendzie należy odebrać odpowiedź od serwera i przeanalizować kod
odpowiedzi. Co więcej niektóre komendy wysyłają więcej niż jedną odpowiedź. Na przykład komenda
RETR powoduje dwie odpowiedzi serwera, jedną od razu po wydaniu komendy, drugą po zakończeniu
transmisji pliku. Przypadek ten możemy wykryć po tym, że kod pierwszej odpowiedzi zaczyna się od
cyfry 1.
Wykaz ważniejszych komend protokołu FTP
USER [nazwa] – komenda wykorzystywana podczas logowania, służy do podania nazwy użytkownika.
PASS [hasło] – komenda wykorzystywana podczas logowania, służy do podania hasła
użytkownika.
CWD [ścieżka] – zmiana bieżącego katalogu.
QUIT – zakończenie połączenia.
PORT [h1,h2,h3,h4,p1,p2] – tą komendą serwer lub klient mogą poinformować drugą stronę o
adresie IP i porcie na którym oczekują połączenia danych. h1– h4 są to kolejne bajty adresu IP
(w kolejności takiej jak zapis adresu), p1 – p2 są to bajty numeru portu w kolejności starszymłodszy.
PASV – klient przełącza tą komendą serwer w tryb pasywny. Serwer w odpowiedzi podaje adres IP i
numer portu pod którym oczekuje na nawiązanie połączenia danych.
TYPE [typ] – zmienia aktualny typ danych. Obecnie używane są dwa typy: A to dane tekstowe w
kodzie ASCII (używane np. do przekazywania wykazu plików), I to typ binarny, używany do
transmisji pliku. Domyślnym typem jest A.
RETR [ścieżka] – nakazuje serwerowi rozpocząć wysyłanie pliku przez połączenie danych.
STOR [ścieżka] – informuje serwer o rozpoczęciu wysyłania pliku przez klienta.

Podobne dokumenty