Ssh проброс портов: SSH туннели и проброс портов

Содержание

SSH туннели и проброс портов

При администрировании серверов часто возникают следующие задачи:

  1. Получить доступ к локальному порту на сервере с рабочей машины
  2. Обеспечить доступ к локальному порту рабочей машины с сервера

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

Доступ к внутреннему порту сервера

Попробуем подключиться к порту, к которому нет доступа снаружи, но есть доступ с сервера (например, MongoDB, которая слушает порт 27017 на интерфейсе localhost сервера). Для этого используется параметр -L.

ssh -L 9999:localhost:27017 [email protected]

После аутентификации, у нас на рабочей машине появляется порт 9999, который перенаправлен на порт 27017 локального интерфейса сервера.

Теперь можно подключиться к MongoDB напрямую, как будто она запущена у вас на компьютере. 

mongo localhost:9999 -u user -p password

Туннель прервётся, если вы закроете SSH соединение. Кстати, если оно вам не требуется, а нужен только туннель – можно добавить параметр -N.

ssh -L 9999:localhost:27017 [email protected] -N

Можно также открывать доступ не к локальному порту сервера, а к удаленному порту другой машины, которая доступна с сервера.

ssh -L 9999:anotherIP:80 [email protected] -N

В данном примере, вы можете делать запросы на порт 9999, связанный с 80 портом машины anotherIP.

Доступ с сервера на локальный порт

Теперь представим ситуацию, что нужно с сервера обратиться к какому-нибудь сервису, запущенному на локальном компьютере. Например, вам регулярно присылают HTTP запросы по 80 порту на сервер. Вы можете прокинуть локальный веб-сервер со своей рабочей машины (скажем с 3000 порта) на сервер так, что запросы будут идти напрямую к вам. За это отвечает параметр -R.

ssh -R 80:localhost:3000 [email protected]

После этой команды на сервере откроется 80 порт, запросы на который будут прокидываться вам на 3000.

По умолчанию 80 порт откроется на всех интерфейсах. Если вы желаете выбрать конкретный (скажем 192.168.0.1), его можно указать следующим образом

ssh -R 192.168.0.1:80:localhost:3000 [email protected]

Цепочка туннелей через несколько узлов

Если нужно пробросить на свою машину локальный порт с сервера №2, доступ к которому по SSH есть только с сервера №1, можно построить цепочку из SSH туннелей

server1# ssh -L 9999:localhost:27017 [email protected]
client# ssh -L 9999:localhost:9999 [email protected]

Можно воспользоваться однострочной командой.  

ssh -L 9999:localhost:9999 [email protected] ssh -L 9999:localhost:27017 -N [email protected]

А в случае, если у вас есть SSH ключи для доступа к серверу №2, вы можете построить защищенный туннель так, что ваш трафик не будет виден на сервере №1.

ssh -L 9998:server2:22 -N [email protected]
ssh -L 9999:localhost:27017 -N -p 9998 [email protected]

В данном примере вы пробрасываете себе на порт 9998 порт с сервера №2, обращаясь к нему через сервер №1. А затем пробрасываете порт 27017 с сервера №2 на локальный 9999. В данной конфигурации вам уже не нужен сервер №1, так как порт SSH уже у вас на локальном 9998

SOCKS прокси

С помощью параметра -D можно создать на локальной машине сокет для прослушивания динамического порта.

ssh -D localhost:8123 [email protected]

Теперь достаточно добавить хост localhost и порт 8123 в браузер для использования в качестве прокси.

Пример использования SOCKS5 прокси в Firefox

Заключение

Мы научились пробрасывать локальный порт на сервер и серверный порт на локальную машину с помощью SSH. И хотя это не слишком production ready решение, но на этапе разработки часто оказывается практичным и работает стабильно.

SSH-туннели — пробрасываем порт / Хабр

Не всегда есть возможность, да и не всегда надо, строить полноценный туннель с интерфейсной парой адресов. Иногда нам нужно лишь «прокинуть» вполне определённые порты.

Тут важно понимать, что туннель можно организовать как изнутри сети, к ресурсам которой вы хотите получить доступ, на внешний ssh-сервер. Также можно организовать туннель с хоста в Интернете на пограничный ssh-сервер сети, чтобы получить доступ к внутренним ресурсам.


