Wprowadzenie do protokołu PPP
We wczesnych dniach internetu podłączenie pojedynczego komputera do sieci za pomocą prostego łącza szeregowego, takiego jak modem telefoniczny lub bezpośrednie połączenie kablowe, było wyzwaniem. Pierwsze popularne rozwiązanie, SLIP (Serial Line Internet Protocol), było bardzo proste. Potrafiło wysyłać pakiety IP, lecz nie miało mechanizmów wykrywania błędów, zabezpieczeń ani obsługi protokołów innych niż IP. Potrzebne było rozwiązanie obsługujące więcej funkcji i protokołów.
Tak powstał Protokół Point-to-Point (PPP). Opracowany na początku lat 90., PPP definiuje sposób ustanawiania bezpośredniego łącza między dwoma węzłami sieciowymi. Oprócz przenoszenia danych może negocjować parametry łącza, opcjonalnie uwierzytelniać stronę zdalną, konfigurować ustawienia sieciowe, takie jak adresy IP, oraz przenosić jednocześnie pakiety różnych protokołów. Jego zasady są nadal stosowane w technologiach takich jak dla połączeń szerokopasmowych.
Warstwowa architektura PPP
PPP jest pakietem protokołów zorganizowanych w architekturę warstwową. Obejmuje trzy główne komponenty:
- Protokół Enkapsulacji:
Definiuje format służącej do transportu pakietów przez łącze punkt-punkt. PPP używa struktury bardzo podobnej do HDLC (High-Level Data Link Control), w tym sekwencji znaczników oznaczających początek i koniec ramki oraz pola FCS do wykrywania błędów.
- Link Control Protocol (LCP):
LCP ustanawia, konfiguruje i testuje łącze danych przed rozpoczęciem wymiany danych użytkownika. Negocjuje opcje, takie jak maksymalny rozmiar ramki (MRU), protokół uwierzytelniania, jeśli jest wymagany, oraz mechanizmy wykrywania problemów, na przykład pętli zwrotnej lub innej błędnej konfiguracji łącza.
- Network Control Protocols (NCPs):
To rodzina protokołów odpowiedzialnych za konfigurowanie różnych protokołów Warstwy Sieci, które będą używane na łączu PPP. PPP jest niezależny od protokołu, co oznacza, że może przenosić pakiety z różnych protokołów, jak IP, IPX czy AppleTalk jednocześnie. Dla każdego używanego protokołu sieciowego musi być aktywny odpowiedni NCP. Najczęstszym NCP jest Internet Protocol Control Protocol (IPCP), który odpowiada za przydzielanie i konfigurowanie adresu IP dla połączenia, a także innych parametrów, jak adresy serwerów DNS.
Format ramki PPP
Każda informacja przesyłana przez łącze PPP, zarówno dane użytkownika, jak i komunikat kontrolny, jest umieszczana w ramce PPP. Jej struktura jest w dużej mierze oparta na HDLC.
- Znacznik (Flaga) (1 bajt): Ramka zaczyna się i kończy sekwencją heksadecymalną
0x7E(binarnie01111110). Znacznik oddziela ramki. Zależnie od rodzaju łącza PPP stosuje wstawianie bitów znane z HDLC albo wstawianie oktetów, aby ten wzorzec nie pojawił się przypadkowo w danych. - Adres (1 bajt): Ponieważ PPP działa na łączach punkt-punkt, odbiorca jest znany. Pole jest więc zwykle ustawione na adres wszystkich stacji
0xFF(binarnie11111111). - Sterowanie (1 bajt): Pole zachowane z formatu HDLC. PPP nie używa w nim mechanizmów kontroli przepływu ani sekwencjonowania HDLC, pozostawiając niezawodność protokołom wyższych warstw, takim jak TCP. Wartość pola wynosi
0x03i oznacza nienumerowaną ramkę informacyjną. - Protokół (1 lub 2 bajty): Pole wskazuje rodzaj danych znajdujących się w polu Informacja i umożliwia przenoszenie wielu protokołów. Dzięki różnym wartościom można rozróżnić pakiety kontrolne od danych użytkownika. Typowe wartości to:
0x0021dla pakietu IPv40x8021dla pakietów IPCP (IP Control Protocol)0xC021dla pakietów LCP (Link Control Protocol)0xC023dla pakietów PAP (Password Authentication Protocol)0xC223dla pakietów CHAP (Challenge-Handshake Auth Protocol)
- Informacja (Ładunek): Pole zawiera dane, takie jak wiadomość negocjacyjna LCP, pakiet uwierzytelniający lub pełny datagram IP. Jego długość jest zmienna i nie przekracza wartości określonej przez . Na łączach dopasowanych do Ethernetu często wynosi ona 1500 bajtów.
- Sekwencja Kontrolna Ramki (FCS) (2 lub 4 bajty): Pole wykrywania błędów, zazwyczaj 16-bitowe CRC (CRC-16). Nadawca oblicza FCS, a odbiorca go weryfikuje. Przy niezgodności ramka jest odrzucana, co wskazuje błąd transmisji. FCS wykrywa błąd, lecz nie koryguje go ani nie zapewnia retransmisji na poziomie PPP. Dalsze działanie zależy od protokołu wyższej warstwy.
Cykl życia połączenia PPP
Ustanowienie połączenia PPP przebiega w kilku fazach. Kolejna faza rozpoczyna się po spełnieniu warunków poprzedniej.
- Faza 1: Ustanowienie Łącza (Negocjacje LCP)
Gdy zostanie wykryte połączenie fizyczne, na przykład sygnał nośnej modemu, łącze wchodzi w tę fazę. Dwa urządzenia wymieniają pakiety LCP i negocjują podstawowe parametry połączenia. Używają między innymi komunikatów:
- Configure-Request: „Chciałbym skonfigurować łącze z następującymi opcjami (np. MRU 1500 bajtów, używając CHAP do uwierzytelniania).”
- Configure-Ack (Acknowledge): „Zgadzam się na wszystkie twoje proponowane opcje.”
- Configure-Nak (Negative Acknowledge): „Zgadzam się co do zasady, ale nie mogę zaakceptować tej konkretnej wartości (np. twoje MRU jest za duże), spróbuj ponownie z tą alternatywą.”
- Configure-Reject: „Nie rozumiem lub nie obsługuję jednej z opcji, o które prosisz. Kontynuujmy bez niej.”
Ta faza kończy się, gdy obie strony wyślą i odbiorą komunikat Configure-Ack. Łącze jest wtedy otwarte dla kolejnych faz PPP.
- Faza 2: Uwierzytelnianie (Opcjonalnie)
Jeśli w fazie LCP wynegocjowano uwierzytelnianie, łącze przechodzi do tej fazy. Jedna strona uwierzytelnia się wobec drugiej przy użyciu uzgodnionego protokołu, zwykle PAP lub CHAP. Po pomyślnym uwierzytelnieniu połączenie może być kontynuowane.
- Faza 3: Konfiguracja Warstwy Sieci (Negocjacje NCP)
Gdy łącze jest ustanowione i uwierzytelnione, odpowiedni NCP rozpoczyna własne negocjacje. W przypadku połączenia internetowego jest to IPCP. W typowym przebiegu IPCP klient wysyła Configure-Request, prosząc serwer o dynamiczny adres IP. Serwer może odpowiedzieć IPCP Configure-Nak z wolnym adresem, który klient potwierdza własnym Configure-Request, po czym serwer wysyła Configure-Ack. Adresy serwerów DNS również mogą być negocjowane w tej fazie. Po zakończeniu NCP połączenie jest operacyjne.
- Faza 4: Zakończenie Łącza
Gdy połączenie nie jest już potrzebne, musi zostać elegancko zamknięte. Każda ze stron może zainicjować zakończenie, wysyłając pakiet LCP Terminate-Request. Druga strona odpowiada Terminate-Ack, a łącze logiczne jest zamykane. Po tym następuje zakończenie połączenia fizycznego (np. odłożenie słuchawki modemu).
Uwierzytelnianie PPP: PAP i CHAP
PPP obejmuje między innymi dwie często spotykane metody uwierzytelniania, które różnią się sposobem ochrony poświadczeń.
PAP (Password Authentication Protocol)
PAP to prosty mechanizm uwierzytelniania oparty na wymianie żądania i odpowiedzi:
- Klient wysyła swoją nazwę użytkownika i hasło do serwera w formie jawnego tekstu.
- Serwer sprawdza dane w swojej bazie użytkowników i odsyła Authentication-Ack (sukces) lub Authentication-Nak (porażka).
Ostrzeżenie dotyczące bezpieczeństwa: Hasło jest wysyłane bez szyfrowania, dlatego PAP nie chroni go przed podsłuchem. Metoda jest uznawana za przestarzałą i nie powinna być używana na niezaufanych łączach.
CHAP (Challenge-Handshake Authentication Protocol)
CHAP wykorzystuje trójstronne uzgadnianie i nie wysyła hasła wprost przez łącze. Jego ochrona zależy od użytej funkcji skrótu i konfiguracji.
- Serwer wysyła do klienta komunikat „Wyzwanie” (Challenge), który zawiera losową wartość.
- Klient bierze tę wartość z wyzwania oraz swoje tajne hasło, łączy je i oblicza jednokierunkowy (zazwyczaj przy użyciu algorytmu MD5).
- Klient odsyła obliczoną wartość skrótu do serwera w komunikacie „Odpowiedź” (Response).
- Serwer, który również zna tajne hasło klienta, niezależnie wykonuje dokładnie to samo obliczenie skrótu. Następnie porównuje swój wynik ze skrótem otrzymanym od klienta.
- Jeśli skróty się zgadzają, serwer wysyła komunikat „Sukces” (Success). W przeciwnym razie wysyła komunikat „Porażka” (Failure).
Kluczowe zalety CHAP: Rzeczywiste hasło nie jest przesyłane przez sieć. Losowe wyzwanie przy każdej próbie ogranicza możliwość ponownego użycia przechwyconej odpowiedzi. Serwer może również okresowo wysyłać nowe wyzwania podczas połączenia, aby sprawdzać, czy ten sam peer nadal uczestniczy w sesji.