Bociek PLD - Pisarz
I. Informacje podstawowe
II. Instalacja
III. Podręcznik użytkownika
IV. Podręcznik administratora
Zastosowania sieciowe
PPP over SSH - Tunel IPv4
V. Tworzenie PLD - Praktyczny poradnik
VI. O podręczniku
O tej książce
Spis treści
Inne wersje tego dokumentu
HTML (jeden plik)
Odnośniki
Tworzymy dokumentację PLD
Strona PLD
Listy dyskusyjne PLD

PPP over SSH - Tunel IPv4

<- ->
 

Wstęp

Zaletą tego rodzaju tunelu jest to, że jego działanie opiera się na jednych z bardziej popularnych protokołach PPP oraz SSH. Komunikacja odbywa się na porcie 22. Dzięki temu nie zachodzi potrzeba otwierania dodatkowych portów komunikacyjnych w konfiguracji zapory ogniowej. Interfejsy tunelu uruchamiane są przez demona pppd. Posłużą nam one do zestawienia trasy między dwoma hostami lub sieciami w zależności od potrzeb. Do naszych celów będzie potrzebny demon pppd będący implementacją protokołu ppp oraz klient i serwer ssh implementujący protokół ssh.

Konfiguracja

Zanim przystąpimy do konfiguracji musimy zdecydować który komputer będzie serwerem a który klientem. Klient będzie inicjował połączenie z serwerem uruchamiając demona pppd.

Serwer

Zanim przystąpimy do konfiguracji należy sprawdzić czy system wyposażony jest w demona ppp oraz serwer ssh. Pakiety które to udostępniają to odpowiednio ppp oraz openssh-server. Przydatnym może się okazać pakiet openssh-clients zawierający jak sama nazwa wskazuje klienta ssh.

Po zainstalowaniu wyżej wymienionych pakietów przechodzimy do konfiguracji systemu. W pierwszej kolejności zakładamy konto użytkownika oraz przydzielamy mu grupę.

# groupadd vpn-users
# useradd -m -s /usr/sbin/pppd -g vpn-users vpn
# passwd vpn
New UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Efekt wykonanych poleceń możesz zobaczyć na listingu poniżej

# grep vpn /etc/passwd
vpn:x:506:1005::/home/users/vpn:/usr/sbin/pppd

#grep vpn-users /etc/group
vpn-users:x:1005:

Wynik tych poleceń powinien odpowiadać temu co tutaj widać. GID grupy vpn-users wynosi 1005 czyli odpowiada GID ustawionemu w pliku /etc/passwd. Poleceniem passwd ustawiamy hasło dla tego konta, które zostało wpisane do /etc/shadow.

Istotnym dla konfiguracji elementem w katalogu użytkownika vpn jest katalog ~/.ssh. Możemy go stworzyć (o ile wcześniej zainstalowaliśmy) przy pomocy klienta ssh. Robimy to w dwóch krokach które obrazuje poniższy przykład

# su - vpn -s /bin/bash
$ ssh domena.pl
Warning: Permanently added 'domena.pl,xxx.xxx.xx.x' \
    (RSA) to the list of known hosts.
Password:
^C

Można też ręcznie utworzyć z poziomu konta vpn ten katalog poleceniem mkdir. Aby umożliwić użytkownikowi prawo do wykonania po zalogowaniu polecenia /usr/sbin/pppd należy nadać temu plikowi suida.

# chmod 4755 /usr/sbin/pppd

Konfigurację warstwy ssh mamy już za sobą. Możemy teraz przystąpić do konfiguracji demona pppd. Demon nie będzie wymagał autoryzacji, więc w pliku /etc/ppp/options wyszukujemy opcję auth i zmieniamy ją na noauth. Musimy teraz skonfigurować wierzchołek (tzw. peer) końca tunelu. Tworzymy więc plik /etc/ppp/peers/tunel określający wszystkie niezbędne parametry połączenia. Na listingu poniżej przykładowa konfiguracja wierzchołka.

# cat /etc/ppp/peers/tunel
192.168.1.100:192.168.1.101
noauth
lcp-echo-interval 5
lcp-echo-failure 3

W pierwszej linijce oddzielone są dwukropkiem adresy IP wierzchołków tunelu. Ten po lewej stronie zostanie ustawiony na interfejsie serwera, ten po prawej klienta. Przedstawioną konfigurację należy potraktować jako przykład i dostosować ją do rzeczywistej. Oczywiście, jeżeli spełnia ona Twoje wymagania możesz ją zastosować.

  • noauth - wyłączamy autoryzację ppp

  • lcp-echo-interval - wartość przy tej opcji określa interwał w sekundach z jakim wysyłana będzie do peera ramka żądania o echo LCP. Demon sprawdza w ten sposób czy połączenie nadal jest aktywne.

  • lcp-echo-failure - wartość podana przy tej opcji określa ile żądań o echo LCP ma zostać wysłanych jeżeli peer nie dał odpowiedzi. Po tylu próbach demon stwierdzi, że połączenie zostało utracone.

Klient

Konfiguracja po stronie klienta sprowadza się do wygenerowania kluczy rsa oraz odpowieniego ustawienia demona pppd. Klucze nam są potrzebne do autentykacji nie interaktywnej ssh. Inaczej nie uda nam się nawiązać połączenia z serwerem. Do zestawienia połączenia z serwerem po stronie klienta wymagana jest instalacja pakietów ppp oraz openssh-clients. Jeżeli ich nie posiadasz musisz je niezwłocznie zainstalować.

Przystępujemy do dalszej konfiguracji usługi po stronie klienta. Zaczniemy od wspomnianego na wstępie generowania kluczy.

