Что такое ssh туннель. Как работает SSH-туннелирование. Проброс порта через SSH туннель на порт удалённой машины

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

Введение

Через SSH создает безопасное соединение между локальным компьютером и удаленной машиной, через которую могут быть переданы службы. Поскольку соединение зашифровано, SSH-туннелирование полезно для передачи информации, которая использует незашифрованный протокол, такой как IMAP, VNC или IRC.

SSH-туннель Windows использует порт 22, чтобы обеспечить шифрование данных, передаваемых через общедоступную сеть (например, Интернет), тем самым предоставляя функции VPN. IPsec имеет сквозной транспортный режим, но также может работать в режиме туннелирования через надежный шлюз безопасности.

Определение

Туннель через SSH является стандартом для безопасного удаленного входа в систему и передачи файлов по ненадежным сетям. Он также обеспечивает способ защиты трафика данных любого конкретного приложения с использованием переадресации портов, в основном туннелирования любого порта TCP/IP через SSH. Это означает, что трафик направлен на поток внутри зашифрованного SSH-соединения, чтобы он не мог прослушиваться или перехватываться, пока находится в пути. SSH-туннелирование позволяет добавить сетевую безопасность к устаревшим приложениям, которые не поддерживают шифрование.

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

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

Протоколы туннелирования — что это?

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

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

Secure Shell — безопасная передача данных

Состоит из зашифрованного туннеля, созданного через соединение протокола SSH. Пользователи могут настроить туннели SSH для передачи незашифрованного трафика по сети через зашифрованный канал. Например, компьютеры Microsoft Windows могут обмениваться файлами с использованием протокола сервера сообщений (SMB), незашифрованного протокола.

Если вы хотите удаленно подключить файловую систему Microsoft Windows через Интернет, кто-то, следящий за соединением, может видеть переданные файлы. Чтобы безопасно подключить файловую систему Windows, можно установить туннель SSH, который направляет весь SMB-трафик на удаленный файловый сервер через зашифрованный канал. Несмотря на то что сам протокол SMB не содержит шифрования, зашифрованный SSH-канал, через который он перемещается, обеспечивает безопасность.

Типы переадресации портов

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

Существует три типа переадресации портов с SSH:

    локальная — соединения с SSH-клиента перенаправляются на SSH-сервер, а затем на целевой сервер;

    удаленная — соединения с SSH-сервера перенаправляются через SSH-клиент, а затем на целевой сервер;

    динамическая — соединения из различных программ пересылаются через SSH-клиент, затем через SSH-сервер и, наконец, на несколько целевых серверов.

Локальная переадресация портов является наиболее распространенным типом и, в частности, позволяет обойти брандмауэр компании, который блокирует "Википедию".

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

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

Технические особенности

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

Примеры реализации

Лучший способ понять, как это работает — рассмотреть пример с локальной переадресацией. Представьте, что вы находитесь в частной сети, которая не позволяет подключаться к определенному серверу. Предположим, вы на работе, и vk.com заблокирован. Чтобы обойти блокировку, мы можем создать туннель через сервер, который не находится в нашей сети и, таким образом, может получить доступ к требуемому ресурсу: $ ssh -L 9000: vk.com: 80 [email protected].

Ключевым моментом здесь является -L, в котором говорится, что мы выполняем локальную переадресацию портов. Затем команда сообщает, что мы пересылаем наш локальный порт 9000 на vk.com:80, который является портом по умолчанию для HTTP. Теперь необходимо открыть свой браузер и перейти по адресу http://localhost: 9000.

Неоспоримое преимущество SSH-туннелей заключается в том, что они зашифрованы. Никто не увидит, какие сайты вы посещаете — будут видны только SSH-соединения с сервером.

Подключение к базе данных за брандмауэром

Еще один хороший пример: если вам нужно получить доступ к порту на вашем сервере, к которому это можно сделать только с локального хоста, а не удаленно.

Примером здесь является необходимость подключения к консоли базы данных, которая позволяет только локальное подключение по соображениям безопасности. Допустим, вы используете PostgreSQL на своем сервере, который по умолчанию прослушивает порт 5432: $ ssh -L 9000: localhost: 5432 [email protected].

