Tutoriel Linux

Tunel SSH: przekieruj port bez ujawniania serwera

Débutant6 min de lecture
À retenirLinux n'est pas réservé aux experts. Le bon point de départ : une distribution accessible, une sauvegarde propre et quelques commandes comprises.

Potrzebujesz dostępu do interfejsu internetowego, bazy danych PostgreSQL lub usługi administracyjnej, która nasłuchuje tylko na 127.0.0.1Otwarcie portu w zaporze serwera byłoby szybkie, ale usługa stałaby się wówczas dostępna z sieci, w której nie powinna się znajdować.

A Tunel SSH To przenosi połączenie do sesji SSH. W przypadku sporadycznego dostępu preferuję tę metodę: usługa pozostaje publicznie zamknięta i tylko komputer, który otwiera tunel, może z niej korzystać. Należy jednak wybrać prawidłowe przekierowanie i zweryfikować adres nasłuchu, szczególnie w przypadku… -R.

Ilustracja przedstawiająca Tuxa w centrum bezpiecznego tunelu SSH pomiędzy komputerem lokalnym a serwerem Linux
Tunel SSH przenosi port w szyfrowanym połączeniu bez bezpośredniego publikowania usługi w sieci.

Przekieruj port do swojego komputera za pomocą -L

Przekierowanie lokalne -L Otwiera port na Twoim komputerze, a następnie przekierowuje połączenia do miejsca docelowego dostępnego z serwera SSH. Jego ogólna postać wygląda następująco:

ssh -L adres_lokalny:port_lokalny:host_docelowy:port_docelowy użytkownik@serwer_ssh

Aby dotrzeć do interfejsu HTTP, który nasłuchuje tylko na porcie 80 serwera zdalnego:

ssh -N -T -o ExitOnForwardFailure=tak 
  -L 127.0.0.1:8080:127.0.0.1:80 
  [email protected]
  • -L tworzy przekierowanie lokalne;
  • 127.0.0.1:8080 jest otwartym portem na twoim komputerze;
  • 127.0.0.1:80 jest miejscem docelowym widzianym z serwera SSH;
  • -N unika uruchomienia polecenia zdalnego;
  • -T unika przydzielania terminala;
  • ExitOnForwardFailure=tak Sesja zostanie zamknięta, jeśli protokół SSH nie będzie mógł utworzyć żądanego przekierowania.

Ta ostatnia opcja potwierdza utworzenie portu nasłuchującego. Nie dowodzi ona jednak, że usługa końcowa odpowiada. Zawsze testuj miejsce docelowe po otwarciu tunelu.

Dopóki zamówienie pozostaje otwarte, możesz przetestować usługę na swoim komputerze:

curl http://127.0.0.1:8080/

Adres znajduje się po prawej stronie -L zasługuje na twoją uwagę. W poprzednim przykładzie, 127.0.0.1 Dotyczy to serwera SSH, a nie Twojego komputera. Jeśli cel znajduje się na innym komputerze w sieci prywatnej, podaj jego adres prywatny:

ssh -N -T -o ExitOnForwardFailure=tak 
  -L 127.0.0.1:15432:10.20.0.15:5432 
  [email protected]

Następnie Twój klient PostgreSQL łączy się z 127.0.0.1:15432Bastion otwiera faktyczne połączenie z 10.20.0.15:5432Baza nie musi nasłuchiwać przez internet.

Sprawdź, czy tunel faktycznie nasłuchuje

Na swoim komputerze kontroluj port lokalny za pomocą SS :

ss -ltnp | grep ':8080'
ss -ltnp | grep ':15432'

Musisz obejrzeć sesję odsłuchową 127.0.0.1związane z procesem sshJeśli widzisz 0.0.0.0 Lub Port może być dostępny z innych interfejsów na komputerze. Zamknij tunel i utwórz go ponownie, jawnie określając 127.0.0.1.

Przewodnik po otwórz porty pod Linuksem z ss Szczegóły odczytu adresów nasłuchujących. Sprawdź również, czy serwer SSH może dotrzeć do miejsca docelowego:

curl -I http://127.0.0.1:80/
nc -vz 10.20.0.15 5432

Jeśli tunel zostanie utworzony, ale to kędzior lub Twój klient SQL otrzymuje Połączenie odrzuconeSSH prawdopodobnie działa. To miejsce docelowe nie nasłuchuje na podanym adresie lub porcie.

Użycie -R bez przypadkowego opublikowania usługi

Zdalne przekierowanie -R Działa odwrotnie. Otwiera port na serwerze SSH i przekierowuje go do usługi dostępnej z Twojego komputera. Przykład: uczynienie aplikacji lokalnej na porcie 3000 dostępną tylko z serwera zdalnego:

ssh -N -T -o ExitOnForwardFailure=tak 
  -R 127.0.0.1:9000:127.0.0.1:3000 
  [email protected]

Na serwerze zdalnym proces lokalny może teraz wywołać:

curl http://127.0.0.1:9000/

Domyślnie sshd łączy ten zdalny port z interfejsem pętli zwrotnej. Nie zastępuj 127.0.0.1 przez 0.0.0.0 Lub * bez decydowania, kto powinien móc dołączyć do usługi. Parametr serwera Porty bramy Może umożliwić nasłuchiwanie na innych interfejsach. Prosta lokalna demonstracja może wówczas stać się usługą udostępnioną w sieci.

Unikaj także tej opcji -G z lokalnym przekierowaniem, jeśli nie chcesz, aby inne komputery łączyły się z przekierowanym portem. Aby zminimalizować obciążenie, powiąż tunele z 127.0.0.1 po obu stronach.

Kontroluj ograniczenia serwera SSH

Jeśli SSH odpowiada administracyjnie zabronione Jeżeli przekierowanie zostanie odrzucone, zapoznaj się z aktualną konfiguracją serwera:

sudo /usr/sbin/sshd -T | grep -E '^(allowtcpforwarding|gatewayports|permitopen|permitlisten)'

Zezwalaj na przekazywanie Tcp może zezwalać na przekierowania lokalne, przekierowania zdalne, oba rodzaje przekierowań lub żadne z nich. Zezwolenie otwarte I Pozwól słuchać Te ograniczenia służą do ograniczenia dozwolonych miejsc docelowych i portów. Na serwerze współdzielonym są one lepszym rozwiązaniem niż przyznawanie globalnej autoryzacji wszystkim kontom.

Przed jakąkolwiek modyfikacją /etc/ssh/sshd_config lub plik pod /etc/ssh/sshd_config.d/Pozostaw bieżącą sesję otwartą i przetestuj składnię:

sudo /usr/sbin/sshd -t

Zrestartuj SSH dopiero po pomyślnym powrocie bez błędów. Pełna procedura jest opisana w artykule na temat ponowne uruchomienie usługi SSH w systemie UbuntuJeśli nadal używasz hasła do tego konta, zacznij od skonfiguruj klucz SSH.

Zapisz tunel cykliczny w ~/.ssh/config

W przypadku bazy danych używanej regularnie unikaj kopiowania długich poleceń. Dodaj dedykowany host w ~/.ssh/config :

Tunel hosta-db
    Nazwa hosta bastion.example.net
    Administrator użytkownika
    Przekierowanie lokalne 127.0.0.1:15432 10.20.0.15:5432
    ExitOnForwardFailure tak
    ServerAliveInterval 30
    ServerAliveCountMax 3

Zabezpiecz plik, a następnie otwórz tunel na pierwszy plan:

chmod 600 ~/.ssh/config
ssh -N -T tunel-db

Zalecam pozostawienie pierwszego wykonania na pierwszym planie. Natychmiast zobaczysz wszelkie błędy klucza, portu lokalnego lub przekierowania. Ctrl + C Zamknij tunel prawidłowo. Jeśli następnie uruchomisz go w tle za pomocą -FZidentyfikuj właściwy proces przed jego zatrzymaniem:

pgrep -af 'ssh.*15432'
zabij PID

Unikać zabij -9 Odruchowo. Zwykle wystarczy zwykły sygnał, aby zamknąć sesję i zwolnić port.

Diagnozowanie tunelu, który nie przechodzi

  • Adres już używany Inny proces korzysta z portu lokalnego. Sprawdź to za pomocą ss -ltnp lub wybierz inny port.
  • Połączenie odrzucone :usługa docelowa nie nasłuchuje lub adres docelowy jest niepoprawny z punktu widzenia serwera SSH.
  • Administracyjnie zabronione :Konfiguracja protokołu SSH blokuje przekierowanie lub ogranicza żądany adres docelowy.
  • Limit czasu :Serwer SSH nie może nawiązać połączenia z celem z powodu routingu lub pośredniej zapory sieciowej.
  • Spadający tunel :sprawdź stabilność połączenia i użyj ServerAliveInterval zamiast pętli, która restartuje SSH bez żadnej diagnozy.

Aby uzyskać szczegóły dotyczące negocjacji i przekierowań, tymczasowo dodaj -w :

ssh -v -N -T -L 127.0.0.1:8080:127.0.0.1:80 [email protected]

Tunel SSH chroni transport, ale nie koryguje praw dostępu usługi docelowej. Kontynuuj nasłuchiwanie w lokalnej pętli zwrotnej, korzystaj z ograniczonego konta SSH, kontroluj autoryzowane klucze i zamykaj sesję, gdy dostęp nie jest już potrzebny.

Składnia -L, -R, -N I -G są szczegółowo opisane w Oficjalna dokumentacja klienta OpenSSHSterowanie Zezwalaj na przekazywanie Tcp, Porty bramy, Zezwolenie otwarte I Pozwól słuchać są opisane w sshd_config(5).

sudo apt update && sudo apt upgrade