Итак. По-порядку.

Строим туннель из сети в мир.

$ ssh -f -N -R 2222:10.11.12.13:22 [email protected]

теперь введя на хосте 99. 88.77.66:

$ ssh -p2222 localhost

мы попадём на хост 10.11.12.13.

Таким-же образом можно получить доступ к любому другому ресурсу, например:

$ ssh -f -N -R 2080:10.11.12.14:80 [email protected]

Введя на хосте 99.88.77.66:

$ w3m -dump http://localhost:2080

получим дамп web-ресурса на 10.11.12.14.

Строим туннель из мира в сеть.

$ ssh -f -N -L 4080:192.168.0.10:80 [email protected]

Аналогично, вводим на своём хосте:

$ w3m -dump http://localhost:4080

и получаем доступ к web-ресурсу узла 192.168.0.10, который находится за хостом 88.77.66.55.

Поддерживаем туннели в поднятом состоянии

Ни для кого не секрет, что связь иногда обрывается, туннели при этом будут отваливаться по таймауту.

Чтобы не утруждать себя дополнительным монотонным вбиванием команды на поднятие туннеля и мониторингом этого процесса, автоматизируем его. Смело вводим:

$ crontab -e

и создаём расписание примерно следующего вида:

TUNCMD1='ssh -f -N -R 2222:10. 11.12.13:22 [email protected]'
TUNCMD2='ssh -f -N -R 2080:10.11.12.14:80 [email protected]'
*/5 * * * * pgrep -f "$TUNCMD1" &>/dev/null || $TUNCMD1
*/5 * * * * pgrep -f "$TUNCMD2" &>/dev/null || $TUNCMD2

Сохраняемся. Проверяем по

$ crontab -l

что расписание принято.

Это лишь ещё один момент особой админской магии… Надеюсь, что лишних вопросов не должно водникнуть. С дополнительными опциями ssh можно ознакомиться в

$ man 1 ssh

По практическому опыту — cron-задания на перезапуск абсолютно недостаточно.

Разве что соединение абсолютно стабильно. В реальной жизни встречается в 0% случаев.

Даже соединённые напрямую кабелем две сетевые карты легко могут потерять n-ное количество пакетов и tcp-соединение «упадёт».

Клиент и сервер будут пребывать в святой уверенности, что всё в порядке, просто вторая сторона ничего не передаёт.

Нужен keepalive.

Примерно так:

TCPKeepAlive yes
ServerAliveInterval 300
ServerAliveCountMax 3

Интервал и счётчик — по вкусу.

Добавлять их надо либо в /etc/ssh_config, либо в ~/.ssh/config, либо прямо в команде через опцию -o.

В принципе, судя по man ssh_config, первую из опций можно и опустить. но, на всякий случай, пусть будет.

Клиентская команда и конфигурация сервера

Содержание

Что такое перенаправление портов SSH, также известное как туннелирование SSH? Локальная переадресация Удаленная переадресация Открытие бэкдоров в конфигурации на стороне сервера предприятия Как предотвратить переадресацию портов SSH в обход брандмауэров Решение SSH Дополнительная информация

Что такое переадресация портов SSH, также известная как туннелирование SSH?

Переадресация портов SSH — это механизм SSH для туннелирования портов приложений с клиентского компьютера на серверный или наоборот. Его можно использовать в течение добавляет шифрование в устаревшие приложения , проходит через брандмауэры , а некоторые системные администраторы и ИТ-специалисты используют для открытия лазеек во внутреннюю сеть со своих домашних компьютеров. Хакеры и вредоносное ПО также могут использовать его для открытия доступа из Интернета во внутреннюю сеть. См. страницу туннелирования SSH для более широкого обзора.

Локальная переадресация

Локальная переадресация используется для переадресации порта с клиентского компьютера на серверный. По сути, клиент SSH прослушивает соединения на настроенном порту, и когда он получает соединение, он туннелирует соединение с сервером SSH. Сервер подключается к настроенному порту назначения, возможно, на другой машине, чем SSH-сервер.

