Может ли кто-нибудь просто объяснить SSH-туннель?

Хотя я использую какой-то псевдоним для создания туннеля ssh или обратного туннеля, я никогда не понимаю, как это работает. Кто-нибудь знает, как объяснить это очень просто?

Я думаю, что три основных применения:

Прежде всего, я могу использовать свой домашний компьютер для ssh на foo.mycompany.com без использования пароля ( foo — это рабочий сервер)

  1. Как заставить foo.mycompany.com:8080 перейти на localhost: 3000 моего домашнего компьютера: 3000 ?

  2. Если дома, я не могу получить доступ к http://bar.mycompany.com , но foo может получить доступ bar , как сделать так, чтобы домашний компьютер имел доступ к http://bar.mycompany.com?

  3. Если дома, я не могу получить доступ к базе данных MySQL по адресу db.mycompany.com , но foo может, как сделать это возможным для доступа к db.mycompany.com , также используя ssh туннель.

Может ли это быть объяснить очень простым языком? Есть ли еще какое-нибудь популярное применение помимо этих трех? спасибо.


1) Предполагая, что вы подключаетесь из дома к foo, вам нужен обратный туннель (-R)

  ssh -R 8080: localhost: 3000 foo.mycompany.com  

Это позволит процессам, запущенным в foo, подключаться к localhost: 8080 и разговаривать с вашим домашним компьютером через порт 3000. Если вы хотите, чтобы другие компьютеры на вашей работе могли подключаться к foo: 8080 и получать доступ к вашему домашнему компьютеру через порт 3000, тогда вам нужен

  ssh -R 0.0.0.0:8080:localhost:3000 foo.mycompany.com  

, но для этого работать, вам также понадобится этот параметр для foo sshd_config

  GatewayPorts yes  

2) Лучший способ создать http-прокси с ssh с носками. Сначала подключитесь с помощью

  ssh -D 8888 foo.company.com  

, затем перейдите в настройки подключения вашего браузера и включите прокси-соединение. выберите socks4/5 и host: localhost, порт 8888. Затем просто введите http://bar.mycompany.com в адресной строке браузера.

3 ) Теперь вам нужен переадресация локального порта (-L).

  ssh -L 3333: db.mycompany.com: 3306 foo.mycompany.com  

Это означает, что вы сможете подключиться к localhost: 3333 со своего домашнего компьютера, и все будет перенаправлено на db.mycompany.com: 3306 , как если бы соединение было установлено foo.mycompany.com . Хост db будет видеть foo как подключающийся клиент, поэтому вам необходимо войти в систему с тем же именем пользователя и паролем, которые вы используете при работе из foo.

Добавление флага -g позволит другим компьютерам из вашей домашней сети подключиться к подключитесь к порту вашего компьютера 3333 и получите доступ к db: 3306.

2


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

4


Довольно старый вопрос, но посмотрите, поможет ли эта страница вам его объяснить, на ней красивые картинки и все такое. 🙂

https://www.ssh.com/ssh/tunneling/

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

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

Допустим, между вами и сервером установлен брандмауэр. Сервер может получить доступ к другому серверу (server2) во внутренней сети.

  [client] -------- || ------ [server]  ---- [sever2]  

Допустим, вы хотите получить доступ к веб-серверу на server2 , и по очевидным причинам вы не можете этого сделать это напрямую. Допустим, на брандмауэре открыт порт 22 (ssh). Итак, что нам нужно сделать, это создать SSH-туннель (на сервере ) от server к server2. . Это будет означать, что любой (исходящий?) Трафик на порт 22 будет отправляться через этот туннель с сервера: 22 -> server2: 80 .

  [клиент] -------- || ------ [сервер: 22] ====== [sever2: 80]  

Итак (насколько я понимаю), если мы подключимся к server: 22 , он должен перенаправить трафик с порта 22 на веб-сервер на server2: 80 используя этот новый туннель SSH. (насколько я понимаю, данные зашифрованы только в туннеле, поэтому в конце будут расшифрованы данные, если вам интересно, должен ли server: 80 быть SSL).

