Туннелирующие данные по SSH довольно просты:
ssh -D9999 username@example.com
настраивает порт 9999 на Вашем localhost
как туннель к example.com
, но у меня есть более определенная потребность:
localhost
host1
доступно для localhost
host2
только принимает соединения от host1
localhost
кому: host2
Эффективно, я хочу создать "мультитранзитный участок" туннель SSH. Как я могу сделать это? Идеально, я хотел бы сделать это, не будучи должен быть суперпользователем на любой из машин.
У Вас в основном есть три возможности:
Туннель от localhost
кому: host1
:
ssh -L 9999:host2:1234 -N host1
Как отмечено выше, соединение от host1
кому: host2
не будет защищен.
Туннель от 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
. Это может или не может быть проблемой.
Туннель от 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
самостоятельно.
У нас есть один ssh шлюз в нашу частную сеть. Если бы я снаружи и хочу удаленную оболочку на машине в частной сети, я имел бы к ssh в шлюз и оттуда к частной машине.
Для автоматизации этой процедуры я использую следующий сценарий:
#!/bin/bash
ssh -f -L some_port:private_machine:22 user@gateway "sleep 10" && ssh -p some_port private_user@localhost
Что происходит:
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
необходимо смочь использовать перенаправление портов для доступа к сервису на 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
.
Если Вы можете SSH в обе машины, смотреть на директиву ProxyCommand ssh. Это позволит Вам пойти прямо от localhost в host2 (в одной легкой команде при использовании открытых ключей!!). Затем можно сделать то, что Вы хотите с host2.
Существует превосходный ответ, объясняя использование 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