Типичные варианты использования переадресации локальных портов включают:

  • Сеансы туннелирования и передача файлов через серверы перехода

  • Подключение к службе во внутренней сети извне

  • Подключение к удаленному файловому ресурсу через Интернет

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

Многие серверы перехода разрешают переадресацию входящего порта после аутентификации соединения. Такая переадресация портов удобна тем, что позволяет технически подкованным пользователям достаточно прозрачно использовать внутренние ресурсы. Например, они могут перенаправить порт на своем локальном компьютере на веб-сервер корпоративной интрасети, на порт IMAP внутреннего почтового сервера, на порты 445 и 139 локального файлового сервера, на принтер, в репозиторий с контролем версий или почти в любая другая система во внутренней сети. Часто порт туннелируется в порт SSH на внутренней машине.

В OpenSSH переадресация локального порта настраивается с помощью параметра -L :

 ssh -L 80:intra.example.com:80 gw.example.com 

В этом примере открывается подключение к gw.example .com jump server и перенаправляет любое соединение с порта 80 на локальном компьютере на порт 80 на intra.example.com .

По умолчанию любой (даже на разных машинах) может подключиться к указанному порту на клиентской машине SSH. Однако это можно ограничить программами на одном хосте, указав адрес привязки :

 ssh -L 127.0.0.1:80:intra.example.com:80 gw.example.com 

Параметр LocalForward в файле конфигурации клиента OpenSSH можно использовать для настройки переадресации без необходимости указать его в командной строке.

Удаленная переадресация

В OpenSSH переадресация удаленных портов SSH задается с помощью параметра -R . Например:

 ssh -R 8080:localhost:80 public.example.com 

Это позволяет любому на удаленном сервере подключаться к TCP-порту 8080 на удаленном сервере. Затем соединение будет туннелировано обратно на клиентский хост, а затем клиент устанавливает TCP-соединение с портом 80 на локальный хост . Вместо localhost можно использовать любое другое имя хоста или IP-адрес, чтобы указать хост для подключения.

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

По умолчанию OpenSSH разрешает подключение только к удаленным переадресованным портам с узла сервера. Тем не менее, 9Для управления этим можно использовать параметр 0042 GatewayPorts в файле конфигурации сервера sshd_config. Возможны следующие варианты:

 Порты шлюза нет 

Это предотвращает подключение к переадресованным портам из-за пределов сервера.

 GatewayPorts да 

Это позволяет любому подключаться к переадресованным портам. Если сервер находится в общедоступном Интернете, любой пользователь Интернета может подключиться к порту.

 Клиенты GatewayPorts указаны 

Это означает, что клиент может указать IP-адрес, с которого разрешены подключения к порту. Синтаксис для этого:

 ssh -R 52.194.1.73:8080:localhost:80 host147.aws.example.com 

В этом примере разрешены только подключения с IP-адреса 52. 194.1.73 к порту 8080.

OpenSSH также позволяет указать для перенаправляемого удаленного порта значение 0. В этом случае сервер динамически выделяет порт и сообщает об этом клиенту. При использовании с -O переслать опцию , клиент выведет выделенный номер порта на стандартный вывод.

Вскрытие бэкдоров на предприятии

Удаленное перенаправление портов SSH обычно используется сотрудниками для открытия бэкдоров на предприятии. Например, сотрудник может настроить получение бесплатного сервера от Amazon AWS и войти из офиса на этот сервер, указав удаленную переадресацию с порта на сервере на какой-либо сервер или приложение во внутренней сети предприятия. Можно указать несколько удаленных перенаправлений, чтобы открыть доступ более чем к одному приложению.

Сотрудник также должен установить GatewayPorts да на сервере (у большинства сотрудников дома нет фиксированных IP-адресов, поэтому они не могут ограничить IP-адрес).

Например, следующая команда открывает доступ к внутренней базе данных Postgres через порт 5432 и к внутреннему порту SSH через порт 2222.

 ssh -R 2222:d76767.nyc.example.com:22 -R 5432:postgres3.nyc .example.com:5432 aws4.mydomain.net 

Конфигурация на стороне сервера

