У меня есть сервер в частной подсети, к которому я хочу подключиться через машину, выходящую в Интернет. Для этого есть несколько руководств. Я использовал вот этот: 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
?
Для прокси-хостов вам не нужно 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.
В соответствии с эта запись SuperUser, начиная с версии 7.3p1, есть Include
директиву, поэтому вы можете создать файл конфигурации, который включает вашу "обычную" конфигурацию, но имеет все ProxyCommand
записи. Таким образом, если вы укажете этот файл, прокси-соединения будут работать, если вы опустите -F
switch, будет прочитана конфигурация по умолчанию, например:
~/.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
Вы можете сделать это без редактирования ~/.ssh/config
используя ProxyCommand
в качестве параметра.
Из OpenSSH 5.4 (2010-03-08) был "режим netcat":
- В ssh (1) добавлен 'режим netcat':
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
куда
firewall
это сервер, выходящий в Интернет.10.0.2.40
это сервер в локальной сети.nc
) используется для установки и установления TCP-канала между серверами в вашей локальной сети.