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

SSH прыгает с псевдонимами и "-F"

У меня есть сервер в частной подсети, к которому я хочу подключиться через машину, выходящую в Интернет. Для этого есть несколько руководств. Я использовал вот этот: 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 это сервер в локальной сети.
  • netcat (nc) используется для установки и установления TCP-канала между серверами в вашей локальной сети.