Часть, которая здесь изменилась, - localhost: 5432, в которой говорится о переадресации соединений с вашего локального порта 9000 на localhost: 5432 и на ваш сервер. Теперь мы можем просто подключиться к нашей базе данных: $ psql -h localhost -p 9000.

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

Теперь объясним на реальном примере работу удаленной переадресации. Допустим, вы разрабатываете приложение Rails на своей локальной машине, и хотите показать его другу. К сожалению, ваш интернет-провайдер не предоставил вам публичный IP-адрес, поэтому невозможно напрямую подключиться к ПК через Интернет.

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

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

$ ssh-R 9000: localhost: 3000 [email protected]

Синтаксис здесь очень похож на локальную переадресацию портов, с одной заменой -L на -R. Но, как и при локальной переадресации портов, синтаксис остается неизменным.

Сфера применения и риски

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

Туннелирование часто используется вместе с ключами PHP SSH-туннеля и аутентификацией открытого ключа для полной автоматизации процесса.

Преимущества

Продажа SSH-туннелей широко используются во многих корпоративных средах, которые используют системы мейнфреймов в качестве своих приложений. В этих средах сами приложения могут иметь очень ограниченную поддержку для обеспечения безопасности. Используя туннелирование, совместимость с SOX, HIPAA, PCI-DSS и другими стандартами, может быть достигнута без необходимости изменения приложений.

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

Риски

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

Киберпреступники или вредоносное ПО могут использовать брут SSH-туннелей для скрытия своих несанкционированных сообщений или для извлечения похищенных данных из целевой сети.

В SSH-туннельной атаке злоумышленник устанавливает сервер за пределами целевой сети (например, в Amazon AWS). Как только мошенник оказывается в целевой системе, он подключается к внешнему серверу SSH изнутри. Большинство организаций разрешают исходящие соединения в SSH-туннеле Linux, по крайней мере, если они имеют серверы в общедоступном облаке. Это SSH-соединение настроено с опцией, которая позволяет производить пересылку TCP-порта из порта на внешнем сервере в SSH-порт на сервере во внутренней сети. Для настройки этого туннеля SSH требуется одна однострочная команда внутри, и ее можно легко автоматизировать. Большинство брандмауэров практически не защищают от него.

Помимо своей основной функции, протокол SSH предоставляет администратору массу полезных инструментов, в этой статье речь пойдёт о создании VPN-туннеля с помощью SSH .
SSH-туннелирование - самый простой и быстрый способ получить туннель к Linux-серверу, т.к. пакет OpenSSH на нём, скорее всего, уже установлен, к тому же, полученный туннель не будет иметь проблем с NAT.

Такой туннель является простым, но не является надёжным, т.к. использует TCP-соединение и не содержит встроенных механизмов для восстановления соединения после разрыва.
SSH-туннель лучше использовать для тестирования (например, если вам нужно передавать UDP-пакеты на удалённый сервер, проброс портов по SSH в этом случае не поможет), а для постоянных туннелей использовать протоколы, специально разработанные для этого, такие как OpenVPN, PPTP, L2TP, IPSec, GRE и т.д. (Все примеры команд в статье верны для CentOS 6)

Установка и настройка

Устанавливаем пакет OpenSSH из репозиториев, если он всё ещё не установлен:

yum install openssh openssh-server openssh-clients

Для того, чтобы сервер разрешал использование туннелей, нужно включить в файле настроек OpenSSH-сервера (обычно /etc/ssh/sshd_config) опцию PermitTunnel и перезапустить OpenSSH-сервер (service sshd restart).

PermitTunnel yes

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

Host ...
или
Match ...

Опцию PermitTunnel нужно добавлять до описанных разделов.

Использование SSH-туннелей

Для всех примеров будет использоваться OpenSSH-сервер доступный по адресу 192.168.1.100.

Простой SSH-туннель

Для создания самого простого SSH-туннеля можно выполнить команду

sudo ssh -w 7:7 -l root 192.168.1.100

За создание туннеля отвечает опция

W <номер_локального_интерфейса>:<номер_удалённого_интерфейса>

Вместо номера локального и/или удалённого интерфейса можно использовать значение «any», тогда будет создан следующий по порядку незанятый TUN-интерфейс.