AllowTcpForwarding 9Параметр 0043 в файле конфигурации сервера OpenSSH должен быть включен на сервере, чтобы разрешить переадресацию портов. По умолчанию переадресация разрешена. Возможные значения этой опции: yes или all для разрешения всех переадресаций TCP, no для запрета всех переадресаций TCP, local для разрешения локальных переадресаций и remote для разрешения удаленных переадресаций.

Другим интересным вариантом является AllowStreamLocalForwarding , который можно использовать для переадресации сокетов домена Unix. Он допускает те же значения, что и Разрешить TCPForwarding . По умолчанию да .

Например:

 AllowTcpForwarding remote AllowStreamLocalForwarding нет 

Параметр конфигурации GatewayPorts , как описано выше, также влияет на перенаправление удаленных портов. Возможные значения: нет (разрешены только локальные соединения с узла сервера; по умолчанию), да (любой пользователь в Интернете может подключаться к удаленным переадресованным портам) и указанный клиентом (клиент может указать можно, если не указано).

Как предотвратить переадресацию портов SSH в обход брандмауэров

Мы рекомендуем явно отключать переадресацию портов, когда она не нужна. Если оставить переадресацию портов включенной, организация может подвергнуться угрозам безопасности и лазейкам. Например, если сервер, предназначенный только для передачи файлов SFTP, допускает переадресацию портов, эти переадресации могут использоваться для получения непреднамеренного доступа во внутреннюю сеть из интрасети.

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

Tectia SSH Client/Server от SSH — это коммерческое решение, которое может обеспечить безопасное туннелирование приложений вместе с SFTP и безопасный удаленный доступ для предприятий.

 

  • Дополнительная информация о туннелировании SSH

 

Как использовать переадресацию портов SSH {Полное руководство}

Введение

Переадресацию портов SSH часто называют туннелированием SSH, и эти два термина взаимозаменяемы.

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

Узнайте, как использовать OpenSSH для Linux, а клиент Windows PuTTY для включить локальную, удаленную или динамическую переадресацию портов SSH.

Предварительные условия

  • Клиент/сервер SSH по вашему выбору (OpenSSH или PuTTY)
  • Доступный IP-адрес или имя удаленного/локального сервера

Как использовать переадресацию локальных портов

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

Ваш локальный SSH-клиент устанавливает соединение с удаленным SSH-сервером. Затем соединение перенаправляется на ресурс внутри доверенной внутренней сети. Устанавливаются соединения SSH, и усилия по обеспечению безопасности могут быть сосредоточены на промежуточном сервере SSH, а не на отдельных ресурсах в сети.

Переадресация локального порта с помощью OpenSSH

Чтобы использовать туннелирование SSH в Linux, вам необходимо предоставить клиенту номера исходного и целевого портов, а также расположение целевого сервера. Местоположение может быть IP-адресом или именем хоста .

Базовый синтаксис команды local port forward прост:

 ssh -L local_port:destination_server_ip:remote_port ssh_server_hostname 

⦁    ssh — запускает клиентскую программу SSH на локальном компьютере и устанавливает безопасное соединение с удаленным сервером SSH.

⦁    -L local_port:destination_server_ip:remote_port — локальный порт локального клиента перенаправляется на порт целевого удаленного сервера.

⦁    ssh_server_hostname — этот элемент синтаксиса представляет имя хоста или IP-адрес удаленного SSH-сервера.

Практический пример команды переадресации порта SSH может иметь следующую форму:

 ssh –L 5901:188.17.0.5:4492 [email protected] 

В приведенном выше примере весь трафик отправляется на порт 5901 вашего локальный хост перенаправляется на порт 4492 на удаленном сервере, расположенном по адресу 188.17.0.5.

Переадресация локального порта с помощью PuTTY

