Перенаправление портов и сокетов через SSH туннели

SSH клиент под Linux можно использовать не только для безопасного подключения к консоли других компьютеров. Эта программа имеет ряд полезных функций, одной из которых является создание защищенных туннелей и эмуляция SOCKS5 прокси на локальной машине.

С помощью SSH-туннелей вы можете соединиться с сервером и использовать его сервисы через проброс портов и сокетов, и наоборот можно пробросить на сервер ресурсы со своего локального ПК, или создать прокси сервер с динамическим портом. И всё это с теми же средствами защиты данных, какие присутствуют при стандартном соединении с сервером по SSH.

Перенаправление внутреннего порта удалённого сервера на локальную машину

Если на сервере работает какой-то сервис и слушает внутренний порт, на который нет доступа извне, вы можете перебросить этот порт на ваш локальный компьютер.

Команда запускается на локальном ПК. Синтаксис команды выглядит так:

# ssh -L [локальный_адрес:]порт:удалённый_адрес:порт [user@]hostname
Если не указывать [локальный_адрес:], соединение по умолчанию будет привязано к интерфейсу localhost.

Пример с перенаправлением удалённого порта

Допустим, на удаленном сервере 172.16.10.2 у вас открыт порт localhost:80, который доступен только внутри этого сервера. Необходимо сделать так, чтобы этот порт был доступен с вашего компьютера уже по вашему локальному адресу localhost:8080:

# ssh -L localhost:8080:localhost:80 user@172.16.10.2

Перенаправление вашего локального порта на удалённую машину

Если вы хотите перенаправить на удаленный сервер какой-то внутренний сервис с вашей локальной машины, то вместо опции -L следует использовать опцию -R.

Команда запускается на локальном ПК. Синтаксис команды:

# ssh -R [удаленный_адрес:]порт:локальный_адрес:порт [user@]hostname

Пример с перенаправлением локального порта

На локальном ПК у вас открыт ssh порт по адресу localhost:22, недоступный извне. Вы не хотите или не имеете возможности напрямую открыть "в мир" свой ssh порт. Вам необходимо использовать удаленный сервер 172.16.10.2, через который можно было бы подключиться к вашему ПК по ssh, используя порт 2222.

Возможны два варианта подключения:

1. Перенаправление вашего ssh на внутренний адрес сервера. После установки туннеля, вам нужно будет зайти на сервер, и в его консоли подключиться по ssh к localhost:2222, вы будете перенаправлены на ssh своего локального ПК. Команда для установки туннеля:

# ssh -R localhost:2222:localhost:22 user@172.16.10.2

2. Перенаправление вашего ssh порта на внешний адрес удалённого сервера, в этом случае заходить на сервер не нужно, вы попадёте на свой ПК просто подключившись к ssh 172.16.10.2:2222 из любого места.

Команда для привязки удалённого порта 2222 ко всем интерфейсам/адресам сервера:

# ssh -R 0.0.0.0:2222:localhost:22 user@172.16.10.2

или

# ssh -R \*:2222:localhost:22 user@172.16.10.2

Если вы хотите привязать порт 2222 к определённому адресу на сервере:

# ssh -R 172.16.10.2:2222:localhost:22 user@172.16.10.2

По умолчанию в целях безопасности все эти команды будут привязывать ваш удалённый порт только к localhost. Чтобы использовать внешние интерфейсы сервера, необходимо отредактировать опцию GatewayPorts в конфигурационном файле /etc/ssh/sshd_config на сервере:

# nano /etc/ssh/sshd_config

GatewayPorts clientspecified

# systemctl restart sshd

Не забудьте настроить firewall на сервере, иначе внешний порт будет недоступен. На CentOS 7 и выше используется firewalld.

Командами с опциями -L и -R вы можете пробросить не только порт, но и сокет. После выполнения этих команд (без других опций) вы попадете в консоль сервера, при этом ваш туннель уже будет работать. Вы можете добавить другие опции: -C для сжатия данных; -N запрещаем ввод команд; -q не выводим в консоль сообщения. Подробное описание команд смотрите в конце статьи.

Прокси сервер SOCKS5 через SSH

Сначала устанавливается соединение с удаленным ssh сервером и происходит туннелирование. Потом ssh эмулирует SOCKS5 сервер на локальной машине, к которому можно подключиться из любой поддерживающей SOCKS5 программы, например, из браузера, указав в качестве сервера localhost, а в качестве порта установленный вами порт.

Команда для организации SSH туннеля и локального SOCKS5 сервера:

# ssh -D localhost:4444 -C -N -q root@172.16.10.2
  • -D localhost:4444 – Включает эмуляцию SOCKS5 с указанным портом. Вы можете использовать любой свободный порт. Можно не указывать localhost:, а указать только порт, соединение так же привяжется к localhost;
  • -C – Соединение со сжатием данных, которое сэкономит некоторую часть трафика;
  • -N – Указываем на то, что нам не нужно запускать никаких команд на удаленном сервере, используем соединение только как туннель;
  • -q – Использовать "тихий режим". Не выводит большинство информационных и предупреждающих сообщений в консоль;
  • root@172.16.10.2 – удаленный SSH сервер, с которым вы производите соединение.

После запуска ssh спросит пароль и останется работать в консоли, пока вы не прервете его по CTRL+C. Если вы не хотите занимать консоль работой ssh, вы можете запустить его в фоновом режиме, добавив к команде опцию -f.


epsilon7
Добавлено: 12.11.2020