После прохождения аутентификации sudo и SSH на локальном и на удалённом хостах должен появиться отключенный интерфейс tun7.

Для использования туннеля нужно включить интерфейсы и настроить на них IP-адреса из одной подсети, например, так:

# на локальном хосте
# на удалённом хосте

Теперь с локального хоста будет доступ на удалённый хост по адресу 10.255.255.1 через шифрованный туннель (при условии того, что файрволы локального и удалённого хостов пропустят эти соединения).

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

SSH-туннель с правами непривилегированного пользователя

Для того, чтобы создать SSH-туннель с правами непривилегированного пользователя, нужно предварительно создать TUN-интерфейс, принадлежащий этому пользователю (для создание TUN-интерфейса в любом случае понадобятся права суперпользователя на удалённом хосте).
Для создания TUN-интерфейса в более старых дистрибутивах Linux используется инструмент tunctl (должен быть доступен из репозиториев дистрибутива), в более новых дистрибутивах этот функционал включен в пакет iproute2. Для определения того, каким способом нужно создавать TUN-интерфейс на вашем хосте, выполните команду

Если команда выдаст ошибку

Object "tuntap" is unknown, try "ip help".

Значит нужно использовать инструмент tunctl, предварительно установив его (yum install tunctl), в противном случае, команда должна выдать список TUN/TAP-интерфейсов на хосте.

Переходим к настройке .

Создаём непривилегированного пользователя на удалённом хосте:

useradd ssh_tunnel

Создаём TUN-интерфейс, принадлежащий этому пользователю

С помощью tunctl:

tunctl -n -t tun7 -u ssh_tunnel -g ssh_tunnel

С помощью iproute2:

ip tuntap add dev tun7 mode tun user ssh_tunnel group ssh_tunnel

Подключение SSH-туннеля выполняется аналогично предыдущему примеру:

# на локальном хосте
sudo ssh -w 7:7 -l ssh_tunnel 192.168.1.100
ifconfig tun7 up 10.255.255.2 pointopoint 10.255.255.1
# на удалённом хосте
ifconfig tun7 up 10.255.255.1 pointopoint 10.255.255.2

Создание пользователя только для SSH-туннелирования

В данном пункте будет рассмотрен запрет использования консоли непривилегированным пользователем в то время, как SSH-туннелирование для этого пользователя будет разрешено. Установить для пользователя оболочку «/bin/false» или «/sbin/nologin» не получится, т.к. в этом случае пользователь вообще не сможет установить SSH-соединение.

Для ввода описанных ограничений нужно добавить в конец файла настроек OpenSSH-сервера (/etc/ssh/sshd_config) указанные ниже строки и перезагрузить OpenSSH-сервер (service sshd restart)

Match User ssh_tunnel
X11Forwarding no
AllowTcpForwarding yes
AllowAgentForwarding no
GatewayPorts no
ForceCommand echo "This account can only be used for tunneling"; cat

Ограничение в этом примере вводится для созданного ранее пользователя ssh_tunnel. Параметр ForceCommand заставляет пользователя автоматически выполнять команду «echo "This account can only be used for tunneling"; cat» сразу после подключения. Это не даст пользователю использовать консоль нормальным образом, т.к., если убить процесс cat нажатием Ctrl+C, SSH-соединение будет разорвано.

В данной статье будет описано как строить SSH–туннели с помощью PuTTY.

1. Локальный проброс порта

Рассмотрим следующую ситуацию. Мы находимся внутри корпоративной сети, у нашего компьютера адрес 192.168.0.2, доступ во внешний мир полностью закрыт (то есть никакого NAT–а, proxy и т.п.). Влиять на политику ограничения доступа у нас возможности нет, но зато есть SSH–доступ на один из серверов с маршрутизируемым IP–адресом, который доступен из Интернет. Внутренний адрес этого сервера, пусть будет для примера 192.168.0.3. Структура сети изображена на рисунке:

Предположим, что нам очень нужно подключиться, к примеру, по SSH на некоторый удалённый сервер с IP–адресом 212.212.212.212 где–то далеко в Интернет. Для этого запускаем PuTTY, создаём SSH–подключение к серверу 192.168.0.3 (далее по тексту SSH–сессия 1), идём в пункт Tunnels:

и указываем, что локальный порт 2222 нашего компьютера должен быть поставлен в соответствие порту 22 на сервере с IP–адресом 212.212.212.212. Далее жмём кнопку «Open», авторизуемся на сервере 192.168.0.3. Затем создаём ещё одно подключение (далее по тексту SSH–сессия 2), но уже на localhost, порт 2222 и жмём кнопку «Open»:

В результате SSH–сессия 2 будет туннелироваться (т.е. будет установлена внутри ранее установленной SSH–сессии 1). Для удалённого сервера 212.212.212.212 всё будет выглядеть так, как будто к нему подключается 111.111.111.111:

2. Удалённый проброс порта

В этом случае подключение внутри SSH–туннеля устанавливается в другую сторону - от удалённого сервера на наш локальный компьютер. Может быть полезно, если требуется открыть доступ к локальным сервисам нашего компьютера. Рассмотрим ту же сеть, что и в пункте 1, но для простоты предположим, что теперь у нас есть NAT:

Здесь уже у нас есть возможность подключаться через SSH напрямую к 212.212.212.212 благодаря наличию NAT–а. А вот 212.212.212.212 подключиться на 192.168.0.2 без специальных ухищрений, понятное дело, не сможет, т.к. 192.168.0.2 не подключён к Интернет непосредственно. Предположим, что пользователю, сидящему под X–ами на 212.212.212.212 нужно через remote desktop попасть на наш компьютер 192.168.0.2. Для этого в SSH–сеансе подключения с 192.168.0.2 на 212.212.212.212 нужно изменить настройки в разделе Tunnels следующим образом:

#lsof -i -nP | grep 3333 sshd 18598 avz 11u IPv4 592868957 TCP 127.0.0.1:3333 (LISTEN)

То есть sshd ожидает подключений на TCP–порт 3333, которые затем по SSH–туннелю будут перенаправлены на 192.168.0.2 порт 3389. И юзер сидящий за 212.212.212.212 сможет с помощью rdesktop увидеть наш рабочий стол:

3. Socks–proxy

В этом случае мы можем использовать сервер с SSH–демоном как промежуточный (proxy). Схема сети как в случае #1 (без NAT и штатных прокси):

Чтобы заставить PuTTY исполнять роль socks–прокси, нужно параметры SSH–сессии с 192.168.0.2 на 192.168.0.3 изменить следующим образом:

C:\>netstat -ano | find "1080" TCP 127.0.0.1:1080 0.0.0.0:0 LISTENING 2392 C:\>tasklist | find /i "2392" putty.exe 2392 Console 0 5420 КБ

То есть putty, выполняющийся с PID–ом 2392, начинает слушать порт 1080, ожидая подключений. Далее бёрем любое приложение, умеющее работать с SOCKS–прокси, например Firefox, и указываем ему использовать наш прокси:

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

P.S. Из help–файла Putty 0.58:

Question A.10.3: What does «PuTTY» mean?

It"s the name of a popular SSH and Telnet client. Any other meaning is in the eye of the beholder. It"s been rumoured that «PuTTY» is the antonym of «getty», or that it’s the stuff that makes your Windows useful… :)

Please enable JavaScript

© 2009–2019, сайт - При использовании материалов сайта желательно указывать источник. Спасибо!

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

Рассмотрим создание и настройку по нескольким вариантам.

И так, у нас имеется сервер, назовём его host-1 . К нему у нас есть полный доступ только по SSH — но нам необходимо открыть Tomcat , работающий на порту 8082 — к которому нас никак пропустить не могут.

Рассматривать вариант будем с настройкой Windows и Putty .

Открываем SSH -соединение к нужному серверу, логинимся.

Указываем такие параметры:

Source port: любой неиспользуемый порт в вашей системе;
Destination port: 127.0.0.1:8082

Жмём Add , потом Apply .

Переходим в настройки браузера, и устанавливаем параметры прокси:

Теперь остаётся в браузере открыть страницу http://localhost:3002 — и попадаем на страницу Tomcat на сервере host-1 .