Я полагаю С одной стороны, использование SSH само по себе является туннелем SSH для вашей старой связи telnet . Просто в большинстве случаев, когда вы слышите о туннелировании SSH, люди имеют в виду (безопасную) функцию переадресации портов, которую он предлагает, без необходимости иметь доступ к администратору брандмауэра, что является изящной маленькой функцией, которую любят использовать многие хакеры. чтобы обойти безопасность.

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

Надеюсь, это поможет.

EDIT

Обнаружил это в UNIX SO https://unix. stackexchange. com/questions/46235/how-does-reverse-ssh-tunneling-work, множество ответов с очень четкими (и наглядными) объяснениями того, что вам нужно!

1


Прежде всего я объясню SSH:

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

SSH-туннель направляет ваш трафик через безопасное SSH-соединение.

Проще говоря. слова SSH-туннелирование — это не что иное, как одно соединение инкапсулировано другим соединением. Воспользовавшись этим как преимущество, мы создаем туннели с помощью клиента SSH.

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

  ssh -D 8080  пользователь @ sshserverip  



Как работает обратное туннелирование SSH?

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

На основе реверсирования ssh-соединения и туннелирования SSH Сделано проще, обратное SSH-туннелирование можно использовать для обхода надоедливых ограничений брандмауэра.

Я хотел бы выполнять команды оболочки на удаленном компьютере. Удаленная машина имеет собственный межсетевой экран и находится за дополнительным межсетевым экраном (маршрутизатором). У него есть IP-адрес 192.168.1.126 (или что-то подобное). Я не нахожусь за брандмауэром и знаю IP-адрес удаленной машины, видимый из Интернета (а не адрес 192.168.1.126). Кроме того, я могу попросить кого-нибудь сначала выполнить ssh (something) от имени пользователя root на удаленном компьютере.

Может ли кто-нибудь объяснить мне, шаг за шагом, как изменить SSH туннелирование позволяет обойти брандмауэры (брандмауэры локальных и удаленных машин и дополнительный брандмауэр между ними)?

Какова роль переключателей ( -R , -f , -L , -N )?


Мне нравится объяснять подобные вещи с помощью визуализации. 🙂

Думайте о ваших SSH-соединениях как о трубках. Большие трубы. Обычно через эти трубки вы запускаете оболочку на удаленном компьютере. Оболочка запускается в виртуальном терминале (tty). Но вы уже знаете эту часть.

Думайте о своем туннеле как о трубе внутри трубы. У вас все еще есть большое соединение SSH, но опция -L или -R позволяет вам установить внутри него меньшую трубку.

У каждой трубки есть начало и конец. Большая труба, ваше SSH-соединение, начинается с вашего SSH-клиента и заканчивается на SSH-сервере, к которому вы подключились. Все трубы меньшего размера имеют одинаковые конечные точки, за исключением того, что роль «начала» или «конца» определяется тем, использовали ли вы -L или -R (соответственно) для их создания.

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

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

Итак … Чтобы иметь возможность подключаться по SSH из Интернета к машине за брандмауэром, вам необходимо, чтобы эта машина открывала SSH-соединение с внешним миром. world и включите туннель -R , точка входа которого является «удаленной» стороной его соединения.

Из двух моделей, показанных выше, вам нужен один справа.

С хоста с брандмауэром:

  ssh -f -N -T -R22222: localhost: 22 yourpublichost.example.  com  

Это указывает вашему клиенту установить туннель с точкой входа эмоции -R . Все, что подключено к порту 22222 на дальнем конце туннеля, фактически достигнет «порта локального хоста 22», где «локальный хост» с точки зрения точки выхода туннеля (то есть вашего ssh-клиента).

Другие варианты:

  • -f сообщает ssh, чтобы он работал в фоновом режиме после аутентификации, поэтому вам не нужно сидеть вокруг запуска чего-то на удаленном сервере, чтобы туннель оставался активным.
  • -N говорит, что вам нужно SSH-соединение, но на самом деле вы не хотите запускать любые удаленные команды. Если все, что вы создаете, — это туннель, то включение этого параметра позволяет сэкономить ресурсы.
  • -T отключает выделение псевдо-tty, что уместно, потому что вы не пытается создать интерактивную оболочку.

