Konfiguracja PPP pod Linuksem
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
PAP,
•
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.