Если туннель не работает — проверьте на сервере, включена ли пересылка пакетов. В файле /etc/ssh/sshd_config найдите и раскоментируйте строку:

AllowTcpForwarding yes

И перезапустие SSHd:

# service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ]

Ещё один пример — у нас есть тот же внешний сервер, с которого есть нормальный доступ к любым ресурсам в Сети. А вот с рабочего места у нас доступ к и закрыт.

Выполняем похожие действия, но с небольшими отличиями. Настройки в Putty :

Source port — оставляем прежний, но вместо Local — выбираем Dynamic . Нажимаем Add , Apply .

Переходим к настройкам браузера:

Обратите внимание, что тип прокси тут не HTTP — а SOCKS .

Наслаждаемся доступом к любимым сайтам.

И более интересный случай.

Имеем прежний host-1 . Кроме него — второй сервер, назовём его host-2 . Кроме этого — у нас есть машина с Windows , которой необходимо предоставить доступ к ресурсу TeamCity на сервере host-1 на порту 8111. При этом — доступ с Windows -машины у нас есть только к серверу host-2 , и только на 22-ой порт.

Для начала — поднимаем туннель между host-1 и host-2 . Выполняем на host-1 :

$ ssh -f -N -R host-2:8082:localhost:8111 username@host-2

Так мы открываем туннель, который локально (на host-1 ) смотрит на порт 8111 , а с другой стороны — машина host-2 , на которой открывается порт 8082 , и ждёт входящих соединений. При получении пакетов на порт 8082 (при чём — только по интерфейсу lo0 ! это важно) — он будет их перенаправлять на машину host-1 порт 8111 .

Что касается интерфейса lo0 . При установлении SSH -туннеля, даже при указании внешнего IP машины — соединение поднимается только с localhost , т.е. 127.0.0.1 .

Посмотрим на host-2 :

$ netstat -anp | grep 8082 tcp 0 0 127.0.0.1:8082 0.0.0.0:* LISTEN -

Что бы изменить это — необходимо отредактировать файл конфигурации демона sshd — /etc/ssh/sshd_config и изменить параметр:

#GatewayPorts no

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

Продолжим. Переходим к настройке Putty на нашей Windows -машине. Тут всё просто — пользуемся примером 1 из этой статьи, только меняем порт на нужный (в скриншоте, кстати, он и есть). Подключаемся Putty к хосту host-2 , настраиваем tunnel . В браузере меняем настройки proxy — и получаем необходимое, указываем адрес http://localhost:3002:

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

Что бы избежать этого — можно либо поиграться с параметрами в файле настроек sshd — /etc/ssh/sshd_config:

#TCPKeepAlive yes #ServerAliveInterval #ServerAliveCountMax

Либо — воспользоваться утилитой autossh.

SSH туннелирование пригодится для обхода неких ограничений установленных брандмауэром или же просто для создания безопасного туннеля передачи данных. Кроме прямого SSH туннелирования можно также сделать проброс данных с локального порта через SSH туннель на некий порт некой удалённой машины или наоборот.

Как в случае прямого SSH туннелирования так и с пробросом порта, на одной из сторон всегда должен быть установлен рабочий SSH сервер! SSH туннелирование даёт возможность бродить по сети от имени того компьютера, к которому был организован SSH туннель. Например если у нас имеется доступ к SSH где-то в Зимбабве, то при помощи SSH туннеля мы можем лазить по сети от имени Зимбабве:)

Прямое SSH туннелирование

Что имеется ввиду под "Прямое SSH туннелирование "? Прямое SSH туннелирование это когда SSH клиент запускается в режиме sock-proxy (опция -D ) и соединившись с удалённой машиной по SSH протоколу передает через неё (удалённую машину ) TCP трафик, например сессия прямого SSH туннеля с удалённой машиной через консольный SSH клиент (OpenSSH ) в Windows:

