W ostatnim poście pisałem o docker-compose i o tym jak to skonfigurowałem swój serwer. Żeby było bezpiecznie, to jedyne porty przychodzące jaki przechodzą przez router to 22
, 80
i 443
. Więc jak z zewnątrz połączyć się z portem dostępnym tylko lokalnie?
Z pomocą przychodzi SSH. Możemy ustawić przekierowanie portu na czas sesji SSH.
ssh -L <local_port>:<private_target>:<target_port> [<user>@]<public_host>
Łączymy się do komputera nam widocznego <public_host>
, a następnie nasz klient SSH nasłuchuje na porcie <local_port>
i przekierowywuje pakiety przez nasze połączenie. Są one wtedy wysyłane z komputera, z którym jesteśmy połączeni do private_target:target_port
.
Dzięki temu mogłem zrobić
ssh -L 4001:localhost:300 my_server
A następnie wejść w przeglądarce na localhost:4001
i zobaczyć to samo, co gdybym uruchomił localhost:300
na moim serwerze.
Jak pamiętamy SSH szyfruje całe połączenie więc jesteśmy bezpieczni, nawet jeśli łączymy się np. z nieszyfrowanym HTTP (bezpieczni w połączeniu ja - mój server, bo jeśli z niego wychodzimy gdzieś dalej to tam szyfrowania już nie będzie).
Przekierowanie w drugą stronę
SSH pozwala też na odwrotny proces.
ssh -R <remote_port>:<local_target>:<target_port> [<user>@]<server>
Podczas trwania takiej sesji, jeśli osoba połączona do <server>
połączy się z portem <remote_port>
to jej pakiety będą przesyłane do naszego klienta SSH, który następnie wyśle je do local_target:target_port
.
Może to być użyteczne jeśli mamy publicznie widoczny serwer i chcemy tymczasowo udostępnić komuś lokalną usługę. Niektórzy podają za przykład Remote Desktop, ale ja podam inny - serwer gry. Czyli na naszym komputerze uruchamiamy serwer gry, następnie robimy przekierowanie na publicznym serwerze i nasi koledzy mogą do niego się podłączać aby z nami razem grać.