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.