Туннелирование данных по SSH довольно просто:
ssh -D9999 username@example.com
устанавливает порт 9999 localhost
в качестве туннеля example.com
, но у меня есть более конкретная необходимость:
- Я работаю на местном уровне
localhost
host1
доступно дляlocalhost
host2
принимает только соединения отhost1
- Мне нужно создать туннель от
localhost
доhost2
По сути, я хочу создать SSH-туннель с несколькими прыжками. Как я могу это сделать? В идеале я хотел бы сделать это без необходимости быть суперпользователем на любой из машин.
host2
отказано в переадресацииОтветы:
У вас есть три возможности:
Туннель от
localhost
доhost1
:Как было отмечено выше, соединение от
host1
доhost2
не будет обеспечено.Туннель от
localhost
доhost1
и отhost1
доhost2
:Это откроет туннель от
localhost
кhost1
и другой туннель отhost1
кhost2
. Однако порт9999
дляhost2:1234
может быть использован кем - либо наhost1
. Это может или не может быть проблемой.Туннель от
localhost
доhost1
и отlocalhost
доhost2
:Это позволит открыть туннель от
localhost
до ,host1
через который на SSH сервисhost2
может быть использован. Затем второй туннель открыт сlocalhost
вhost2
течение первого тоннеля.Как правило, я бы выбрал вариант 1. Если необходимо обеспечить подключение от
host1
кhost2
, перейдите к варианту 2. Вариант 3 в основном полезен для доступа к службе, доступ к которой возможенhost2
только отhost2
самого себя.источник
-A
опцию ssh.-f
, он сразу же будет локально задним фоном, таким образомssh -f -L 9999:localhost:9999 host1
, переподключится, если вы нажали ctrl-c в первом случае. Или добавьте-f
к оригинальной команде двойной SSH при первом запуске, чтобы сразу все фоновые.Существует отличный ответ, объясняющий использование
ProxyCommand
директивы конфигурации для SSH :Добавьте это к вашему
~/.ssh/config
(см.man 5 ssh_config
Подробности):Затем
ssh host2
будет автоматически туннелироватьhost1
(также работает с пересылкой X11 и т. Д.)Это также работает для целого класса хостов, например, идентифицированных доменом:
Обновить
OpenSSH 7.3 вводит в
ProxyJump
директиву, упрощая первый примеристочник
ssh
, включаяgit
иsftp
т. Д. Afaik.ssh -F /path/to/altconfig
. Остерегайтесь, это будет игнорировать всю систему/etc/ssh/ssh_config
.OpenSSH v7.3 и выше поддерживает
-J
коммутатор иProxyJump
опцию, которые позволяют один или несколько хостов перехода через запятую, поэтому вы можете просто сделать это сейчас:источник
У нас есть один шлюз SSH в нашей частной сети. Если я нахожусь снаружи и хочу использовать удаленную оболочку на машине внутри частной сети, мне нужно будет подключиться к шлюзу, а оттуда - к частной машине.
Для автоматизации этой процедуры я использую следующий скрипт:
Что случилось:
источник
Прочитав вышесказанное и склеив все вместе, я создал следующий Perl-скрипт (сохраните его как mssh в / usr / bin и сделайте его исполняемым):
Использование:
Чтобы получить доступ к HOSTC через HOSTA и HOSTB (один и тот же пользователь):
Чтобы получить доступ к HOSTC через HOSTA и HOSTB и использовать номера SSH-портов по умолчанию и разных пользователей:
Чтобы получить доступ к HOSTC через HOSTA и HOSTB и использовать X-forwarding:
Чтобы получить доступ к порту 8080 на HOSTC через HOSTA и HOSTB:
источник
mssh HOSTA HOSTD
вы на самом деле окажетесь в HOSTB (и, возможно, не поймете ...)Этот ответ похож на kynan, так как включает использование ProxyCommand. Но использовать ИМО удобнее.
Если у вас на компьютерах прыжков установлен netcat, вы можете добавить этот фрагмент в ~ / .ssh / config:
затем
будет делать то, что вы просили.
Я пришел сюда в поисках оригинального места, где я прочитал этот трюк. Я выложу ссылку, когда найду ее.
источник
Я сделал то, что, как я думаю, ты хотел сделать с
Мне предлагается ввести оба пароля, затем я могу использовать localhost: 9999 для SOCKS-прокси для host2. Это самое близкое, что я могу вспомнить, к примеру, который вы показали в первую очередь.
источник
Привязка означает localhost: 9999, и любой пакет, отправленный localhost: 9999, перенаправляет его на host2: 80
Означает, что любой пакет, полученный host1: 9999, пересылает его обратно на localhost: 9999
источник
channel 3: open failed: administratively prohibited: open failed
сообщение об ошибке.Вы должны быть в состоянии использовать переадресацию портов для доступа к услуге
host2
сlocalhost
. Хороший гид находится здесь . Выдержка:В гипсе, замените
localhost
в примере сhost2
иhost
сhost1
.источник
В этом ответе я рассмотрю конкретный пример. Вам просто нужно заменить имена компьютеров, имена пользователей и пароли на ваши.
Постановка задачи
Предположим, у нас есть следующая топология сети:
Для конкретности предположим, что у нас есть следующие имена компьютеров, имена пользователей и пароли:
Цель: мы хотим создать SOCKS прокси - сервер , который прослушивает порт
9991
изLocalPC
так , что каждый раз , когда соединение поLocalPC
инициируют из порта9991
он проходит черезmit.edu
тоhec.edu
.Пример варианта использования:
hec.edu
имеет HTTP-сервер, доступный только по адресу http://127.0.0.1:8001 , в целях безопасности. Мы хотели бы иметь возможность посетить http://127.0.0.1:8001 , открыв веб-браузер наLocalPC
.конфигурация
В
LocalPC
, добавить в~/.ssh/config
:Затем в терминале
LocalPC
выполните:Он спросит у вас пароль
bob
наmit.edu
(т.е.dylan123
), а затем спросит парольjohn
наhec.edu
(т.е.doe456
).В этот момент, SOCKS прокси теперь работает на порту
9991
сLocalPC
.Например, если вы хотите посетить веб-страницу с
LocalPC
использованием прокси-сервера SOCKS, вы можете сделать это в Firefox:Некоторые замечания:
~/.ssh/config
,HEC
это имя соединения: вы можете изменить его на что угодно.-D9991
Говоритssh
о создании SOCKS4 прокси на порту9991
.источник
Если вы можете использовать SSH на обеих машинах, взгляните на директиву ssh ProxyCommand. Это позволит вам перейти прямо с локального хоста в host2 (одной простой командой, если вы используете открытые ключи !!). Затем вы можете делать все, что вы хотите с host2.
http://www.statusq.org/archives/2008/07/03/1916/
источник
Вариант 2 наилучшего ответа может быть использован с другими пользователями ssh, отличными от текущего aka: user @ host
источник
В моем случае я сделал
где
host2:8890
работает на ноутбуке Jupyter.Затем я настроил Firefox для использования
localhost:9999
в качестве хоста SOCKS.Так что теперь у меня есть ноутбук,
host2
доступный через Firefoxlocalhost:8890
на моей машине.источник
Три варианта, упомянутые в принятом ответе, вообще не сработали. Поскольку у меня нет особых прав на оба хоста, и похоже, что наша команда DevOps имеет довольно строгие правила, когда дело доходит до аутентификации и выполняется MFA. Каким-то образом вышеприведенные команды не могут хорошо работать с нашей аутентификацией.
Контекст действительно похож на приведенные выше ответы: я не могу напрямую подключиться к производственному серверу, и мне нужно сделать 1 прыжок, используя сервер перехода.
Еще одно решение - наивное
В итоге я сделал это очень наивно: вместо того, чтобы пытаться выполнить все команды на своем ноутбуке, я запускаю команды на каждой машине , как показано ниже:
ssh -v -L 6969:localhost:2222 -N your-protected.dest.server
. Если вам будет предложено ввести пароль, введите его.ssh -v -L 6969:localhost:6969 -N your-jump-server.host.name
. Это перенаправит любой ваш запрос через порт 6969 на вашем ноутбуке на сервер перехода. Затем, по очереди, поскольку мы настроили на нашем предыдущем шаге, сервер перехода снова будет пересылать запросы порта 6969 на порт 2222 на защищенном сервере назначения.Вы должны увидеть команду "зависает" там после печати некоторых сообщений - это означает, что они работают! Единственное исключение - вы не должны видеть сообщение об ошибке, например
Could not request local forwarding.
, если вы видите это, то оно все еще не работает :(. Теперь вы можете попытаться запустить запрос на порт 6969 с вашего ноутбука и посмотреть, работает ли оно.Надеюсь, если вы не справились со всеми вышеперечисленными методами, возможно, вы можете попробовать это.
источник