2

У меня есть две машины, A и C, каждая из которых находится за брандмауэром, поэтому они не могут принимать входящие запросы SSH через порт 22. У меня есть третья машина, B, вне обоих межсетевых экранов, и я хотел SSH от A до C, используя B. Я могу сделать то, что я думаю, называется SSH туннелем из C -> B, вот так

ssh -fNR 10000:localhost:22 -i key_file_for_B_on_C user_on_B@B

Следуя тому, что выглядит почти так, как я хочу в этом вопросе, я теперь пробую команду:

ssh -ti key_file_for_C_on_A -l user_on_C -o "ProxyCommand ssh -ti key_file_for_B_on_A -W %h:%p user_on_B@B" -p 10000 B

Это не похоже на работу, я получаю ошибку:

channel 0: open failed: connect failed: Connection timed out

Это правильный подход? Что я могу делать не так?

1 ответ1

2

Я думаю, что проблема с вашим примером - последние аргументы; вы ssh к B, когда вы должны перечислить "конечный пункт назначения", хотя хост / порт, перенаправленный на порт, это порт 10000, но должен быть localhost , а не B , так как B разрешается с точки зрения A , и порт 10000 на B , вероятно, не открыт внешне. Например, исправлено:

ssh -ti key_file_for_C_on_A -l user_on_C -o "ProxyCommand ssh -ti key_file_for_B_on_A -W %h:%p user_on_B@B" -p 10000 localhost

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

На C:

ssh -fNAR 12345:localhost:22 hophost -p 2222

Тогда на А:

ssh -A localhost -p 12345 -o "ProxyCommand ssh -A hophost -p 2222 nc %h %p"

В качестве альтернативы, вы можете закодировать это в свой .ssh/config на A:

Host C
  HostName localhost
  Port 12345
  ForwardAgent yes
  #ProxyCommand ssh -A hophost -p 2222 nc %h %p
  ProxyCommand ssh -A hophost -p 2222 -W %h:%p
  #ProxyCommand $HOME/.ssh/proxy -w 2 -h hophost:2222 %h %p

Тогда ваша команда на А просто

ssh C

Обратите внимание, я также включил две альтернативные версии ProxyCommand . Первый использует nc если ваша версия ssh старше 5.3, когда была добавлена опция -W . Другой использует прокси-скрипт, который я использовал в течение долгого времени, для обхода некоторых хостов (как в этом примере) и использования corkscrew для выхода из брандмауэров, которые блокируют исходящий ssh . Вы можете увидеть скрипт ssh-proxy на моем github. Он упрощает записи ~/.ssh/config когда вы хотите использовать прокси для записей Host * , но я не обещаю, что он всегда работает во всех ситуациях, так как я изменил его с течением времени, как мне было нужно для в разных ситуациях, поэтому любой из вариантов может быть хрупким или даже сломанным, но это может помочь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .