SSH туннелирует через несколько транзитных участков

Туннелирующие данные по SSH довольно просты:

ssh -D9999 username@example.com

настраивает порт 9999 на Вашем localhost как туннель к example.com, но у меня есть более определенная потребность:

  • Я работаю локально над localhost
  • host1 доступно для localhost
  • host2 только принимает соединения от host1
  • Я должен создать туннель из localhost кому: host2

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

343
задан 22.07.2017, 03:44

6 ответов

У Вас в основном есть три возможности:

  1. Туннель от localhost кому: host1:

    ssh -L 9999:host2:1234 -N host1
    

    Как отмечено выше, соединение от host1 кому: host2 не будет защищен.

  2. Туннель от localhost кому: host1 и от host1 кому: host2:

    ssh -L 9999:localhost:9999 host1 ssh -L 9999:localhost:1234 -N host2
    

    Это откроет туннель от localhost кому: host1 и другой туннель от host1 кому: host2. Однако порт 9999 кому: host2:1234 может использоваться любым на host1. Это может или не может быть проблемой.

  3. Туннель от localhost кому: host1 и от localhost кому: host2:

    ssh -L 9998:host2:22 -N host1
    ssh -L 9999:localhost:1234 -N -p 9998 localhost
    

    Это откроет туннель от localhost кому: host1 через который сервис SSH на host2 может использоваться. Затем второй туннель открыт от localhost кому: host2 через первый туннель.

Обычно, я пошел бы с опцией 1. Если соединение от host1 кому: host2 потребности, которые будут защищены, пойдите с опцией 2. Опция 3 главным образом полезна для доступа к сервису на host2 это только достижимо от host2 самостоятельно.

333
ответ дан 16.12.2019, 22:45

У нас есть один ssh шлюз в нашу частную сеть. Если бы я снаружи и хочу удаленную оболочку на машине в частной сети, я имел бы к ssh в шлюз и оттуда к частной машине.

Для автоматизации этой процедуры я использую следующий сценарий:

#!/bin/bash
ssh -f -L some_port:private_machine:22 user@gateway "sleep 10" && ssh -p some_port private_user@localhost

Что происходит:

  1. Установите туннель для ssh протокола (порт 22) к частной машине.
  2. Только если это успешно, ssh в частную машину с помощью туннеля. (&& оператор гарантирует это).
  3. После закрывания частного ssh сеанса я хочу, чтобы туннель ssh закрылся, также. Это сделано через "сон 10" приемов. Обычно, первая команда ssh закрылась бы после 10 секунд, но в это время, вторая команда ssh установит соединение с помощью туннеля. В результате первая команда ssh сохраняет туннель открытым, пока следующие два условия не удовлетворены: сон 10 закончен, и туннель больше не используется.
20
ответ дан 16.12.2019, 22:45
ssh -L 9999:host2:80 -R 9999:localhost:9999 host1

- L 9999:host2:80

Средства связывают с localhost:9999, и любой пакет, отправленный в localhost:9999, передают его host2:80

- R 9999:localhost:9999

Средства любой пакет, полученный host1:9999, передают его назад localhost:9999

4
ответ дан 16.12.2019, 22:45

необходимо смочь использовать перенаправление портов для доступа к сервису на host2 от localhost. Хорошее руководство расположено здесь. Выборка:

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

Например, если Вы даете команду

ssh2 -L 1234:localhost:23 username@host

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

Передача удаленного порта делает противоположное: это вперед трафик, прибывающий в удаленный порт к указанному локальному порту.

Например, если Вы даете команду

ssh2 -R 1234:localhost:23 username@host

весь трафик, который прибывает в порт 1234 на сервере (хост), будет передан для портирования 23 на клиенте (localhost).

В Вашем броске, замене localhost в примере с host2 и host с host1.

2
ответ дан 16.12.2019, 22:45

Если Вы можете SSH в обе машины, смотреть на директиву ProxyCommand ssh. Это позволит Вам пойти прямо от localhost в host2 (в одной легкой команде при использовании открытых ключей!!). Затем можно сделать то, что Вы хотите с host2.

http://www.statusq.org/archives/2008/07/03/1916/

0
ответ дан 16.12.2019, 22:45

Существует превосходный ответ, объясняя использование ProxyCommand конфигурационная директива для SSH:

Добавьте это к Вашему ~/.ssh/config (см. man 5 ssh_config для деталей):

Host host2
  ProxyCommand ssh host1 -W %h:%p

Затем ssh host2 автоматически туннелирует через host1 (также работы с X11, передающим и т.д.).

Это также работает на весь класс хостов, например, определенный доменом:

Host *.mycompany.com
  ProxyCommand ssh gateway.mycompany.com -W %h:%p

Обновление

OpenSSH 7.3 представляет a ProxyJump директива, упрощая первый пример до

Host host2
  ProxyJump host1
155
ответ дан 16.12.2019, 22:45

Теги

Похожие вопросы