
SSH-туннелирование или переадресация портов SSH — это метод создания зашифрованного SSH-соединения между клиентом и сервером, через которое могут ретранслироваться порты служб.
Переадресация SSH полезна для передачи сетевых данных сервисов, использующих незашифрованный протокол, например, VNC или FTP , доступа к контенту с географическими ограничениями или обхода промежуточных брандмауэров. По сути, вы можете переадресовать любой TCP-порт и туннелировать трафик через защищённое SSH-соединение.
Существует три типа переадресации портов SSH:
- Переадресация локального порта. — Переадресует соединение с клиентского хоста на хост SSH-сервера, а затем на порт хоста назначения.
- Удаленная переадресация портов. — переадресация порта с хоста сервера на хост клиента, а затем на порт хоста назначения.
- Динамическая переадресация портов. — создает прокси-сервер SOCKS, который обеспечивает связь через ряд портов.
В этой статье объясняется, как настроить локальные, удаленные и динамические зашифрованные SSH-туннели.
Локальная переадресация портов
Локальная переадресация портов позволяет перенаправить порт на локальном компьютере (SSH-клиент) на порт на удаленном компьютере (SSH-сервер), который затем перенаправляется на порт на компьютере назначения.
При таком типе переадресации SSH-клиент прослушивает заданный порт и туннелирует любое подключение к этому порту на указанный порт удалённого SSH-сервера, который затем подключается к порту на целевой машине. Целевой машиной может быть как удалённый SSH-сервер, так и любая другая машина.
Переадресация локальных портов в основном используется для подключения к удаленной службе во внутренней сети, например к базе данных или VNC-серверу.
В Linux, macOS и других системах Unix для создания локальной переадресации портов передайте клиенту ssh опцию -L :
ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER
Используются следующие варианты:
-
[LOCAL_IP:]LOCAL_PORT— IP-адрес и номер порта локального компьютера. ЕслиLOCAL_IPне указан, SSH-клиент подключается к локальному хосту. -
DESTINATION:DESTINATION_PORT— IP-адрес или имя хоста и порт целевого компьютера. -
[USER@]SERVER_IP— IP-адрес удаленного пользователя SSH и сервера.
В качестве LOCAL_PORT можно использовать любой порт с номером больше 1024 Порты с номерами меньше 1024 являются привилегированными и могут использоваться только пользователем root. Если ваш SSH-сервер прослушивает порт, отличный от 22 (по умолчанию), используйте опцию -p [PORT_NUMBER] .
Имя хоста назначения должно быть разрешимо с сервера SSH.
Предположим, у вас есть сервер базы данных MySQL, работающий на компьютере db001.host во внутренней (частной) сети на порту 3306, доступном с компьютера pub001.host . Вы хотите подключиться к серверу базы данных с помощью MySQL-клиента на локальном компьютере. Для этого можно перенаправить соединение с помощью следующей команды:
ssh -L 3336:db001.host:3306 user@pub001.host
После выполнения команды вам будет предложено ввести пароль пользователя удалённого SSH-сервера. После ввода пароля вы войдете на удалённый сервер, и будет установлен SSH-туннель. Также рекомендуется настроить аутентификацию на основе SSH-ключа и подключаться к серверу без ввода пароля.
Теперь, если вы укажете клиенту базы данных локальной машины адрес 127.0.0.1:3336 , соединение будет перенаправлено на сервер MySQL db001.host:3306 через машину pub001.host , которая действует как промежуточный сервер.
Вы можете перенаправить несколько портов на несколько адресатов одной командой SSH. Например, если у вас есть другой сервер базы данных MySQL, работающий на компьютере db002.host , и вы хотите подключиться к обоим серверам с локального клиента, выполните:
ssh -L 3336:db001.host:3306 3337:db002.host:3306 user@pub001.host
Для подключения ко второму серверу используйте 127.0.0.1:3337 .
Если целевой хост совпадает с SSH-сервером, то вместо указания IP-адреса или имени целевого хоста можно использовать localhost .
Допустим, вам нужно подключиться к удалённой машине через VNC, которая работает на том же сервере, но недоступна извне. Команда для этого выглядит следующим образом:
ssh -L 5901:127.0.0.1:5901 -N -f user@remote.host
Опция -f указывает команде ssh выполняться в фоновом режиме, а -N не выполнять удалённую команду. Мы используем localhost поскольку VNC и SSH-сервер работают на одном хосте.
Если у вас возникли проблемы с настройкой туннелирования, проверьте конфигурацию удалённого SSH-сервера и убедитесь, что AllowTcpForwarding не установлен в no . По умолчанию переадресация разрешена.
Удаленная переадресация портов
Удалённая переадресация портов — это противоположность локальной переадресации портов. Она позволяет перенаправить порт на удалённой машине (SSH-сервер) на порт на локальной машине (SSH-клиент), который затем перенаправляется на порт на целевой машине.
При таком типе переадресации SSH-сервер прослушивает заданный порт и туннелирует все соединения с этим портом на указанный порт локального SSH-клиента, который затем подключается к порту на целевой машине. Целевой машиной может быть как локальная, так и любая другая машина.
В Linux, macOS и других системах Unix для создания удаленной переадресации портов передайте ssh клиенту опцию -R :
ssh -R [ REMOTE: ] REMOTE_PORT:DESTINATION:DESTINATION_PORT [ USER@ ] SSH_SERVER
Используются следующие варианты:
-
[REMOTE:]REMOTE_PORT— IP-адрес и номер порта на удалённом SSH-сервере. ПустоеREMOTEозначает, что удалённый SSH-сервер будет подключаться ко всем интерфейсам. -
DESTINATION:DESTINATION_PORT— IP-адрес или имя хоста и порт целевого компьютера. -
[USER@]SERVER_IP— IP-адрес удаленного пользователя SSH и сервера.
Удаленная переадресация портов в основном используется для предоставления доступа к внутренней службе кому-либо извне.
Предположим, вы разрабатываете веб-приложение на локальном компьютере и хотите показать его предварительный просмотр коллеге-разработчику. У вас нет публичного IP-адреса, поэтому другой разработчик не может получить доступ к приложению через Интернет.
Если у вас есть доступ к удаленному SSH-серверу, вы можете настроить удаленную переадресацию портов следующим образом:
ssh -R 8080:127.0.0.1:3000 -N -f user@remote.host
Приведенная выше команда заставит SSH-сервер прослушивать порт 8080 и туннелировать весь трафик с этого порта на ваш локальный компьютер на порт 3000 .
Теперь ваш коллега-разработчик может ввести the_ssh_server_ip:8080 в своем браузере и просмотреть ваше потрясающее приложение.
Если у вас возникли проблемы с настройкой удаленной переадресации портов, убедитесь, что в конфигурации удаленного SSH-сервера для параметра GatewayPorts установлено значение yes .
Динамическая переадресация портов
Динамическая переадресация портов позволяет создать сокет на локальной машине (SSH-клиенте), который будет выполнять функции SOCKS-прокси-сервера. При подключении клиента к этому порту соединение перенаправляется на удалённую машину (SSH-сервер), которая затем перенаправляется на динамический порт на машине назначения.
Таким образом, все приложения, использующие прокси-сервер SOCKS, будут подключаться к серверу SSH, а сервер будет пересылать весь трафик по фактическому назначению.
В Linux, macOS и других системах Unix для создания динамической переадресации портов (SOCKS) передайте клиенту ssh опцию -D :
ssh -D [ LOCAL_IP: ] LOCAL_PORT [ USER@ ] SSH_SERVER
Используются следующие варианты:
-
[LOCAL_IP:]LOCAL_PORT— IP-адрес и номер порта локального компьютера. ЕслиLOCAL_IPне указан, SSH-клиент подключается к локальному хосту. -
[USER@]SERVER_IP— IP-адрес удаленного пользователя SSH и сервера.
Типичным примером динамической переадресации портов является туннелирование трафика веб-браузера через SSH-сервер.
Следующая команда создаст туннель SOCKS на порту 9090 :
ssh -D 9090 -N -f user@remote.host
После настройки туннелирования вы можете настроить приложение для его использования. В этой статье объясняется, как настроить браузеры Firefox и Google Chrome для использования SOCKS-прокси.
Переадресацию портов необходимо настраивать отдельно для каждого приложения, через которое вы хотите туннелировать трафик.
Настройка SSH-туннелирования в Windows
Пользователи Windows могут создавать SSH-туннели с помощью SSH-клиента PuTTY. Скачать PuTTY можно здесь .
-
Запустите Putty и введите IP-адрес SSH-сервера в поле
Host name (or IP address).
-
В меню
ConnectionразвернитеSSHи выберитеTunnels. Установите переключательLocal» для настройки локального подключения,Remoteдля удалённого подключения иDynamicдля динамической переадресации портов.- При настройке локальной пересылки введите локальный порт пересылки в поле
Source Port, а вDestinationвведите хост и IP-адрес назначения, например,localhost:5901. - Для удаленной переадресации портов введите порт переадресации удаленного сервера SSH в поле
Source Port, а вDestinationвведите хост назначения и IP-адрес, например,localhost:3000. - При настройке динамической пересылки введите в поле
Source Portтолько локальный порт SOCKS.

- При настройке локальной пересылки введите локальный порт пересылки в поле
-
Нажмите кнопку
Add, как показано на рисунке ниже.
-
Вернитесь на страницу
Session, чтобы сохранить настройки, чтобы не вводить их каждый раз. Введите название сессии в поле «Saved Sessionи нажмите кнопку «Save.
-
Выберите сохраненный сеанс и войдите на удаленный сервер, нажав кнопку
Open.
Появится новое окно с запросом имени пользователя и пароля. После ввода имени пользователя и пароля вы войдете на сервер, и SSH-туннель будет запущен.
Настройка аутентификации с открытым ключом позволяет вам подключаться к серверу без ввода пароля.
Заключение
Мы показали вам, как настроить SSH-туннели и перенаправить трафик через защищённое SSH-соединение. Для удобства вы можете определить SSH-туннель в файле конфигурации SSH или создать псевдоним Bash , который будет настраивать SSH-туннель.
Если у вас возникла проблема или вы хотите оставить отзыв, оставьте комментарий ниже.
Связанные руководства