У меня есть сервер в частной подсети, к которому я хочу подключиться через машину, которая стоит перед интернет. Для этого есть несколько руководств. Я использовал этот: https://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/
Проблема в том, что он предполагает, что я могу редактировать файл ~ / .ssh / config
. Однако если я запускаю код на CI, Я бы предпочел использовать конфигурационный файл из моего репозитория и использовать переключатель -F
. В этом случае указанная выше стратегия перестает работать, поскольку команда ssh
, используемая как ProxyCommand
, не загружает тот же файл конфигурации и не знает псевдонимов. Я сделал следующее:
Host ansible
User ubuntu
Hostname xxx.compute.amazonaws.com
Host app
User ubuntu
Hostname 10.0.2.40
ProxyCommand ssh -F test-ssh.cfg -W %h:%p ansible
Это работает, но немного грязно, так как мне нужно поместить имя файла в сам файл, и он сломается, если кто-то изменит имя файла. Итак, мой вопрос: есть ли более чистый способ создать файл конфигурации с псевдонимами и ProxyCommand
, который можно было бы использовать с -F
?
Согласно эта запись SuperUser , начиная с версии 7.3p1, имеется Include
, поэтому вы можете создать файл конфигурации, который включает вашу «обычную» конфигурацию, но содержит все записи ProxyCommand
. Таким образом, если вы укажете этот файл, прокси-соединения будут работать, если вы опустите переключатель -F
, будет прочитана конфигурация по умолчанию, например:
~ / .ssh / config
:
Host ansible
User ubuntu
Hostname xxx.compute.amazonaws.com
~ / .ssh / proxyconfig
:
Include config
Host app
User ubuntu
Hostname 10.0.2.40
ProxyCommand ssh -W %h:%p ansible
Если у вас есть конфигурации, подобные приведенным выше, вы можете использовать
ssh -F proxyconfig app
для доступа к серверу «приложений».
Если вы не можете установить вышеупомянутый версии на свой клиентский компьютер, вы можете указать ProxyCommand
в командной строке, не требуя отдельного файла конфигурации, например:
ssh -o ProxyCommand='ssh -W %h:%p ansible' app
Поскольку писать всю команду каждый раз немного неудобно, вы может потребоваться создать псевдоним для команды или - если вы хотите получить доступ к большему количеству компьютеров через прокси - функцию, например,
function proxyssh {
# The first argument is the 'stepping stone',
# the second is the target to ssh into
ssh -o proxyCommand="ssh -W %h:%p $1" $2
}
и использовать ее как
proxyssh ansible app
Для прокси хосты, которые вам больше не нужны ProxyCommand
. Появилась новая опция ProxyJump
, которая делает то же самое без необходимости в другом ssh
с настройкой. Он внутренне выполнит ту же команду, но он также передаст аргумент -F
, если он предоставлен :
Host ansible
User ubuntu
Hostname xxx.compute.amazonaws.com
Host app
User ubuntu
Hostname 10.0.2.40
ProxyJump ansible
Эта функция доступна с OpenSSH 7.3 .
Вы могли бы сделать это без редактирование ~ / .ssh / config
с использованием ProxyCommand
в качестве параметра.
Из OpenSSH 5.4 (2010-03-08) было "netcat mode ":
- Добавлен 'режим netcat' в ssh (1):
ssh -W host: port ...
Это подключает stdio на клиенте к одному порту вперед на сервер. Это позволяет, например, использовать ssh какProxyCommand
для маршрутизировать соединения через промежуточные серверы. bz # 1618
Таким образом, можно:
ssh -o ProxyCommand="ssh -W %h:%p firewall" user@10.0.2.40
Для исторических версий вы можете использовать внешний nc
(из статьи SSH ProxyCommand Вивека Гите):
ssh -o ProxyCommand='ssh user@firewall nc 10.0.2.40 22' user@10.0.2.40
Где
межсетевой экран
- это сервер, выходящий в Интернет. 10.0.2.40
- это сервер в локальной сети. nc
) используется для установки и установить канал TCP между серверами в вашей локальной сети.