Do czego służą tunele SSH?
Istnieją różne scenariusze zastosowań przekierowania portów za pomocą Secure Shell. W większości przypadków tunelowanie SSH jest używane do ustanowienia szyfrowanego połączenia między komputerem lokalnym, localhost i komputerem zdalnym. Za pośrednictwem takiej wirtualnej sieci można obejść pewne ograniczenia dostępu do stron internetowych. Chociaż ten typ aplikacji ma podobieństwa do wirtualnej sieci prywatnej (VPN), nie należy mylić tych dwóch rozwiązań.
Jeśli transportujesz dane z usług używając nieszyfrowanego protokołu, możesz użyć tunelowania SSH, aby mimo wszystko zaszyfrować ruch danych. Do tego celu służy tak zwany SSH File Transfer Protocol, w skrócie SFTP. Tunelowanie SSH to także większe bezpieczeństwo podczas korzystania z internetu w sieciach publicznych, np. w knajpach i hotelach. Gdy chcesz uzyskać szczególnie wysoki poziom bezpieczeństwa, możesz polegać na kluczach SSH dla połączenia sieciowego, które wykorzystują szyfrowanie kluczem publicznym.
Przekierowanie portów to również technika, którą chętnie stosują hakerzy. Dzięki tunelowaniu SSH możliwe jest tworzenie backdoorów w sieciach wewnętrznych, które pozwalają atakującym na łatwy dostęp do wewnętrznych danych.
Tunelowanie SSH w systemie Linux
Istnieje kilka metod na tunelowanie SSH w Linuxie:
Lokalne przekierowanie portów
Prawdopodobnie najczęściej stosowaną metodą jest tzw. lokalne przekierowanie portów. Takim sposobem można uzyskać dostęp do zasobów sieci lokalnej przez przekierowanie portu na komputerze lokalnym na port na serwerze SSH. Ten z kolei jest przekazywany do portu w komputerze docelowym.
Aby skonfigurować lokalne przekierowanie portów, musisz użyć następującego polecenia w terminalu Linuxa lub dowolnym innym systemie operacyjnym opartym na Unix, np. macOS:
ssh -L port_lokalny: adres_zdalny: port_zdalny użytkownik@serwer.com
Najpierw musisz określić port, który chcesz przekazać (port_lokalny). Każdy port o numerze większym niż 1024 powinien być dostępny. Tylko root ma dostęp do portów o mniejszych numerach, ponieważ są to porty uprzywilejowane. Następnie należy podać adres IP serwera docelowego (adres_zdalny) oraz dane dostępowe (port_zdalny).
Przykład:
Chcesz połączyć się z serwerem w swoim biurze, który znajduje się pod adresem 123.234.1.111 w sieci firmowej. Możesz uzyskać dostęp do serwera SSH w swoim biurze za pomocą ssh.test.com. Twoja nazwa użytkownika to "testuser". Polecenie pozwalające skonfigurować tunel SSH dla portu 1234 wygląda następująco:
ssh -L 8888: 123.234.1.111: 1234 Testuser@ssh.test.com
Po wykonaniu tego polecenia uzyskasz dostęp do serwera biurowego przez port 8888. Jeśli komputer jest połączony z internetem, możesz uzyskać do niego dostęp również przez http://localhost:8888/. Ruch danych, wysyłany na port 8888 na komputerze, jest teraz kierowany przez tunel SSH na port 1234 na komputerze docelowym.
Zdalne przekierowanie portów
Odpowiednikiem lokalnego przekierowania portów jest tzw. zdalne przekierowanie portów. Tutaj kierujesz port na serwerze SSH na port na komputerze klienckim. W ten sposób możesz nawiązać połączenie z komputerem docelowym, np. lokalnym. Ta forma przekierowania portów jest stosowana głównie w celu udostępnienia wewnętrznych usług użytkownikom zewnętrznym.
Polecenie do skonfigurowania zdalnego tunelu SSH w terminalu jest następujące:
ssh -port_zdalny: adres_docelowy: port_docelowy użytkownik@adres_serwera_ssh
Przykład:
Jeśli chcesz nasłuchiwać na porcie o numerze 8080 i wysyłać dane na port 3000 na komputerze lokalnym, to polecenie powinno wyglądać następująco:
ssh -R 8080: 127.0.0.1:3000 użytkownik@remote.host
W powyższym przykładzie adres serwera SSH to remote.host. Możesz teraz uzyskać dostęp do danych kierowanych przez tunel z przeglądarki z pobranym takim samym adresem oraz portem określonym wcześniej:
remote.host:8080
Jeśli napotkasz problemy z ustawieniem zdalnego przekierowania portów, być może będziesz zmuszony zmienić konfigurację swojego serwera SSH. Domyślnie zdalne przekierowanie portów jest wyłączone. Możesz zmienić to ustawienie, aktywując konfigurację GatewayPorts w pliku konfiguracyjnym serwera SSH. Aby to osiągnąć, otwierasz plik i ustawiasz dyrektywę GatewayPorts na "yes".
Dynamiczne przekierowanie portów
Trzecim sposobem wykorzystania tunelowania SSH jest dynamiczne przekierowanie portów. Dzięki temu możliwe jest wykorzystanie gniazda na komputerze lokalnym, które działa jako swego rodzaju SOCKS proxy. Wszystkie aplikacje korzystające z SOCKS proxy łączą się w ten sposób z serwerem SSH i kierują cały ruch przez tunel. Częstym zastosowaniem takiego typu przekierowania portów jest tunelowanie ruchu przeglądarki internetowej.
Aby skonfigurować dynamiczne przekierowanie portów, należy użyć polecenia w terminalu według poniższego schematu:
ssh -D [lokalny_adres_IP:]port_lokalny użytkownik@adres_serwera_ssh
Jeśli nie określisz lokalnego adresu IP, automatycznie wybrany zostanie adres IP 127.0.0.1, czyli localhost.
Przykład:
Jeśli chcesz skonfigurować tunel SOCKS dla portu 9090, korzystasz z następującego polecenia dla serwera o adresie remote.host:
ssh -D 9090 -N -f użytkownik@remote.host
Po skonfigurowaniu proxy SOCKS konfigurujesz odpowiednio aplikacje, które mają korzystać z proxy.
Używanie tunelu SSH w systemie Windows
Tunele SSH mogą być również wykorzystane w systemie Windows. Ponieważ terminal ma mniejsze znaczenie w tym systemie operacyjnym, istnieją praktyczne narzędzia do tunelowania SSH z własnym interfejsem graficznym. Jednym z nich jest np. PuTTY, który czyni tworzenie tuneli SSH dziecinnie prostym.
Po pobraniu, zainstalowaniu i uruchomieniu PuTTY w polu "Nazwa hosta" wpisujesz adres IP serwera SSH, z którym chcesz się połączyć. Następnie przechodzisz do "Connection/SSH/Tunnels". Tutaj możesz określić port źródłowy i docelowy w polach "Source Port" i "Destination". Następnie nawiązujesz połączenie przez przycisk "Open" i uzyskujesz dostęp do przekazanego portu w przeglądarce przez 127.0.0.1:numer_portu.
Odwrócony tunel SSH
Aby uzyskać dostęp do komputerów z prywatnymi adresami IP, wymagany jest odwrócony tunel SSH. Komputer wewnętrzny, do którego nie można się dostać z zewnątrz, musi uruchomić odwrotny tunel SSH do komputera zewnętrznego. W przeciwieństwie do przedstawionych już tuneli SSH, tunel ten musi również umożliwiać połączenia z komputerów zewnętrznych do komputera wewnętrznego.
Poniższe polecenie służy do skonfigurowania odwrotnego tunelu SSH:
ssh -Nf -R 2222:localhost:22 użytkownik@komputer_zewnętrzny
Z kolei z pomocą tego polecenia: ssh localhost -p 2222 możesz podłączyć komputer zewnętrzny do komputera wewnętrznego.