Назад | Перейти на главную страницу

Как заставить туннель ssh (или ProxyCommand) использовать существующее главное соединение?

Есть три машины A, B и C под управлением Linux. У меня есть root-доступ к машинам A и B, но не к C. A - моя локальная машина, и я хочу подключиться к C. C доступен только через ssh через VPN. Я не могу подключиться напрямую от A к C, потому что трафик VPN заблокирован в A. Я могу подключиться от A к B через ssh, используя общие ключи. Я запускаю openvpn в B, а затем могу подключиться к C через ssh, но C не принимает общие ключи. Я хочу передавать файлы scp напрямую и без пароля из C в A и из A в C, поэтому я создал главное соединение ssh в B и туннель ssh в A. Однако я не могу заставить туннель использовать главное соединение в B. Мой вопрос как я могу настроить ssh для подключения от A к C, используя существующее главное соединение в B?

Я вижу три способа добиться этого:

1. Вы можете запустить scp на A, и вместо того, чтобы просто ssh на другой хост и запустить scp там, у вас есть ssh на B, а на B запустить другую команду ssh для подключения к C и запустить там scp на стороне сервера.

Похоже, что в scp нет возможности указать, как вызывать scp на удаленной стороне, однако у него есть возможность указать, как вызывать ssh локально. Это -S опция, предназначенная, чтобы сказать, где найти ssh.

Что вы можете сделать, так это запустить scp с -S опция, указывающая на скрипт. Затем этот сценарий отправит ssh на B и запустит ssh там, команду ssh на B нужно будет вызвать со всеми параметрами, которые scp на A дал сценарию.

2. Если вам удастся настроить файл authorized_keys на C, вы можете выполнить аутентификацию A непосредственно по отношению к C. Возможно, все, что вам не хватает, - это надлежащие разрешения для файла authorized_keys на C. Поскольку A не может подключиться напрямую к C, вы вместо этого укажите ProxyCommand, который будет запускаться ssh -W для подключения от A к B. Похоже, в вашем случае, что нужно войти ~/.ssh/config на A. Используемое значение будет ssh -W %h:%p B

3. Запустите команду scp на C и попросите C подключиться обратно к A. Если C не может подключиться напрямую к A, то вместо этого соединение можно открыть либо с помощью ProxyCommand, как предложено выше, либо путем настройки переадресации обратного порта ssh между A и B или между B и C.