PuTTY — это удобный SSH-клиент для Windows. Настройте локальное туннелирование SSH, выполнив следующие действия:

  1. При запуске приложения PuTTY на экране Sessions можно ввести имя хоста или IP-адрес и номер порта целевого SSH-сервера (пример: [email protected] и номер порта 22).
  1. Используйте список Категория слева, чтобы перейти к Соединение > SSH > Туннели .
  2. Выберите Локальный , чтобы определить тип переадресации порта SSH.
  1. Введите номер вашего локального порта в поле Исходный порт .
  2. Введите адрес назначения и номер порта в поле Назначение . Используйте следующий формат: IP-адрес_сервера_назначения:удаленный_порт.
    (например, Порт источника: 5901 , Назначение: 188.17.0.5:4492)
  3. Убедившись, что введенная информация верна, выберите Добавить .
  4. Теперь все параметры соединения установлены. Открыть 9Параметр 0185 инициирует локальную переадресацию портов SSH.

Как использовать удаленную переадресацию портов

Целью удаленной переадресации является предоставление удаленному серверу доступа к ресурсам на вашем локальном компьютере. Удаленная переадресация представляет собой инверсию локального процесса переадресации, который мы исследовали ранее.

Переадресация удаленного порта с помощью OpenSSH

Основной синтаксис команды переадресации удаленного порта выглядит следующим образом:

 ssh -R удаленный_порт:локальный_хост:локальный_порт ssh_server_hostname 

В этом примере мы дали указание удаленному серверу ssh.server.com перенаправлять любые соединения, направленные на порт 8080 , на локальный ресурс, прослушивающий порт 5534 .

 ssh –R 8080:localhost:5534 [email protected] 

Пользователи с доступом к SSH-серверу теперь могут получать доступ к ресурсам на вашем локальном компьютере.

Переадресация удаленного порта с помощью PuTTY

  1. Запустите приложение PuTTY. начальный 9Экран 0184 Sessions позволяет указать IP-адрес и номер порта целевого SSH-сервера.
  1. Используйте список Категория слева, чтобы перейти к Соединение > SSH > Туннели .
  2. Выберите Remote , чтобы определить тип переадресации порта SSH.
  1. Введите номер удаленного порта в поле Исходный порт (например, 8080 ).
  2. Введите адрес назначения и номер порта в Поле Destination в следующем формате: localhost:local_port (например, localhost:5534 ).
  3. Убедившись, что введенная вами информация верна, нажмите Добавить .
  4. Выберите Откройте , чтобы установить удаленную переадресацию портов SSH.

В приведенном выше примере пользователи и приложения могут подключаться к порту 8080 на удаленном сервере SSH, а затем получать доступ к локальному компьютеру через порт 5534.

Как использовать динамическую переадресацию портов

Динамическое перенаправление портов не так хорошо известно, как два предыдущих варианта. Большинству пользователей проще использовать переадресацию локальных портов для достижения аналогичных результатов. Динамическое перенаправление портов может обеспечить большую гибкость, поскольку вам больше не нужно использовать предварительно определенный удаленный порт и сервер.

Примечание: При использовании динамической переадресации портов необходимо настроить отдельные программы для использования прокси-сервера SOCKS.

Динамическая переадресация портов с помощью OpenSSH

С помощью ssh и аргумент –D , вы можете использовать SSH-клиент для создания SOCKS-прокси на локальном компьютере:

 ssh –D local_port ssh_server_hostname 

Следующая команда открывает SOCKS-прокси порт 5534 на вашем локальном компьютере:

 ssh –D 5534 [email protected] 

Теперь вы можете настроить локальный ресурс, например браузер, на использование порта 5534. Весь трафик, исходящий от этого ресурса, направляется через соединения SSH. устанавливается для определенного порта.

Динамическая переадресация портов с помощью PuTTY

  1. Введите имя хоста или IP-адрес и номер порта целевого SSH-сервера на главном экране PuTTY Sessions .
  1. Используйте список Категория для перехода к Соединение > SSH > Туннели .
  2. Выберите Динамический , чтобы определить тип переадресации порта SSH.
  1. Введите номер динамического порта в поле Исходный порт (например, 5534 ). Прокси-сервер SOCKS на вашем локальном компьютере будет использовать этот порт для динамической пересылки трафика.
  2. Убедившись, что введенная вами информация верна, нажмите Добавить .
  3. Теперь все параметры соединения установлены. Выберите параметр Открыть , чтобы запустить динамическую переадресацию портов SSH.

Для работы динамической переадресации необходимо настроить и включить каждое приложение для прокси-сервера SOCKS.