Po prostu połącz
Autor: Maciej Koziński
Point-to-Point Protocol umożliwia uruchomienie protokołów sieciowych (np. IP, IPX czy AppleTalk) na łączu szeregowym. Wielu odbiorców indywidualnych i instytucjonalnych korzysta z PPP na łączach dzierżawionych lub komutowanych.
PPP łączy dwa interfejsy sieciowe, nie służy więc do pracy w sieciach o charakterze rozgłoszeniowym. Protokół
ten jest niezależny od środowiska, jego implementacje dostępne są we wszystkich używanych dziś systemach operacyjnych, a także w routerach, serwerach dostępowych RAS i innych urządzeniach sieciowych.
PPP jest protokołem punkt-punkt (peer-to-peer). Używane w jego kontekście terminy "klient" i "serwer" oznaczają odpowiednio stronę inicjującą połączenie oraz stronę świadczącą usługę dostępu i sprawdzającą prawa do niego.
Sprzęt
PPP
Protokół zaprojektowany do uporządkowanej, równoczesnej, dwukierunkowej transmisji pakietów między dwoma punktami.
Struktura ramki PPP wygląda następująco:
Adres (1B) - adres sprzętowy; ponieważ PPP nie przyznaje końcówkom indywidualnych adresów, pole to ma zawsze wartość 0xff,
Sterowanie (1B) - określa sposób sterowania transmisją (domyślnie wartość 0x03, ramki z inną zawartością tego pola są odrzucane),
Protokół (2B) - typ protokołu, jaki zawiera ramka (IP, IPX, AppleTalk, DECNet, Banyan Vines itp.), Dane (zmienna długość) - datagram protokołu wskazanego w poprzednim polu,
FCS (Frame Check Sequence)
(2 lub 4B) - suma kontrolna.
Port szeregowy - reprezentowany przez urządzenia COMx w systemach operacyjnych Microsoftu i /dev/ttySx w Linuksie - wymaga przygotowania do współpracy z PPP, tzn. przygotowania parametrów terminala, portu szeregowego i modemu. Parametry terminala związanego z portem szeregowym odczytujemy i ustalamy w Linuksie poleceniem stty, np.:
stty -a < /dev/ttyS1
Najbardziej interesujące są znaczniki: cs8 - oznacza liczbę bitów danych na znak (8), crtscts - sprzętową kontrolę przepływu danych, clocal - linię lokalną, bez sygnału kontrolnego dla modemu (ignorowanie stanu linii CD -
Carrier Detect - a więc wykrywania nośnej), -parenb - brak bitu parzystości, -cstop - jeden bit stopu (bez "-" to dwa bity). Niektóre z wymienionych parametrów można ustawić bezpośrednio przez daemon protokołu PPP -
pppd.
Ustawienie parametrów przeprowadzamy tak:
stty cs8 crtscts -parenb -cstop < /dev/ttyS1
Ustawimy w ten sposób parametry linii: osiem bitów danych, brak bitów parzystości, jeden bit stopu (popularne niegdyś 8N1) i sprzętową kontrolę przepływu danych. Sprzętowa kontrola przepływu danych jest niezbędna przy stosowaniu PPP, ponieważ protokół ten używa danych ośmiobitowych, tak więc pojawienie się znaków Ctrl-S i Ctrl-Q w ciągu danych dostarczonych do modemu mogłoby spowodować zatrzymanie transmisji. Możliwe jest jednak obejście tego ograniczenia w samym PPP poprzez ustawienie opcji xonxoff i wskazanie znaków odpowiedzialnych za wstrzymanie i wznowienie transmisji parametrem asyncmap.
Parametry portu szeregowego możemy poznać i ustawić w Linuksie poleceniem setserial, np.:
# setserial -a /dev/ttyS1
/dev/ttyS1, Line 1, UART: 16550A, Port: 0x02f8, IRQ: 3
Baud_base: 115200, close_delay: 50, divisor: 0
closing_wait: 3000, closing_wait2: infinte
Flags: spd_vhi hup_notify skip_test
Protokoły pomocnicze
Protokół PPP zawiera zestaw protokołów pomocniczych:
Link Control Protocol - negocjuje podstawowe parametry pracy łącza: rozmiar pakietów, znaki kontrolne, metody autoryzacji, PPP Multilink (Point-to-Point Multilink) - rozszerzenie PPP umożliwiające "złożenie" kilku łączy PPP (np. połączeń fizycznych) w jedno łącze logiczne,
PAP (Password Authentication Protocol) - protokół autoryzacji,
CHAP (Challenge Handshake Authentication Protocol) - inny protokół autoryzacji, BAP (Bandwidth Allocation Protocol) - rozszerzenie sterujące zwielokrotnionymi łączami PPP Multilink, IPHC (IP Header Compression) - kompresja nagłówka IP,
BSD - kompresja datagramów metodą stosowaną w systemach Unix,
MPPC (Microsoft Point-to-Point Compression) - sposób kompresji opracowany przez Microsoft dla dużych ramek (MTU 1500); jego użycie jest ustalane protokołem CCP (Compression Control Protocol),
DESE - szyfrowanie algorytmem DES.
Polecenie setserial umożliwia ustawienie parametrów portu szeregowego, np.: używane przerwania i porty wejścia/wyjścia, szybkość transmisji przez port czy zawiadomienie procesu getty, obsługującego dany terminal, o zakończeniu połączenia. Bezpieczną konfigurację dla PPP ustanawiamy np. poleceniem:
setserial /dev/ttyS1 spd_vhi hup_notify
Wymusza ono szybkość pracy portu 115 Kb/s oraz zawiadomienie getty o zakończeniu pracy PPP. Prędkość ta jest osiągalna w komunikacji z urządzeniami zewnętrznymi przez porty szeregowe obsługiwane przez UART (Universal Asynchronous Receiver Transmitter) 16550A, które są już standardowym wyposażeniem płyt głównych i kart modemowych.
W większości wypadków niezbędnym elementem fizycznej infrastruktury będzie modem. Dla łączy komutowanych konieczne jest zainicjowanie modemu komendami Hayesa:
• &K3 - ustawienie sprzętowej kontroli przepływu,
• E1 - echo znaków przesyłane z powrotem do terminala; niezbędne dla programów automatyzujących
"chat" z serwerem,
• Q0 - zwracanie numerycznych wyników wykonywanych przez modem komend,
• S0=0 - zablokowanie odbierania przychodzących połączeń przez modem,
• &C1 - wykrywanie nośnej po nawiązaniu połączenia.
System operacyjny
Aby uruchomić PPP pod kontrolą Linuksa, musimy zainstalować w jądrze sterowniki slhc.o i ppp.o. Niezbędne mogą okazać się również bsd_comp.o oraz ppp_deflate.o - w zależności od rodzaju kompresji transmitowanych danych. Jeśli budujemy jądro i sterowniki we własnym zakresie, musimy zaznaczyć w konfiguracji jądra - jako zintegrowane z nim lub zbudowane jako moduły - opcje "Character devices" "Standard/generic (dumb) serial port", w "Network device support" "PPP (point-to-point) support" wraz z towarzyszącymi "SLIP (serial line) support" i "CSLIP compressed headers", które zawierają niezbędne procedury kompresji.
Z punktu widzenia serwera dostępowego PPP lub klienta pełniącego funkcję routera wyjściowego sieci lokalnej istotne jest wbudowanie w jądro opcji "General setup"/"Sysctl support", która pozwala na konfigurowanie niektórych parametrów systemu operacyjnego w locie, poprzez wpisy do pseudosystemu plików /proc. Dla routera konieczne jest wykonanie przy starcie systemu polecenia:
echo "1" > /proc/sys/net/ipv4/ ip_forward
aby możliwe było przesyłanie pakietów z i do pozostałych stacji sieci lokalnej.
Nim ruszy transmisja
Program chat
Jest to program, który automatyzuje "rozmowę" ze zdalnym serwerem dostępowym po stronie Linuksa przed nawiązaniem połączenia PPP. Reaguje na ciągi znaków otrzymywane za pośrednictwem terminala - portu szeregowego i (najczęściej) modemu. Może więc zainicjować modem, zareagować na zdarzenia wynikające z prób nawiązania połączenia telefonicznego oraz przeprowadzić autoryzację przez podanie identyfikatora i hasła. Chat działa na podstawie dostarczonego przez użytkownika skryptu. Dialog jest prowadzony w formie:
"oczekiwany ciąg znaków" "odpowiedź"
Zamiast "dialogu" mogą się pojawić komendy programu chat, np.:
ABORT - przerwanie wykonywania skryptu w przypadku pojawienia się ciągu znaków podanego jako argument, TIMEOUT - czas oczekiwania na odpowiedź w sekundach,
HANGUP - określenie, czy odłożenie słuchawki traktować jako błąd, SAY - wypisanie komunikatu na terminalu użytkownika,
ECHO - kontrola nad wypisywaniem poleceń skryptu na terminalu użytkownika.
Można skorzystać ze znaków specjalnych:
"" - pusty ciąg znaków,
\b - backspace,
\c - pominięcie znaku końca linii w wysyłanym ciągu znaków,
\d - jednosekundowe opóźnienie,
\n - znak nowej linii,
\p - pauza 1/10 sekundy,
\q - pominięcie zapisu ciągu znaków via syslog,
\r - znak carriage return,
\s - spacja,
\t - tabulator,
\\ - backslash.
W tak przygotowanym środowisku możemy już uruchomić program /usr/sbin/pppd. Transmisja pakietów protokołu sieciowego wymaga jednak jeszcze kilku czynności - w przypadku połączenia komutowanego będzie to zestawienie tego połączenia. Gdy połączenie na poziomie fizycznym zostanie nawiązane, możliwe jest ustalenie parametrów pracy PPP. Implementacje PPP po obu stronach łącza uzgadniają wówczas przy użyciu Link Control Protocol (LCP) parametry połączenia PPP: maksymalne rozmiary nadawanych i odbieranych pakietów, znaki specjalne (asyncmap), rodzaj autoryzacji (PAP lub CHAP), typ stosowanej kompresji. Następnie do działania zaprzęgany jest Internet Protocol Control Protocol (IPCP), odpowiedzialny za uzgodnienie adresów IP na obu końcach łącza (chyba że adresy zostały przydzielone statycznie). Równolegle można dokonać autoryzacji PAP lub CHAP, jeśli jedna ze stron (lub obie) jej zażąda. Wartości parametrów konfiguracyjnych narzuca z reguły strona zwana umownie serwerem.
Niezbędne parametry połączenia PPP zawiera plik /etc/ppp/options. Minimalna konfiguracja pppd zawarta w pliku do pracy bez autoryzacji PAP lub CHAP obejmuje parametry:
• lokalny_adres_IP:zdalny_adres_IP - para adresów IP łącza PPP po stronie lokalnej i zdalnej; pola mogą być puste, wówczas adresy ustalane są w drodze negocjacji,
• /dev/ttySx 115200 - port szeregowy i prędkość transmisji,
• nodetach - pozostawanie na pierwszym planie, w stałej łączności z terminalem, z którego pppd został
uruchomiony,
• modem - użycie kontrolnych linii modemu,
• lock - uzyskanie wyłącznego dostępu do wybranego portu szeregowego,
• crtscts - sprzętowa kontrola przepływu,
• defaultroute - ustawienie domyślnej trasy routingu przez zestawione łącze PPP,
• asyncmap 0 - wyłączenie wszystkich "escape sequences" w transmisji.
Jeśli korzystamy z łącza komutowanego, przydatne mogą się okazać opcje:
• noipdefault - adres naszej końcówki łącza PPP musi być przydzielony przez serwer,
• ipcp-accept-local - podczas negocjacji IPCP nasz klient PPP zgadza się na adres IP naszej końcówki sugerowany przez serwer niezależnie od zdefiniowanych w opcjach adresów,
• ipcp-accept-remote - w toku negocjacji IPCP nasz klient PPP zgadza się na adres IP zdalnej strony sugerowany przez serwer niezależnie od zdefiniowanych w opcjach adresów,
• noauth - pozwalamy stronie zdalnej na zestawienie połączenia bez autoryzacji po stronie lokalnej.
Program chat - skrypty
Oto skrypt, który umożliwia połączenie z serwerem dostępowym TP SA:
TIMEOUT 5
"" ATZ
OK "AT Q0 W2 V1 E1 S0=0 X4 &C1 &S0 &D2 &Q5 %C1 S11=55
S38=0 \\Q3"
OK "ATDT 0202122"
ABORT "BUSY"
ABORT "NO CARRIER"
ABORT "NO DIALTONE"
ABORT "WAITING"
TIMEOUT 75
CONNECT ""
"name:" ppp
"word:" ppp
Windows 95 nie ma możliwości połączenia via PPP bezpośrednim połączeniem kablowym, tylko poprzez zestawienie połączenia komutowanego przez modem. Używając programu chat, możemy symulować zachowanie modemu na komputerze z Linuksem. Poniższy skrypt pomoże "oszukać" klienta dial-in pod Windows 95: TIMEOUT 500
"AT" "OK\r\n"
"ATE0V1" "OK\r\n"
"AT" "OK\r\n"
"DT" "CONNECT 115200\r\n"
Do zarządzania połączeniem komutowanym możemy skorzystać z opcji:
• connect '/usr/sbin/chat -V -v -f /etc/ppp/chat.txt' - zestawienie połączenia komutowanego na podstawie polecenia zewnętrznego,
• disconnect "/usr/sbin/chat - \d+++\d\c OK ath0 OK" - zakończenie połączenia komutowanego na podstawie polecenia zewnętrznego,
• maxconnect 660 - czas trwania połączenia komutowanego (w sekundach),
• idle 30 - czas nieaktywności łącza, po którym połączenie komutowane zostanie zakończone,
• active-filter - filtr pakietów ograniczający definicję nieaktywności łącza dla opcji idle, zgodny ze składnią programu tcpdump; umożliwia wybranie najważniejszych transmisji, krytycznych dla połączenia; może przyjąć np. postać "tcp port 25", wówczas czas do opcji idle będzie liczony od momentu przejścia ostatnich pakietów związanych z usługą SMTP,
• pass-filter - proste filtrowanie pakietów przy użyciu składni tcpdump; tylko pakiety dopasowane do wyrażenia podanego jako argument pass-filter są przepuszczane,
• ipparam - dodatkowy parametr przekazywany skryptowi /etc/ppp/ip-up (opis poniżej).
Jeśli budujemy serwer dostępowy na podstawie Linuxa, przydatne mogą być opcje:
• proxyarp - adresy sprzętowe MAC w sieciach rozgłoszeniowych, np. Ethernet, są wówczas przedstawiane jako powiązane z adresem IP zdalnego klienta PPP - umożliwia to nawiązanie łączności pozostałych komputerów z sieci lokalnej (w tym routera wyjściowego) z klientem PPP,
• persist - dla łączy dzierżawionych - po przerwaniu połączenia pppd nie kończy pracy, lecz próbuje je odtworzyć.
Opcje związane z autoryzacją PAP to:
• require-pap - wymóg autoryzacji zdalnego punktu protokołem PAP,
• login - użycie systemowej bazy użytkowników /etc/passwd|/etc/shadow jako podstawy do autoryzacji
• name - nazwa użytkownika, którą przedstawia zdalnemu serwerowi lokalny system podczas autoryzacji PAP.
Ważną cechą konfiguracji daemona pppd jest to, że plik /etc/ppp/options zawiera uzupełnienie w postaci plików
/etc/ppp/peers/nazwa, gdzie nazwa jest wybierana na podstawie wywołania programu:
pppd call nazwa
i może zawierać opcje konfiguracyjne specyficzne dla połączenia z konkretnym punktem dostępowym, np.
większość opcji używanych w /etc/ppp/options.
Do podanych wcześniej opcji PAP należy dodać plik zawierający nazwy użytkowników i związane z nimi hasła. Jeśli pppd nie ma korzystać przy autoryzacji z systemowej bazy użytkowników, będzie pobierał dane z pliku
/etc/ppp/pap-secrets, który służy zarówno autoryzacji naszego lokalnego punktu w zdalnych serwerach, jak i autoryzacji zdalnych klientów do połączenia z naszym portem szeregowym. Składnia pliku wygląda następująco: klient serwer has•o adresy IP
gdzie:
• klient - nazwa podana jako argument parametru name w pliku /etc/ppp/options,
• serwer - nazwa komputera zdalnego (można zastąpić znakiem globalnym "*"),
• adresy IP - adresy hostów autoryzowanych protokołem PAP w naszym punkcie lokalnym.
Wpis do pap-secrets wygląda następująco:
"ppp" * "ppp"
Oznacza to, że pppd ma, w przypadku podania jako parametru opcji name nazwy ppp, podawać zdalnemu punktowi hasło ppp w autoryzacji PAP.
Gdy ruszają pakiety
Po uzgodnieniu przez IPCP adresów IP pppd uruchamia skrypt /etc/ppp/ip-up. Rolą tego skryptu jest zazwyczaj zdefiniowanie nowych tras w tablicy routingu. Możliwe jest również umieszczenie w treści skryptu innych poleceń, np. ustawienie filtrów bardziej wyrafinowanych niż pass-filter firewalla, np. ipfwadm (linux 2.0) czy ipchains (linux 2.2). Dla łącza komutowanego skrypt ten może uruchamiać także wysyłanie i sprowadzanie poczty protokołami SMTP i IMAP czy POP3, wymianę wiadomości Usenetu, wsadowe pobieranie stron WWW itp.
Skrypt ip-up jest wywoływany z parametrami:
$1 - nazwa interfejsu tworzonego przez nowe połączenie PPP,
$2 - terminal, do którego przypisany jest proces pppd,
$3 - prędkość transmisji,
$4 - adres IP lokalnego końca połączenia,
$5 - adres IP zdalnego końca połączenia,
$6 - parametr przekazywany z pliku /etc/ppp/options opcją ipparam.
Na podstawie tych parametrów administrator połączenia PPP może tworzyć własne, elastyczne procedury startowe.
Po zakończeniu transmisji pakietów IP wywoływany jest skrypt /etc/ppp/ip-down. Zasada działania i parametry są identyczne jak ip-up, dlatego często ip-down jest dowiązany do ip-up, zaś procedury wykonywane są przy użyciu parametru $0, czyli nazwy aktualnie wykonywanego programu. Skrypt ten zazwyczaj kasuje trasę w tablicy routingu odpowiadającą likwidowanemu połączeniu PPP oraz interfejs sieciowy związany z tym połączeniem.
Najczęstsze wpadki
Zajrzyj
- www.protocols.com/... - opis protokołu PPP i protokołów sterujących
- www.in.net/... - informacja o konfigurowaniu modemów
- axion.physics.ubc.ca/... - różne informacje o PPP pod Linuksem
- linux-mp.terz.de - strona łaty jądra Linuksa pozwalającej rozbudować implementację PPP o PPP Multilink
- nodevice.com/... - najczęściej zadawane pytania nt. PPP
- www.zeuter.com/... - konfiguracja PPP dla routera brzegowego sieci LAN
Możliwości popełnienia błędu przy konfigurowaniu PPP jest sporo. Styki modemu, terminala, protokołu warstwy łącza i protokołów sieciowych tworzą skomplikowane środowisko, w którym o pomyłkę nietrudno, zaś o jej wyśledzenie - wręcz przeciwnie. Wspomniany już problem ze sterowaniem kontrolą przepływu danych jest tego wymownym przykładem. Inny problem, z którym możemy się spotkać, to spadek wydajności przy transmisji danych protokołem usługowym FTP. Przyczyna jest prozaiczna - jeśli nie ma ustawionej opcji asyncmap 0
nasz "rozmówca" po drugiej stronie łącza musi specjalnie zaznaczać znaki kontrolne o kodach 0x0 do 0x1f, co zmniejsza efektywność transmisji. Brak kontroli przepływu danych może z kolei doprowadzić do zapchania bufora modemu i zawieszenia transmisji wychodzącej.
Mimo że prędkość transmisji portu szeregowego ustawia się poleceniami stty i setserial, należy jednak podać prędkość samemu pppd - bez tego transmisja przez modem będzie odbywała się przy aktualnie ustawionej prędkości, zazwyczaj dużo niższej od maksymalnie możliwej do osiągnięcia.
archiwum.pckurier.p
Linux ze słuchawką? nr 2/2001, str. 80, ID = 4524
Do prawidłowej pracy niezbędne jest też skonfigurowanie ośmiu bitów danych bez bitu parzystości. Inne skonfigurowanie linii szeregowej będzie przyczyną kłopotów.
Wpadką po stronie serwera PPP może okazać się pominięcie opcji proxyarp. Powoduje to, że od strony sieci rozgłoszeniowych, do których podłączony jest serwer, klient łącza PPP nie jest widziany. Ma on wówczas łączność tylko z serwerem PPP, a poza nim nie.