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