SSH Port forwarding

SSH позволяет не только осуществлять подключение к командной строке, он также позволяет пробрасывать порты, это называется Port forwarding.

Особенности

Типичным сценарием использования SSH Port forwarding является доступ к внутренним ресурсам компании, которые находятся за NAT, без использования проброса портов на шлюзе и без использования VPN. Например:

  • доступ к серверу удалённых рабочих столов (RDP);
  • подключение к удалённым базам данным (Redis, PostgreSQL), или серверам (Proxmox VE);

SSH Port forwarding также можно использовать как резервный канал связи при падении VPN.

Поскольку SSH шифрует весь трафик, его можно безопасно использовать даже в публичных точках доступа (кафе, аэропорты, отели). Для авторизации предпочтительнее использовать SSH-Ключи, а не пароли: это надёжнее и удобнее. Подробнее: Используем ssh ключи на Linux.

SSH Port Forwarding работает только в одном направлении. То есть используя ваше подключение к удалённому серверу, к вам подключиться не получится. Для решения этой проблемы можно настроить обратный ssh туннель.

Ещё одной особенностью является то что он работает только с TCP-пакетами. Что не работает?

  • UDP (DNS, VoIP);
  • ICMP (ping).

Поднятие socs5

Вы можете подготовить ssh-proxy сервер на Linux. Пробросить только 1 порт из интернета на его ssh. В дальнейшем, через этот сервер будет возможно подключаться к другим серверам из интернета. Главное чтобы в локальной сети ssh-proxy имел доступ к этим серверам.

Для подключения к ssh-proxy с поднятием прокси выполним такую команду:

$ ssh -D 8080 <user>@<ip_ssh_proxy> -p <port_ssh_proxy>

Посмотрим что у нас получилось:

$ netstat -pan | grep 8080
tcp        0      0 127.0.0.1:8080          0.0.0.0:*      LISTEN    8354/ssh            
  • Служба слушает localhost:8080.

Теперь вы можете настроить socs5 proxy для вашего браузера используя 127.0.0.1:8080. И удалённые ресурсы (например, web-админки расположенные в офисе) начнут открываться.

Чтобы служба вместо localhost слушала и другие интерфейсы можно воспользоваться такой командой:

$ ssh -D 0.0.0.0:8080 <user>@<ip_ssh_proxy> -p <port_ssh_proxy>

$ netstat -pan | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*       LISTEN    10099/ssh      

Проброс локального порта

Чтобы не настраивать socs5 proxy в браузере, можно осуществить проброс локального порта на удалённый сервер следующей командой:

$ ssh -L <local_port>:<remote_ip>:<remote_port> <user>@<ip_ssh_proxy> -p <port_ssh_proxy>

После чего сможете подключиться к удалённому серверу используя ip-адрес 127.0.0.1 и локальный порт. Подключиться вы сможете не только по http/https, но и например по rdp и другим протоколам работающим поверх TCP.

Обратный SSH туннель

Предполагается что к удаленному компьютеру нельзя подключиться по ssh через интернет. А к локальному удалённый компьютер подключиться может.

Вы просите, чтобы с удалённой стороны подключились к вам, используя следующую команду:

$ ssh -R 9999:127.0.0.1:22 <user>@<host> -p <port>

После этого на вашем компьютере запустится процесс, который будет слушать порт 9999 на localhost. И вы сможете подключиться к удалённому серверу используя команду:

$ ssh <user>@localhost -p 9999

Итог

Повторим используемые опции:

  • ssh -D — открывает локальный порт и выдает себя за прокси-сервер SOCKS5.
  • ssh -L — открывает локальный порт. Все, что вы отправляете на этот порт, проходит через ssh-соединение и уходит на сервер.
  • ssh -R — на удалённом сервере запускает обратный туннель, чтобы от туда стало возможно подключаться к локальному серверу.

Если понравилась статья, подпишись на мой канал в VK или Telegram.