Przekierowanie portów po SSH

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ć.