Corriger les paramètres du fichier de configuration ssh pour créer un tunnel vers une troisième machine

19

J'essaie de créer un tunnel vers un serveur via un serveur de pont. Jusqu'à présent, j'ai pu le faire fonctionner correctement à partir du shell de commande en utilisant la commande suivante:

ssh -A -t bridge_userid@bridgemachine.com ssh -A remote_userid@remoteserver.com

Mais j'ai essayé de mettre cela dans mon ~/.ssh/configdossier et j'ai des problèmes. J'ai essayé:

Host axp
  User          remote_userid
  HostName      remoteserver.com
  IdentityFile  ~/.ssh/id_rsa.eric
  ProxyCommand ssh -A -t bridge_userid@bridge_userid.com ssh -A remote_userid@%h

Mais quand je le fais, j'obtiens le message d'erreur suivant de remoteserver.comet je ne suis pas sûr de la cause:

ksh: SSH-2.0-OpenSSH_6.8 ^ M: introuvable

Je sais que lorsque je me connecte remoteserver.com, ma coquille l'est /usr/bin/ksh.

J'ai essayé d'ajouter des arguments de chemin aux commandes ssh dans le fichier de configuration, mais cela n'a fait aucune différence.

Des idées ce que cela peut être?

Eric B.
la source
Ce n'est tout simplement pas la façon dont il ProxyCommandest censé être utilisé. Généralement, il est utilisé avec netcat où ssh achemine sa sortie à travers lui et netcat agit comme tunnel vers le port SSH du serveur distant . Vous avez besoin d'un ProxyCommand quelque chose comme ssh -W %h:%p [email protected]si vous voulez utiliser cette fonctionnalité.
DanSut
Malheureusement, mon serveur de pont n'a pas Netcat installé dessus, donc j'essaie de faire fonctionner cela d'une autre manière. J'ai pensé que si cela pouvait fonctionner à partir de la ligne de commande, il devrait y avoir un moyen de mettre les informations dans un fichier de configuration.
Eric B.
Dans votre utilisation de ligne de commande qui fonctionne, vous donnez ssh -A [email protected]une commande à exécuter sur la machine bridge, config ne vous donne pas un moyen de fournir des commandes par défaut. Ce que vous essayez de faire worksen soi, mais ssh essaie ensuite d'utiliser votre ProxyCommandcomme tunnel et commence à tirer le protocole SSH vers le bas là où un shell attend à l'autre extrémité plutôt qu'un sshd écoutant le protocole SSH.
DanSut
@dansut a très bien fonctionné. THX!
Eric B.

Réponses:

24

La réponse de Jakuje est juste, mais depuis OpenSSH 7.3, vous pouvez maintenant utiliser -J ProxyJumpce qui est plus facile. Voir mes notes:

OpenSSH 7.3ou supérieur

Utilisez ProxyJump. Comme expliqué dans le manuel:

-J [utilisateur @] hôte [: port]
Connectez-vous à l'hôte cible en établissant d'abord une connexion ssh avec l'hôte de saut, puis en établissant un transfert TCP vers la destination finale à partir de là. Plusieurs sauts peuvent être spécifiés séparés par des virgules. Il s'agit d'un raccourci pour spécifier une directive de configuration ProxyJump.

~/.ssh/configExemple ProxyJump

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2_behind_server1
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa
  ProxyJump server1

Se connecter avec

ssh server2_behind_server1 -v

Ajouter -vpour une sortie détaillée

Exemple de -Jligne de commande ProxyJump

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa

Se connecter avec

ssh server2 -J server1 -v

Ou utiliser -o

ssh server2 -o 'ProxyJump server1' -v

OpenSSH 5.4ou supérieur

Utiliser ProxyCommandavec-W

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa
  ProxyCommand ssh server1 -W %h:%p

Se connecter avec

ssh server2 -v

Ou utiliser -o

ssh server2 -o 'ProxyCommand ssh server1 -W %h:%p' -v

Soufflet OpenSSH 5.4

~/.ssh/config

Host server1
  Hostname server1.example.com
  IdentityFile ~/.ssh/id_rsa

Host server2
  Hostname server2.example.com
  IdentityFile ~/.ssh/id_rsa
  ProxyCommand ssh server1 nc %h %p 2> /dev/null

Se connecter avec:

ssh server2 -v

Ou utiliser -o

ssh server2 -o 'ProxyCommand ssh server1 nc %h %p 2> /dev/null' -v

Sources

-Jajouté dans OpenSSH 7.3

  • ssh (1): Ajoutez une option ProxyJump et l'indicateur de ligne de commande -J correspondant pour permettre une indirection simplifiée via un ou plusieurs bastions SSH ou "hôtes de saut".

-Wajouté dans OpenSSH 5.4

  • Ajout d'un 'mode netcat' à ssh (1): "ssh -W host: port ..." Ceci connecte stdio sur le client à un seul port en avant sur le serveur. Cela permet, par exemple, d'utiliser ssh comme ProxyCommand pour router les connexions via des serveurs intermédiaires. bz # 1618
GabLeRoux
la source
3

Vous n'avez pas besoin netcatde votre pont. Comme DanSut l'a proposé dans les commentaires, vous pouvez utiliser l' ssh -Woption de ligne de commande à la place, cette configuration devrait fonctionner pour vous:

Host axp
  User          remote_userid
  HostName      remoteserver.com
  IdentityFile  ~/.ssh/id_rsa.eric
  ProxyCommand ssh -AW %h:%p bridge_userid@bridge_userid.com
Jakuje
la source
Ça a marché. Merci. Je ne sais pas pourquoi, mais je suis sûr que je l'avais déjà essayé une fois en échec, mais j'ai essayé à nouveau avec succès. Merci.
Eric B.