$ ssh-keygen -b 1024 -f ~/.ssh/klucz -t rsa -P ""
Generating public/private rsa key pair.
Your identification has been saved in /home/users/foo/.ssh/klucz.
Your public key has been saved in /home/users/foo/.ssh/klucz.pub.
The key fingerprint is:
c9:d8:17:bd:ba:82:a0:f0:47:7c:32:c2:e8:7e:32:e8 foo@pldmachine

Do generowania kluczy służy znajdujące się w pakiecie openssh-clients polecenie ssh-keygen. Użyliśmy go z następującymi parametrami:

  • -b - długość klucza w bitach. Wartość podana na listingu jest minimalną długością klucza która jest akceptowana przez demona sshd.

  • -f - nazwa pliku (można podać ścieżkę do niego) zawierającego klucz prywatny.

  • -t - typ klucza. Na listingu jest to RSA. RSA jest algorytmem służącym do generowania kluczy.

  • -P - hasło klucza. Na potrzeby tunelu hasło musi pozostać puste. Inaczej tunel nie zadziała. Demon sshd będzie czekał na potwierdzenie hasłem klucza co nigdy nie nastąpi, gdyż sesja ssh będzie inicjowana poprzez demona pppd uniemożliwiając nam w sposób interaktywny jej przejęcie.

Kolejnym krokiem jest skopiowanie zawartości pliku klucz.pub do pliku ~vpn/.ssh/authorized_keys na serwerze. Możemy tego dokonać w następujący sposób.

$ scp ~/.ssh/klucz.pub vpn@domena.pl:~/.ssh/authorized_keys

Polecenie to zadziała tylko wtedy, kiedy na koncie vpn znajdującym się na serwerze zmienimy tymczasowo powłokę z /usr/sbin/pppd na standardową /bin/bash. Na tym etapie kończy się cała konfiguracja dotycząca ssh po obu stronach. Możemy więc przywrócić na serwerze w pliku /etc/passwd dla użytkownika vpn powłokę na /usr/sbin/pppd. Przystępujemy teraz do skonfigurowania demona pppd, który będzie wywoływał podczas ustanawiania połączenia klienta ssh.

Podobnie jak po stronie serwera w pliku /etc/ppp/options musimy opcję auth zmienić na noauth. Kiedy już to zrobimy, przystąpimy do konfiguracji wierzchołka (tzw. peera) dla klienta, który będzie inicjował połączenie. Nazwa pliku może być taka sama jak na serwerze. Poniżej na listingu znajduje się przykładowa konfiguracja wierzchołka dla klienta.

# cat /etc/ppp/peers/tunel
192.168.1.101:192.168.1.100
debug
noauth
pty "ssh -i ~/.ssh/klucz vpn@domena.pl"
connect-delay 5000

Pierwsza linijka w pliku to dwa adresy IP oddzielone znakiem dwukropka. Adres po lewej stronie jest adresem tego końca tunelu, który właśnie konfigurujemy. Pamiętamy, że adres 192.168.1.100 został już przydzielony jako adres wierzchołka serwera. Pozostałe opcje zostały objaśnione poniżej.

  • debug - włączamy raportowanie szczegółów połączenia ppp.

  • noauth - wyłączamy autoryzację.

  • pty - dzięki tej opcji możemy wykorzystać zewnętrzny skrypt jako ośrodek komunikacji zamiast konkretnego urządzenia terminalowego. Wykorzystujemy tutaj ssh.

  • connect-delay - określony w milisekundach czas oczekiwanie na prawidłowy pakiet PPP od peera. Jeżeli taki w tym czasie nadejdzie pppd rozpocznie negocjację wysyłając pierwszy pakiet LCP.

W przypadku problemów z połączeniem możemy zwiększyć wartość connect-delay nawet dziesięciokrotnie jeżeli łącza pomiędzy którymi zestawiamy tunel będą sporo obciążone. Również po stronie klienta musimy nadać bit suid plikowi /usr/sbin/pppd.

# chmod 4755 /usr/sbin/pppd

Na tym kończymy konfigurację tunelu. Możemy przejść do fazy jego uruchomienia.

Uruchomienie

Skonfigurowane połączenie należy teraz zainicjować wykonując polecenie:

$ /usr/sbin/pppd call tunel

Udana próba połączenia połączenia powinna zaowocować zapisami w logach takimi jak poniżej na listingu.

Sep  2 12:35:34 pldmachine pppd[6623]: pppd 2.4.2b3 started by foo, uid 501
Sep  2 12:35:34 pldmachine pppd[6623]: Using interface ppp0
Sep  2 12:35:34 pldmachine pppd[6623]: Connect: ppp0 <--> /dev/pts/0
Sep  2 12:35:37 pldmachine pppd[6623]: Deflate (15) compression enabled
Sep  2 12:35:37 pldmachine pppd[6623]: Cannot determine ethernet \
    address for proxy ARP
Sep  2 12:35:37 pldmachine pppd[6623]: local  IP address 192.168.1.101
Sep  2 12:35:37 pldmachine pppd[6623]: remote IP address 192.168.1.100

Wykonując po obu stronach polecenie ifconfig zauważysz, że utworzone zostały interfejsy ppp służące do komunikacji. Wykorzystamy je do zestawienia prostej trasy pomiędzy dwoma sieciami.

Zakładając, że jedna sieć po stronie serwera ma adresację 192.168.0.0/24 a po stronie klienta 192.168.2.0/24 routing będzie wyglądał w sposób następujący.

Po stronie serwera:

# route add -net 192.168.2.0/24 gw 192.168.1.100

Po stronie klienta:

# route add -net 192.168.0.0/24 gw 192.168.1.101

W ten sposób oba komputery będą przechowywały w swoich tablicach routingu informacje o sieciach połączonych dzięki interfejsom tunelu.

 
&lt;- ->