Jak korzystać z tunelowania SSH w celu uzyskania dostępu do zastrzeżonych serwerów i bezpiecznego przeglądania
Klient SSH łączy się z serwerem Secure Shell, który pozwala uruchamiać polecenia terminala tak, jakbyś siedział przed innym komputerem. Ale klient SSH pozwala również na "tunelowanie" portu między lokalnym systemem a zdalnym serwerem SSH.
Istnieją trzy różne typy tunelowania SSH i wszystkie są wykorzystywane do różnych celów. Każda obejmuje użycie serwera SSH do przekierowania ruchu z jednego portu sieciowego do drugiego. Ruch jest przesyłany przez zaszyfrowane połączenie SSH, więc nie można go monitorować ani modyfikować podczas przesyłania.
Możesz to zrobić za pomocą ssh
polecenia zawarte w systemach Linux, macOS i innych systemach operacyjnych podobnych do UNIX. W systemie Windows, który nie zawiera wbudowanego polecenia ssh, zalecamy darmowe narzędzie PuTTY do łączenia się z serwerami SSH. Obsługuje tunelowanie SSH.
Przesyłanie lokalnych portów: Udostępnij zasoby zdalne w systemie lokalnym
"Przesyłanie lokalnego portu" umożliwia dostęp do zasobów sieci lokalnej, które nie są narażone na działanie Internetu. Na przykład, powiedzmy, że chcesz uzyskać dostęp do serwera bazy danych w biurze z domu. Ze względów bezpieczeństwa ten serwer bazy danych jest skonfigurowany tylko do akceptowania połączeń z lokalnej sieci biurowej. Ale jeśli masz dostęp do serwera SSH w biurze, a serwer SSH zezwala na połączenia spoza sieci biurowej, możesz połączyć się z tym serwerem SSH z domu i uzyskać dostęp do serwera bazy danych tak, jakbyś był w biurze. Często tak jest, ponieważ łatwiej jest zabezpieczyć pojedynczy serwer SSH przed atakami niż zabezpieczyć wiele różnych zasobów sieciowych.
W tym celu należy nawiązać połączenie SSH z serwerem SSH i przekazać klientowi, aby przekazywał ruch z określonego portu z lokalnego komputera - na przykład port 1234 - na adres serwera bazy danych i jego portu w sieci biurowej. Tak więc, kiedy próbujesz uzyskać dostęp do serwera bazy danych na porcie 1234 twojego bieżącego komputera, "localhost", ten ruch jest automatycznie "tunelowany" przez połączenie SSH i wysłany do serwera bazy danych. Serwer SSH znajduje się pośrodku, przekazując ruch w tę iz powrotem. Możesz użyć dowolnego wiersza poleceń lub narzędzia graficznego, aby uzyskać dostęp do serwera bazy danych, tak jakby był uruchomiony na twoim lokalnym komputerze.
Aby korzystać z lokalnego przekazywania, połącz się z serwerem SSH w normalny sposób, ale również podaj adres -L
argument. Składnia jest następująca:
ssh -L local_port: adres_zdalny: remote_port nazwa_uż[email protected]
Na przykład, powiedzmy, że serwer bazy danych w twoim biurze znajduje się pod adresem 192.168.1.111 w sieci biurowej. Masz dostęp do serwera SSH w biurze pod adresem ssh.youroffice.com
, i twoje konto użytkownika na serwerze SSH kok
. W takim przypadku twoje polecenie wyglądałoby tak:
ssh -L 8888: 192.168.1.111: 1234 [email protected]
Po uruchomieniu tego polecenia będziesz mógł uzyskać dostęp do serwera bazy danych w porcie 8888 na localhost. Tak więc, jeśli serwer bazy danych oferuje dostęp do sieci, można podłączyć http: // localhost: 8888 do przeglądarki internetowej, aby uzyskać do niego dostęp. Jeśli masz narzędzie wiersza poleceń, które potrzebuje adresu sieciowego bazy danych, wskażesz go na localhost: 8888. Cały ruch wysłany do portu 8888 na komputerze zostanie tunelowany do sieci 192.168.1.111:1234 w sieci biurowej.
To trochę bardziej zagmatwane, jeśli chcesz połączyć się z aplikacją serwera działającą w tym samym systemie, co sam serwer SSH. Na przykład, powiedzmy, że masz serwer SSH działający w porcie 22 na komputerze biurowym, ale masz także serwer bazy danych działający na porcie 1234 w tym samym systemie pod tym samym adresem. Chcesz uzyskać dostęp do serwera bazy danych z domu, ale system akceptuje tylko połączenia SSH na porcie 22, a jego zapora nie zezwala na żadne inne połączenia zewnętrzne.
W takim przypadku możesz uruchomić polecenie podobne do następującego:
ssh -L 8888: localhost: 1234 [email protected]
Podczas próby uzyskania dostępu do serwera bazy danych w porcie 8888 na bieżącym komputerze, ruch zostanie przesłany przez połączenie SSH. Kiedy dotrze do systemu z uruchomionym serwerem SSH, serwer SSH wyśle go do portu 1234 na "localhost", którym jest ten sam komputer, na którym działa sam serwer SSH. Tak więc "localhost" w powyższym poleceniu oznacza "localhost" z perspektywy zdalnego serwera.
Aby to zrobić w aplikacji PuTTY w systemie Windows, wybierz Połączenie> SSH> Tunele. Wybierz opcję "Lokalny". W polu "Port źródłowy" wprowadź port lokalny. W polu "Miejsce docelowe" wprowadź adres docelowy i port w postaci remote_address: port_zdalny.
Na przykład, jeśli chcesz skonfigurować ten sam tunel SSH jak powyżej, wpisz 8888
jako port źródłowy i localhost: 1234
jako cel podróży. Kliknij "Dodaj", a następnie kliknij "Otwórz", aby otworzyć połączenie SSH. Będziesz także musiał wprowadzić adres i port samego serwera SSH na głównym ekranie "Sesji" przed połączeniem, oczywiście.
Zdalne przekazywanie portów: Udostępnij lokalne zasoby w systemie zdalnym
"Zdalne przekierowanie portów" jest przeciwieństwem lokalnego przekazywania i nie jest używane tak często. Pozwala na utworzenie zasobu na lokalnym komputerze dostępnym na serwerze SSH. Załóżmy na przykład, że używasz serwera WWW na lokalnym komputerze, przed którym siedzisz. Ale twój komputer znajduje się za zaporą ogniową, która nie zezwala na ruch przychodzący do oprogramowania serwera.
Zakładając, że możesz uzyskać dostęp do zdalnego serwera SSH, możesz połączyć się z tym serwerem SSH i użyć zdalnego przekazywania portów. Twój klient SSH powie serwerowi, aby przesłać konkretny port - powiedzmy port 1234 - na serwer SSH pod określony adres i port na bieżącym komputerze lub sieci lokalnej. Gdy ktoś uzyska dostęp do portu 1234 na serwerze SSH, ten ruch zostanie automatycznie "tunelowany" przez połączenie SSH. Każdy, kto ma dostęp do serwera SSH, będzie mógł uzyskać dostęp do serwera WWW uruchomionego na komputerze. Jest to skuteczny sposób na przechodzenie przez firewall.
Aby użyć zdalnego przekazywania, użyj ssh
polecenie z -R
argument. Składnia jest w dużej mierze taka sama jak w przypadku przekazywania lokalnego:
ssh -R remote_port: local_address: local_port nazwa_uż[email protected]
Załóżmy, że chcesz wysłuchać aplikacji serwera na porcie 1234 na lokalnym komputerze dostępnym w porcie 8888 na zdalnym serwerze SSH. Adres serwera SSH jest ssh.youroffice.com
i twoja nazwa użytkownika na serwerze SSH kok. Uruchomiłbyś następujące polecenie:
ssh -R 8888: localhost: 1234 [email protected]
Ktoś może wtedy połączyć się z serwerem SSH na porcie 8888 i to połączenie zostanie tunelowane do aplikacji serwera działającej na porcie 1234 na lokalnym komputerze, z którym nawiązałeś połączenie z.
Aby to zrobić w PuTTY w Windows, wybierz Połączenie> SSH> Tunele. Wybierz opcję "Remote". Dla "Port źródłowy" wprowadź port zdalny. W polu "Miejsce docelowe" wprowadź adres docelowy i port w postaci local_address: local_port.
Na przykład, jeśli chcesz ustawić powyższy przykład, wpisz 8888
jako port źródłowy i localhost: 1234
jako cel podróży. Kliknij "Dodaj", a następnie kliknij "Otwórz", aby otworzyć połączenie SSH. Będziesz także musiał wprowadzić adres i port samego serwera SSH na głównym ekranie "Sesji" przed połączeniem, oczywiście.
Ludzie mogliby następnie połączyć się z portem 8888 na serwerze SSH, a ich ruch zostałby tunelowany do portu 1234 w systemie lokalnym.
Domyślnie zdalny serwer SSH będzie nasłuchiwać połączeń z tego samego hosta. Innymi słowy, tylko ludzie w tym samym systemie, co sam serwer SSH, będą mogli się połączyć. Jest to ze względów bezpieczeństwa. Musisz włączyć opcję "GatewayPorts" w sshd_config na zdalnym serwerze SSH, jeśli chcesz zastąpić to zachowanie.
Dynamiczne przekierowanie portów: użyj serwera SSH jako serwera proxy
Istnieje również "dynamiczne przekazywanie portów", które działa podobnie do proxy lub VPN. Klient SSH utworzy serwer proxy SOCKS, z którego można skonfigurować aplikacje. Cały ruch przesyłany za pośrednictwem serwera proxy będzie wysyłany za pośrednictwem serwera SSH. Jest to podobne do lokalnego przekazywania - pobiera ruch lokalny wysyłany do określonego portu na komputerze i wysyła go przez połączenie SSH do zdalnej lokalizacji.
Załóżmy na przykład, że używasz publicznej sieci Wi-Fi. Chcesz bezpiecznie przeglądać, nie będąc podsłuchiwanym. Jeśli masz dostęp do serwera SSH w domu, możesz się z nim połączyć i korzystać z dynamicznego przekierowania portów. Klient SSH utworzy serwer proxy SOCKS na twoim komputerze. Cały ruch wysłany do tego serwera proxy będzie wysyłany przez połączenie serwera SSH. Nikt monitorujący publiczną sieć Wi-Fi nie będzie mógł monitorować Twojego przeglądania ani cenzurować stron internetowych, do których masz dostęp. Z perspektywy odwiedzanych stron internetowych będzie tak, jakbyś siedział przed komputerem w domu. Oznacza to również, że możesz użyć tej sztuczki, by uzyskać dostęp do witryn tylko w USA, podczas gdy poza USA - zakładając, że masz dostęp do serwera SSH w USA, oczywiście.
Jako inny przykład możesz chcieć uzyskać dostęp do aplikacji serwera multimediów, którą masz w swojej sieci domowej. Ze względów bezpieczeństwa serwer SSH może być narażony na działanie Internetu. Nie zezwalaj na połączenia przychodzące z Internetu do aplikacji serwera multimedialnego. Możesz skonfigurować dynamiczne przekierowanie portów, skonfigurować przeglądarkę internetową, aby korzystać z serwera proxy SOCKS, a następnie uzyskiwać dostęp do serwerów działających w sieci domowej za pośrednictwem przeglądarki internetowej, tak jakbyś siedział przed swoim systemem SSH w domu. Na przykład, jeśli serwer multimediów znajduje się w porcie 192.168.1.123 w sieci domowej, możesz podłączyć ten adres 192.168.1.123
do dowolnej aplikacji korzystającej z proxy SOCKS, a uzyskasz dostęp do serwera multimediów tak, jakbyś był w sieci domowej.
Aby korzystać z dynamicznego przekazywania, uruchom polecenie ssh przy pomocy -re
argument, jak na przykład:
ssh -D local_port nazwa_uż[email protected]
Na przykład załóżmy, że masz dostęp do serwera SSH w ssh.yourhome.com
i twoja nazwa użytkownika na serwerze SSH kok
. Chcesz korzystać z dynamicznego przekazywania, aby otworzyć serwer proxy SOCKS w porcie 8888 na bieżącym komputerze. Uruchomiłbyś następujące polecenie:
ssh -D 8888 [email protected]
Następnie można skonfigurować przeglądarkę internetową lub inną aplikację do korzystania z lokalnego adresu IP (127.0.01) i portu 8888. Cały ruch z tej aplikacji zostanie przekierowany przez tunel.
Aby to zrobić w PuTTY w Windows, wybierz Połączenie> SSH> Tunele. Wybierz opcję "Dynamiczny". W polu "Port źródłowy" wprowadź port lokalny.
Na przykład, jeśli chcesz utworzyć serwer proxy SOCKS na porcie 8888, wpisz 8888
jako port źródłowy. Kliknij "Dodaj", a następnie kliknij "Otwórz", aby otworzyć połączenie SSH. Będziesz także musiał wprowadzić adres i port samego serwera SSH na głównym ekranie "Sesji" przed połączeniem, oczywiście.
Następnie można skonfigurować aplikację, aby uzyskać dostęp do serwera proxy SOCKS na lokalnym komputerze (czyli adresie IP 127.0.0.1, który wskazuje na lokalny komputer) i podać poprawny port.
Na przykład możesz skonfigurować przeglądarkę Firefox do korzystania z serwera proxy SOCKS. Jest to szczególnie przydatne, ponieważ Firefox może mieć własne ustawienia proxy i nie musi używać ogólnosystemowych ustawień proxy. Firefox wyśle swój ruch przez tunel SSH, podczas gdy inne aplikacje będą normalnie korzystać z połączenia internetowego.
Robiąc to w Firefoksie, wybierz "Ręczna konfiguracja serwera proxy", wpisz "127.0.0.1" w polu hosta SOCKS i wprowadź dynamiczny port w polu "Port". Pozostaw pola proxy HTTP, SSL Proxy i FTP Proxy puste.
Tunel pozostanie aktywny i będzie otwarty tak długo, jak długo będzie otwarte połączenie sesji SSH. Po zakończeniu sesji SSH i rozłączeniu z serwerem tunel zostanie również zamknięty. Wystarczy ponownie połączyć się z odpowiednim poleceniem (lub odpowiednimi opcjami w PuTTY), aby ponownie otworzyć tunel.