Ssh разрешает имена хостов из конфигурации при использовании ProxyCommand и режима netcat

16

Я пытаюсь настроить некоторые универсальные параметры для подпрыгивающих соединений SSH. Вот мой ~/.ssh/configфайл, сокращенно:

Host *%via
  ProxyCommand ssh gateway -W $(echo %h | cut -d%% -f1) %p

Host gateway
  HostName gateway.example.com
  User username
  ForwardAgent yes
  IdentityFile keypathg

Host target
  User username
  HostName target.example.com
  IdentityFile keypatht

Когда я использую *%viaиспользование Hostпсевдонимов, я получаю:

% ssh -vvv target%via
OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/myuser/.ssh/config
debug1: /Users/myuser/.ssh/config line 5: Applying options for *
debug1: /Users/myuser/.ssh/config line 12: Applying options for *%via
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: auto-mux: Trying existing master
debug1: Control socket "/Users/myuser/.ssh/tmp/target%via_22_myuser" does not exist
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh -A gateway -W $(echo target%via | cut -d% -f1):22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/myuser/.ssh/id_rsa type -1
debug1: identity file /Users/myuser/.ssh/id_rsa-cert type -1
debug1: identity file /Users/myuser/.ssh/id_dsa type -1
debug1: identity file /Users/myuser/.ssh/id_dsa-cert type -1
ssh_exchange_identification: Connection closed by remote host

Однако, если я использую

% ssh target.example.com%via

Я попал на целевой сервер, но как неправильный пользователь и без аутентификации pubkey.

я думаю, что мой вопрос, на данный момент, заключается в том, является ли этот метод подпрыгивания, при использовании ForwardAgent, проходить через мою конфигурацию SSH / целом или просто ключи. Если только ключи, можно ли как-то использовать первое?

Моя версия ssh - 5.9v1, шлюз - 5.9v1, а цель - 5.3p1. Я считаю, что -Wбыл введен в 5.4, но это не должно иметь значения для последней строки в строке? использование старшей школы, ncкажется, ничем не отличается.

Я проверил, что я могу вручную ssh для каждого поля в строке. Это указывает на то, что информация о псевдониме имени хоста не передается, как на шлюзе, я не могуssh target но могу ssh target.example.com. Это работает с аутентификацией pubkey. Шлюз и цель случайно имеют одно и то же имя пользователя, поэтому это работает, если ни один конфиг не передан.

Если ForwardAgentили подобный конфиг не может выдвинуть эту информацию, какой самый разумный способ обойти это, сохраняя .ssh / config на шлюзе с этой информацией?

Джошуа Хогендорн
источник

Ответы:

14

Вау, спасибо, что задали этот вопрос. Я редко вижу кого-то, кто полностью использует SSH, и этот вопрос затрагивает несколько областей.

Это не ProxyCommandпроблема. Он ProxyCommandпросто инструктирует локальный ssh-клиент подготовиться, прежде чем пытаться связаться с удаленным клиентом. Да, в нашем случае мы говорим с другим сеансом SSH, но этот сеанс, с-W просто принимает наш ввод и перенаправляет его на другой компьютер. Вы можете думать о том, что подготовительная сессия SSH полностью независима. Неизбежная автомобильная аналогия: Ваша машина - та же самая машина, независимо от того, пришлось ли вам ехать на пароме, чтобы добраться из пункта А в пункт Б.

Это не ForwardAgentпроблема. ForwardAgentлокальный клиент предоставляет средство, делающее локальные ключи доступными в среде удаленного сеанса. Вы не успели установить удаленный сеанс.

Это .ssh/configпроблема формата. Обратите внимание на вторую и третью строки debug1. Они перечисляют, какие разделы Host применяются из вашего .ssh/config. Вы заметили, что $ ssh target.example.com%viaработает, но как неправильное имя пользователя и ключ. Хорошо, раздел для Host targetне читается (который предоставит правильное имя пользователя и ключевой файл). Какие строфы используются? *и*%via .

Как заставить эти варианты пройти? Что ж, достаточно интересно, подстановочный знак соответствует строке длиной 0. Host target*будет соответствовать target, target%via, target.example.comи target.example.com%via.

И поэтому вы задаете вопрос, поможет ли установка .ssh/configна gatewayмашину. Нет, не будет. Это никогда не будет прочитано. Все происходит с нашей локальной машины.

Все, что я объяснил, только ответы, почему $ ssh target.example.com%viaне работает.

Вы предпочитаете $ ssh target%via. Справедливо, так удобнее. Краткая форма не работает, потому что, как имя хоста, targetне найдено; это не решает. Почему не ssh извергает ssh: Could not resolve hostname target: Name or service not known? Потому что ProxyCommandуже успешно установлено. Элементы соединения ssh были созданы, но ошибка имени хоста происходит там, где его не ожидают, и поэтому он бомбардирует более общим сообщением. Я бы подал отчет об ошибке, чтобы помочь определить, где можно улучшить отладочную информацию.

Заключительный комментарий:

Мне нравится Host *%viaсинтаксис. Это чистый, но гибкий. Я раньше видел, Host *+*и он использует как первую, так и последнюю часть, %h(ost)чтобы определить, куда идти. Но для этого нужно немного больше усилий. ссылка: http://wiki.gentoo.org/wiki/SSH_jump_host

Hefeweizen
источник