Будет возникать проблема с паролем, если вы не настроили ключи DSA или RSA для входа без пароля.

Обратите внимание, что НАСТОЯТЕЛЬНО рекомендуется использовать одноразовую учетную запись (а не собственную учетную запись), которую вы настроили только для этого туннеля/клиента/сервера.

Теперь из вашей оболочки на yourpublichost , установите соединение с хостом с брандмауэром через туннель:

  ssh -p 22222 username @ localhost  

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

Если вы собираетесь использовать доступ к этому хосту на регулярной основе, вы также можете упростить доступ, добавив несколько строк в свой ~/. ssh/config файл:

  host remotehostname User remoteusername Hostname localhost Port 22222  

Adjust remotehostname и remoteusername в зависимости от ситуации. Поле remoteusername должно соответствовать вашему имени пользователя на удаленном сервере, но remotehostname может быть любым именем хоста, которое вам подходит, оно не должно совпадать с чем-либо разрешаемым.

См. также:

  • Раскрытие обратной конечной точки на не локальном IP
  • Советы по использованию ControlMaster для обслуживания туннеля

Я нарисовал несколько набросков

Машина, на которой вводится команда ssh tunnel, называется »your host« .


Введение

  1. local: -L Указывает, что указанный порт на локальном (клиентском) хосте должен быть перенаправлен на данный хост и порт на удаленной стороне.

    ssh -L sourcePort: forwardToHost: onPort connectToHost означает: подключиться по ssh к connectToHost и перенаправить все попытки подключения к local sourcePort на порт onPort на компьютере с именем forwardToHost , к которому можно получить доступ с машины connectToHost .

  2. remote: - R Указывает, что данный порт на удаленном (серверном) хосте должен быть перенаправлен на данный хост и порт на локальной стороне.

    ssh -R sourcePort : forwardToHost: onPort connectToHost означает: подключиться с помощью ssh к connectToHost и перенаправить все попытки подключения на удаленный sourcePort в порт onPort на компьютере с именем forwardToHost , к которому можно получить доступ с вашего локального компьютера.

Дополнительные параметры

  • -f сообщает ssh самому фоновому режиму после аутентификации, поэтому вам не нужно сидеть вокруг запуска чего-то на удаленном сервере, чтобы туннель оставался живым.
  • -N говорит, что вам нужно SSH-соединение, но на самом деле вы не хотите запускать какие-либо удаленные команды. Если все, что вы создаете, — это туннель, то включение этого параметра позволяет сэкономить ресурсы.
  • -T отключает выделение псевдо-tty, что уместно, потому что вы не пытаюсь создать интерактивную оболочку.

Ваш пример

Третье изображение представляет этот туннель. Но синий компьютер, называемый «ваш хост», представляет компьютер, на котором кто-то запускает туннель ssh, в данном случае машина с брандмауэром.

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

  ssh -R 12345: localhost: 22 YOURIP  

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

  ssh -p 12345 localhost  

, которая будет подключиться к своему собственному localhost (вашему компьютеру) через порт 12345 , но порт 12345 перенаправляется через туннель на порт 22 локального хоста компьютера с брандмауэром (т.е. самого компьютера с брандмауэром).

27


SSH-туннелирование работает с использованием уже установленного ssh-соединения для отправки дополнительного трафика.

Когда вы подключаетесь к удаленному серверу, у вас обычно есть только 1 канал для обычного взаимодействия с пользователем (или 3 канала, если вы считаете STDIN/STDOUT/STDERR отдельными). В любой момент локальный или удаленный процесс ssh может открыть дополнительные каналы в существующем соединении. Эти каналы затем отправляют/получают туннельный трафик. При отправке или получении любого трафика процесс ssh просто говорит: «Этот трафик предназначен для канала foobar».

