Содержание

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 ro[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.

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

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

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

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

900 02 Ценные сетевые ресурсы обычно не допускают удаленный доступ по 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 9 0010 — Запускает клиентскую программу 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] 

перенаправляется на порт 4492 на удаленном сервере, расположенном по адресу 188.17.0.5.

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

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

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

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

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

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

Базовый синтаксис для 9Команда 0009 remote port forward выглядит следующим образом:

 ssh -R remote_port:localhost:local_port ssh_server_hostname 

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

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

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

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

  1. Запустите приложение PuTTY. Начальный экран 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. Теперь все параметры соединения установлены. Выберите параметр Open , чтобы запустить динамическую переадресацию портов SSH.

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

Примечание: Если вы работаете с Kubernetes, вам может пригодиться наше руководство по kubectl port-forward.

Заключение

В этом руководстве представлены три различных типа переадресации портов SSH, команды, которые необходимо использовать, и способы их реализации в вашей системе.

Перенаправление портов SSH — мощная функция, и ее необходимо тщательно администрировать. Высокие стандарты безопасности должны поддерживаться на протяжении всего процесса.

SSH-туннелирование | Инженерное образование (EngEd) Программа

Туннелирование Secure Shell (SSH), также известное как переадресация портов SSH, — это метод отправки произвольных данных через закодированное соединение SSH. Туннели SSH позволяют подключаться к локальному порту (т. е. к порту на вашем рабочем столе) для передачи на удаленный компьютер по защищенному каналу.

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

Чтобы выполнить туннелирование SSH, нам потребуется выполнить переадресацию портов, чтобы разрешить порт 22. Порт 22 — это порт SSH на нашем маршрутизаторе, который будет перенаправляться на наш общедоступный сервер SSH.

Для обеспечения безопасности наших сетевых служб не все порты доступны напрямую из-за пределов сети Enterprise Network Compute System (ENCS). Если вы находитесь вне офиса и вам нужен доступ к защищенному ресурсу, вы можете использовать SSH для туннелирования через доступный ресурс, чтобы получить доступ к защищенному ресурсу.

В этой статье мы рассмотрим две основные подтемы туннелирования SSH, а именно:

  • Переадресация удаленного порта
  • Переадресация локального порта

Содержание

  • Предпосылки
  • Переадресация локального порта
  • Переадресация удаленного порта
  • Заключение

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

Для выполнения туннелирования SSH вам потребуется следующее:

  • Общедоступный SSH-сервер.
  • Базовое понимание сетей. Вы можете прочитать его на этом сайте Cisco.
  • Доступные ресурсы.
  • Локальное устройство.
  • Удаленное устройство для удаленной переадресации портов.

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

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

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

Изображение ниже демонстрирует переадресацию локального порта:

Источник изображения

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

  • Внутренний ресурс, к которому нам нужен доступ через порт 8080 и IP-адрес 192.168.1.3 .
  • Общедоступный SSH-сервер с IP-адресом 192.168.1.2 и общедоступным IP-адресом 44.11.22.33 на порт 22.
  • Локальное устройство с IP-адресом 10.0.0.4 .
  • Локальный порт 8888.

Наш SSH-сервер и внутренние ресурсы находятся в одной сети. Это означает, что наш общедоступный SSH-сервер имеет доступ к нашим внутренним ресурсам.

Наша локальная машина с IP-адресом 10.0.0.4 находится в совершенно другой сети и не может получить доступ к ресурсам по IP-адресу 192.168.1.3 . Что нам нужно сделать, так это создать туннель SSH между нашей локальной машиной и нашим общедоступным сервером SSH. Это потому, что IP-адрес 44.11.22.33 — общедоступный IP-адрес, а порт 22 — общедоступный открытый SSH-порт.

Синтаксис переадресации локального порта:

 ssh -L <локальный порт>:<удаленный IP-адрес>:<удаленный порт> <публичный IP-адрес сервера ssh>
 

Поясним приведенный выше синтаксис:

  • -L — Это показывает, что мы выполняем переадресацию локального порта.
  • локальный порт — Это порт нашего локального устройства.
  • удаленный IP-адрес — Это IP-адрес нашего удаленного ресурса, к которому нам нужно получить доступ.
  • удаленный порт — Это порт нашего удаленного устройства.
  • IP-адрес общедоступного SSH-сервера — это IP-адрес нашего общедоступного SSH-сервера.

Приведенная ниже команда будет использоваться для переадресации локального порта:

 ssh -L 8888:192.168.1.3:8080 44.11.22.33
 

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

Происходит следующее: сервер SSH будет прослушивать порт 8888 с нашей локальной машины. Любой трафик, который идет на порт 8888 с нашего локального компьютера, перенаправляется на IP-адрес 192.168.1.3 через порт 8080 через общедоступный сервер SSH. В результате устанавливается TCP-соединение с нашим SSH-сервером на нашу машину, потому что он открыт

. Если мы посетим нашу локальную машину по IP-адресу 10.0.0.4 через порт 8888, наша локальная машина сделает запрос через порт 8888, который действует как мини-сервер. Этот порт будет передавать данные в пакет TCP через общедоступный туннель, 44.11.22.33:22 .

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

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

Удаленное перенаправление портов

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

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

Давайте посмотрим на изображение ниже:

Источник изображения

На изображении выше у нас есть:

  • Внутренние ресурсы на IP-адресе 10. 0.0.3 900 43 на порту 8080, к которому мы хотим, чтобы люди имели доступ.
  • Машина с IP-адресом 10.0.0.4 в той же сети, что и наши внутренние ресурсы, в качестве клиента SSH.
  • Общедоступный сервер SSH и удаленный компьютер в одной сети.

Давайте посмотрим на команду ниже:

Синтаксис переадресации удаленного порта:

 ssh -R <удаленный порт>:<локальный IP-адрес>:<локальный порт> <удаленный IP-адрес>
 

Поясним приведенный выше синтаксис:

  • -R - Это показывает, что мы выполняем переадресацию удаленного порта.
  • удаленный порт — это входной порт удаленного порта нашего устройства.
  • локальный IP-адрес — Здесь вводится IP-адрес нашего локального устройства.
  • локальный порт - Здесь ставится локальный порт локального устройства.
  • удаленный IP-адрес — это IP-адрес нашего общедоступного SSH-сервера.

Приведенная ниже команда будет использоваться для выполнения удаленной переадресации портов:

 ssh -R 8888:10.0.0.3:8080 44.11.22.33
 

Приведенная выше команда выполняется на нашей локальной машине, то есть 10.0.0.4 . 8888 — это наш удаленный порт, поэтому общедоступный сервер, к которому мы обращаемся, будет прослушивать этот порт. Конфигурации шлюза должны быть включены на нашем локальном компьютере, чтобы включить переадресацию удаленного порта.

Основная идея здесь заключается в том, что нам нужно, чтобы все, что проходит через порт 8888, перенаправлялось на локальную машину, которая у нас есть на 10.0.0.3 на порту 8080. Что мы будем делать, так это устанавливать TCP-соединение с общедоступным сервером SSH и нашей локальной машиной.

Сервер SSH будет прослушивать порт 8888 для запроса TCP на 44.11.22.33 на том же порту. Сервер SSH примет этот пакет и инкапсулирует его как законный запрос SSH.