Faça com que o ssh resolva nomes de host da configuração ao usar o modo ProxyCommand e netcat

16

Estou tentando configurar algumas opções universais para rejeitar conexões ssh. Aqui está o meu ~/.ssh/configarquivo, abreviado:

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

Quando utilizo *%viaos Hostaliases, recebo:

% 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

No entanto, se eu utilizar

% ssh target.example.com%via

Eu bati no servidor de destino, mas como o usuário errado e sem autenticação pubkey.

Acho que minha pergunta, neste momento, é se esse método de rejeição, ao utilizar ForwardAgent, passa por todo o meu ssh config / environment, ou apenas pelas teclas. Se apenas chaves, a primeira pode ser utilizada de alguma maneira?

Minha versão do ssh é 5.9v1, o gateway é 5.9v1 e o destino é 5.3p1. Acredito que -Wfoi introduzido na versão 5.4, mas isso não deve importar para a caixa final na linha? utilizar a escola mais antiga ncnão parece diferente.

Eu verifiquei que posso manualmente ssh para cada caixa na linha. Fazer isso indica que as informações do alias do nome do host não são passadas, pois quando no gateway, não posso, ssh targetmas posso ssh target.example.com. Isso funciona com o pubkey auth. aliás, o gateway e o destino têm o mesmo nome de usuário, e é por isso que funciona se nenhuma configuração for enviada.

Se ForwardAgentuma configuração semelhante ou não puder enviar essas informações, qual é a melhor maneira de contorná-las, mantendo um .ssh / config no gateway com essas informações?

Joshua Hogendorn
fonte

Respostas:

14

Uau, obrigado por fazer esta pergunta. Acho raro ver alguém explorando completamente o SSH e essa pergunta ocorre em algumas áreas.

Isto não é um ProxyCommandproblema. O ProxyCommandsimplesmente instrui o cliente ssh local para fazer alguma coisa em preparação antes de tentar falar com o cliente remoto. Sim, em nosso exemplo, conversamos com outra sessão ssh, mas essa sessão, -Wsimplesmente leva nossa entrada e a encaminha para outra máquina. Você pode pensar que a sessão preparatória do ssh é completamente independente. Analogia inevitável do carro: seu carro é o mesmo, independentemente de você ter que pegar uma balsa para ir do ponto A ao ponto B.

Isto não é um ForwardAgentproblema. ForwardAgentO cliente local fornece um recurso que disponibiliza chaves locais no ambiente da sessão remota. Você não conseguiu estabelecer a sessão remota.

É uma .ssh/configquestão de formato. Observe a segunda e terceira linhas de depuração1. Eles listam quais estrofes de host estão sendo aplicadas a partir do seu .ssh/config. Você nota que $ ssh target.example.com%viafunciona, mas como nome de usuário e chave incorretos. Bem, a estrofe de Host targetnão está sendo lida (o que forneceria o nome de usuário e o arquivo-chave corretos). Quais estrofes são usadas? *e *%via.

Como obter essas opções? Bem, interessante o suficiente, o curinga corresponde a 0 strings de comprimento. Host target*irá corresponder a target, target%via, target.example.come target.example.com%via.

E assim você faz a pergunta, seria definir um .ssh/configna gatewayajuda da máquina. Não, não seria. Isso nunca seria lido. Tudo está acontecendo na nossa máquina local.

Tudo o que expliquei, apenas responde por que $ ssh target.example.com%vianão está funcionando.

Você prefere $ ssh target%via. Com razão, é mais conveniente. O formulário curto está falhando porque, como nome de host, targetnão foi encontrado; não está resolvendo. Por que o ssh não está vomitando ssh: Could not resolve hostname target: Name or service not known:? Porque o ProxyCommandjá foi estabelecido com sucesso. Os elementos de uma conexão ssh foram criados, mas a falha do nome do host está acontecendo onde não é esperado e, portanto, é bombardeada com a mensagem mais genérica. Eu arquivaria um relatório de bug sobre isso, para ajudar a identificar onde as informações de depuração poderiam ser melhoradas.

Comentário final:

Eu gosto da Host *%viasintaxe. É limpo, mas flexível. Eu já tinha visto Host *+*e ele usa a primeira e a última parte do %h(ost)para determinar para onde ir. Mas é preciso um pouco mais de esforço para entender isso. link: http://wiki.gentoo.org/wiki/SSH_jump_host

Hefeweizen
fonte