C:\OpenSSH\bin> ssh -D 4444 -p 28666 user@ remotehost.com The authenticity of host "remotehost.com (96.172.128.114)" cant be establishe d. RSA key fingerprint is 5e:ea:62 :5f:fc:3b:b2:38 :d6:ba:6b:aa:65 :3f:d4:35 . Are you sure you want to continue connecting (yes/ no) ? y Please type "yes" or "no" : yes Warning: Permanently added "remotehost.com,96.172.128.114" (RSA) to the list o f known hosts. user@ remotehost.com password: Last login: Thu Feb 7 03:34 :45 2013 from 108.95.46.202 [ user@ remotehost ~] $

Запуская SSH клиент с опцией -D 4444 мы повелеваем ему после запуска прослушивать локальный порт 4444 и после подключения к удалённому хосту remotehost.com, на удалённый порт -p 28666 и с именем пользователя user, отправлять наш TCP трафик к месту назначения от своего имени - т.е. от имени remotehost.com с ИП 96.172.128.114.

Проброс порта через SSH туннель на порт удалённой машины

В этом случае, после подключения по SSH протоколу с удалённой машиной [email protected], данные с локального порта через SSH туннель удаленной машины будут переданы будут переданы дальше на некий порт некой удалённой машины, например прокси-серверу. Выглядит это примерно так:

ssh -L [ bind_address:] port:host:hostport -p 28666 user@ remotehost.com

Аналогично предыдущему примеру с той лишь разницей, что конечной точкой пересылающей/принимающей наш TCP трафик будет не [email protected], а некий host:hostport

Есть также вариант проброса TCP трафик с удалённого порта удалённой машины [email protected] на локальный порт локальной машины или ещё куда-нибудь.

ssh -R [ bind_address:] port:host:hostport -p 28666 user@ remotehost.com

В консольных ssh клиентах для Unix подобных ОС есть ещё одна полезная опция -C (Requests compression of all data ) для сжатия данных, которая отсутствует в ssh клиенте (OpenSSH ) для Windows, но есть в PLINK.EXE от PuTTY .

В качестве SSHD для Windows можно предложить WinSSHD , а в качестве консольного SSH клиента под Windows OpenSSH соответственно или на худой конец PLINK.EXE от PuTTY .

SSH тунель в PuTTY

Для использования в PuTTY SSH туннелирования в настройках " Сonnection -> SSH -> Tunnels " введите:

Source port: 4444 Destination: localhost:4444

Отметьте пункт " Dynamic " и нажмите " Add ". В " Session " укажите нужное " Host Name " имя хоста, укажите SSH протокол и сохраните настройки выбрав в " Saved Sessions " подходящее имя, ну, например, " HostName aka ssh tunnel on 4444 " и сохраните " Save ", после чего двойным кликом на этом имени установите соединение.

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

Вложенные SSH туннели

Допускаются вложенные SSH туннели, например:

ssh -L [ bind_address:] port:host:hostport -p 28666 user@ remotehost1.com \ ssh -L [ bind_address:] port:host:hostport -p 28666 user@ remotehost2.com ssh -L 192.168.0.2:8080 :127.1 :9999 user@ 8.8.8.8 \ ssh -L 127.1 :9999 :127.1 :80 user2@ 10.1.1.2

В этом примере (рисунок ниже ) мы бросаем данные с порта 8080 компьютера "А" (192.168.0.2 ), на локальный хост и порт 9999 компьютера "Б" (8.8.8.8 ), а сразу после подключения к компьютеру "Б" (8.8.8.8 ) запускаем на нём ssh клиент, принимаем данные (127.1:9999 ) и бросаем их дальше на локальный хост 127.1:80 компьютера внутренней сети 10.1.1.2.

Реверс сокс-прокси. По идее офицеры службы безопасности, которые озабочены запретом Интернета на машине 10.1.1.2, должны повыдёргивать на попе все волосы, ибо приведённая ниже команда должна организовать доступ к сети Интернет для машины 10.1.1.2 через сокс-прокси, который запущен на машине «А».

ssh -D 8080 -R 127.1 :8080 :127.1 :8080 user@ 8.8.8.8 \ ssh -R 127.1 :8080 :127.1 :8080 user@ 10.1.1.2

Конфигурация SSHD

Для гарантированного обхода ограничений фаервола можно в конфигурации SSHD демона /etc/ssh/sshd_config открыть сразу несколько портов , т.е. SSHD будет принимать запросы сразу по нескольким портам, например.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: