Перенаправление портов и сокетов через 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
.