Недавно я хотел настроить сеанс совместного использования удаленного рабочего стола с домашнего компьютера на мой ноутбук. Проходя через руководство по настройке, я наткнулся на туннелирование ssh. Несмотря на то, что есть много статей на эту тему, мне потребовалось немало гуглить, немного поэкспериментировать и пару сеансов Wireshark, чтобы понять, что происходит под капотом. Большинство руководств были неполными с точки зрения объяснения концепции, из-за которой я захотел написать хорошую статью на эту тему с некоторыми пояснительными иллюстрациями. Поэтому я решил написать это сам. Так что здесь идет …
Введение
Туннель SSH состоит из зашифрованного туннеля, созданного через соединение по протоколу SSH. Туннель SSH может использоваться для передачи незашифрованного трафика по сети через зашифрованный канал. Например, мы можем использовать туннель ssh для безопасной передачи файлов между FTP-сервером и клиентом, даже если сам протокол FTP не зашифрован. Туннели SSH также предоставляют средства для обхода межсетевых экранов, которые запрещают или фильтруют определенные интернет-сервисы. Например, организация заблокирует определенные сайты, используя свой прокси-фильтр. Но пользователи могут не захотеть, чтобы их веб-трафик отслеживался или блокировался прокси-фильтром организации. Если пользователи могут подключиться к внешнему серверу SSH, они могут создать туннель SSH для переадресации данного порта на своей локальной машине на порт 80 на удаленном веб-сервере через внешний сервер SSH. Я опишу этот сценарий подробно через некоторое время.
Для настройки SSH-туннеля данный порт одной машины должен быть перенаправлен (о котором я собираюсь поговорить чуть позже) на порт другой машины, который будет другим концом туннеля. После того, как SSH-туннель был установлен, пользователь может подключиться к ранее указанному порту на первом компьютере для доступа к сетевой услуге.
Перенаправление порта
Туннели SSH могут быть созданы несколькими способами, используя различные виды механизмов переадресации портов. Порты могут быть перенаправлены тремя способами.
- Переадресация локального порта
- Переадресация удаленных портов
- Динамическая переадресация портов
Я не объяснил, что такое переадресация портов. Я нашел определение Википедии более объяснительным.
Переадресация портов или сопоставление портов — это имя, данное комбинированной технике
- перевод адреса и / или номера порта пакета в новое место назначения
- возможно принятие таких пакетов в фильтре пакетов (межсетевой экран)
- пересылка пакета в соответствии с таблицей маршрутизации.
Здесь первый метод будет использоваться при создании туннеля SSH. Когда клиентское приложение подключается к локальному порту (локальной конечной точке) туннеля SSH и передает данные, эти данные будут перенаправлены на удаленный конец путем преобразования значений хоста и порта в значение удаленного конца канала.
Итак, давайте посмотрим, как можно создать туннели SSH с использованием перенаправленных портов на примерах.
Туннелирование с локальной переадресацией портов
Скажем, yahoo.com блокируется с помощью прокси-фильтра в университете. (Ради этого примера. , Не могу придумать вескую причину, по которой Yahoo будет заблокирован). Туннель SSH может использоваться, чтобы обойти это ограничение. Давайте назовем мою машину в университете как «работу», а мою домашнюю машину как «дом». Для этого «home» должен иметь публичный IP-адрес. И я использую SSH сервер на моей домашней машине. Следующая диаграмма иллюстрирует сценарий.
Чтобы создать SSH-туннель, выполните следующую команду с «рабочей» машины.
1
|
ssh -L 9001:yahoo.com:80 home |
Переключатель «L» указывает, что необходимо создать локальный порт forward. Синтаксис переключения следующий.
1
|
-L < local-port-to-listen >:< remote-host >:< remote-port > |
Теперь SSH-клиент на «работе» будет подключаться к SSH-серверу, работающему на «доме» (обычно работающем на порте 22), привязывая порт 9001 «работы» для прослушивания локальных запросов, создавая туннель SSH между «домом» и «работой» , В конце «home» он создаст соединение с «yahoo.com» на порту 80. Поэтому «work» не нужно знать, как подключиться к yahoo.com. Об этом должен беспокоиться только «дом». Канал между «работой» и «домом» будет зашифрован, а соединение между «домом» и «yahoo.com» будет незашифрованным.
Теперь можно просмотреть yahoo.com, посетив http: // localhost: 9001 в веб-браузере на «рабочем» компьютере. «Домашний» компьютер будет действовать как шлюз, который будет принимать запросы от «рабочего» компьютера и получать данные и туннелировать их обратно. Таким образом, синтаксис полной команды будет следующим.
1
|
ssh -L < local-port-to-listen >:< remote-host >:< remote-port > < gateway > |
Изображение ниже описывает сценарий.
Здесь соединение «хост» с «yahoo.com» осуществляется только тогда, когда браузер делает запрос не во время настройки туннеля.
Также возможно указать порт на самом «домашнем» компьютере вместо подключения к внешнему хосту. Это полезно, если бы я должен был установить сеанс VNC между «работой» и «домом». Тогда командная строка будет выглядеть следующим образом.
1
|
ssh -L 5900:localhost:5900 home (Executed from 'work') |
Итак, что же относится к localhost? Это «работа», так как командная строка выполняется из «работы»? Оказывается, это не так. Как было объяснено ранее, это относится к машине, а не к тому, откуда запущен туннель. Таким образом, будет установлено соединение с портом 5900 «домашнего» компьютера, на котором будет прослушивать клиент VNC.
Созданный туннель может использоваться для передачи всех видов данных, не ограничиваясь сеансами просмотра веб-страниц. Мы также можем туннелировать сессии SSH. Давайте предположим, что есть еще один компьютер («забаненный»), к которому нам нужен SSH из университета, но доступ по SSH блокируется. Можно туннелировать сеанс SSH к этому хосту, используя локальный порт forward. Настройка будет выглядеть следующим образом.
Как можно видеть, теперь передаваемые данные между «работой» и «забаненными» шифруются от начала до конца. Для этого нам нужно создать локальный порт forward следующим образом.
1
|
ssh -L 9001:banned:22 home |
Теперь нам нужно создать сессию SSH на локальный порт 9001, откуда сессия будет туннелирована на «забанен» через «домашний» компьютер.
1
|
ssh -p 9001 localhost |
С этим давайте перейдем к следующему типу метода туннелирования SSH, обратному туннелированию.
Обратное туннелирование с удаленной переадресацией портов
Допустим, необходимо подключиться к внутреннему веб-сайту университета из дома.
Брандмауэр университета блокирует весь входящий трафик. Как мы можем подключиться из «дома» к внутренней сети, чтобы мы могли просматривать внутренний сайт? Настройка VPN является хорошим кандидатом здесь. Однако для этого примера давайте предположим, что у нас нет этой возможности. Введите SSH обратное туннелирование ..
Брандмауэр университета блокирует весь входящий трафик. Как мы можем подключиться из «дома» к внутренней сети, чтобы мы могли просматривать внутренний сайт? Настройка VPN является хорошим кандидатом здесь. Однако для этого примера давайте предположим, что у нас нет этой возможности. Введите SSH обратное туннелирование ..
Как и в предыдущем случае, мы запустим туннель с «рабочего» компьютера за брандмауэром. Это возможно, поскольку блокируется только входящий трафик и разрешен исходящий трафик. Однако вместо более раннего случая клиент теперь будет находиться на «домашнем» компьютере. Вместо опции -L теперь мы определяем -R, который указывает на необходимость создания обратного туннеля.
1
|
ssh -R 9001:intra-site.com:80 home (Executed from 'work') |
После выполнения SSH-клиент при работе подключится к работающему дома SSH-серверу, создав канал SSH. Затем сервер будет привязывать порт 9001 на «домашней» машине для прослушивания входящих запросов, которые впоследствии будут направлены через созданный канал SSH между «домом» и «работой». Теперь можно просматривать внутренний сайт.
посетив http: // localhost: 9001 в домашнем веб-браузере. Затем «работа» создаст соединение с внутрисайтовым узлом и вернет ответ «домой» через созданный канал SSH.
Как это ни странно, вам все равно нужно создать еще один туннель, если вам нужно подключиться к другому сайту в обоих случаях. Разве не было бы неплохо, если бы можно было передавать трафик на любой сайт, используя созданный канал SSH? Вот что такое динамическая переадресация портов.
Динамическая переадресация портов
Динамическая переадресация портов позволяет настроить один локальный порт для туннелирования данных на все удаленные пункты назначения. Однако, чтобы использовать это, клиентское приложение, подключающееся к локальному порту, должно отправлять свой трафик по протоколу SOCKS. На стороне клиента туннеля будет создан прокси-сервер SOCKS, и приложение (например, браузер) использует протокол SOCKS, чтобы указать, куда следует отправлять трафик, когда он покидает другой конец туннеля ssh.
1
|
ssh -D 9001 home (Executed from 'work') |
Здесь SSH создаст прокси-сервер SOCKS, прослушивающий соединения через локальный порт 9001, и после получения запроса маршрутизирует трафик через канал SSH, созданный между «работой» и «домом». Для этого необходимо настроить браузер так, чтобы он указывал на прокси-сервер SOCKS на порту 9001 на локальном хосте.
Ссылка: SSH Tunneling Объяснено от нашего партнера JCG