По сути, он работает так:

  1. Вы говорите ssh начать прослушивание порта XXXX и что любой полученный трафик должен быть туннелирован, а затем установите значение YYYY на порт ZZZZ.
  2. Локальный ssh ​​начинает прослушивание порта XXXX (обычно на 127.0.0.1 , но можно изменить).
  3. Некоторое приложение открывает соединение с портом XXXX на локальном компьютере.
  4. Локальный ssh открывает канал для удаленного ssh и говорит: «Любой трафик на этом канале идет на YYYY: ZZZZ
  5. Удаленный ssh ​​подключается к YYYY: ZZZZ и отправляет обратно« ОК, канал открыт »
  6. Теперь любой трафик, отправляемый через соединение с портом XXXX на локальном компьютере, проксируется ssh на YYYY: ZZZZ.

Этот процесс точно такой же для как прямое, так и обратное туннелирование (просто поменяйте местами слова «локальный» и «удаленный» в описанной выше процедуре). Любая сторона может запустить туннель. л. Этого не должно быть даже при первом запуске ssh. Вы можете открывать туннели, когда ssh уже запущен (см. ESCAPE CHARACTERS , в частности ~ C ).

Для роли -R , -f , -L и -N , вы на самом деле следует просто проконсультироваться со страницей руководства, она дает вам лучшее объяснение. Но я упомяну -R и -L .
-R сообщает удаленному ssh прослушивать подключения, и что локальный ssh ​​должен подключаться к реальному месту назначения. -L указывает локальному ssh прослушивать соединения, и этот удаленный ssh ​​должен подключаться к реальному месту назначения.

Обратите внимание, это очень грубое описание, но оно должно дать вам достаточно информации, чтобы знать, что происходит

0


Это объясняется в руководстве по SSH, особенно различия между -L (локальный) и -R (удаленный).


-L

-L [bind_address:] port: host: hostport

Указывает, что данный порт на локальном (клиентском) хосте должен быть перенаправлен на данный хост и порт на удаленной стороне .

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

При каждом подключении к этому порту соединение пересылается по защищенному каналу, и соединение выполняется к host порту hostport от t удаленная машина .

В следующем примере туннелируется сеанс IRC с клиентской машины 127.0.0.1 ( localhost ) с помощью порта 1234 на удаленный сервер server.example.com :

  $ ssh -f -L 1234: localhost:  6667 server.example.com sleep 10  

Примечание. Параметр -f фон ssh и удаленная команда sleep 10 задается, чтобы дать время для запуска службы, которая должна быть туннелирована.

Пример:

   ssh `-N` -L 22000: localhost: 11000 remote.server.com  
  • -N После подключения просто повесьте там (вы не получите приглашение оболочки)

    Не выполнять удаленную команду.

  • -L 22000 Соединение будет происходить через порт 22000 вашей личной L локальной машины

  • localhost: 11000 remote.s erver.com будет следить за тем, чтобы другой конец туннеля был localhost , порт 11000

Источник: иллюстрированное руководство, учебник, инструкции по туннелированию ssh.


-R

-R [bind_address:] port: host: hostport

Указывает, что указанный порт на удаленном (серверном) хосте должен быть перенаправляется на указанный хост и порт на локальной стороне .

Это работает путем выделения сокета для прослушивания порта на удаленной стороне и всякий раз, когда к этому порту устанавливается соединение, соединение перенаправляется по защищенному каналу, и устанавливается соединение с портом host hostport с локального компьютера .

Пример:

  ssh -N  -R 22000: локальный: 11000 удаленный сервер. com  
  • -N После подключения просто повесьте там (вы не получите приглашение оболочки )

    Не выполнять удаленную команду.

  • - R 22000 Соединение будет происходить через порт 22000 компьютера R emote (в данном случае remote.server.com)

  • localhost: 11000 ваш персональный локальный компьютер будет следить за тем, чтобы другой конец туннеля был localhost , порт 11000

Источник: иллюстрированное руководство, учебное пособие, инструкции по туннелированию ssh.

2


Привязка к сетевым интерфейсам при установке обратных туннелей SSH объясняется в этом посте. Вот пример с 4 компьютерами, находящимися в двух разных сетях:

Оцените статью
clickpad.ru
Добавить комментарий