J'ai 3 hôtes :
- Mon ordinateur.
- Un hôte de saut (aka bastion) avec une IP statique.
- Un serveur avec une IP dynamique ; derrière un routeur/pare-feu NAT, sans ports entrants ouverts.
Le serveur se connecte actuellement à l'hôte Jump, et établit un tunnel SSH via -R "0:localhost:22"
Le port est donc alloué dynamiquement par l'hôte de saut (ce qui s'est avéré très fiable jusqu'à présent).
Avec quelques magie de la prise J'ai le numéro de port alloué dynamiquement enregistré dans un fichier sur l'hôte Jump.
Avec cela, je peux SSH à l'hôte Jump, et exécuter ssh -p $(cat /path/to/port-file) localhost
Mais est-il possible de sauter cette étape supplémentaire ?
Cela serait utile pour Ansible, où mon inventory.yml
doit avoir le numéro de port mis à jour :
server:
# /usr/bin/ssh jh cat /path/to/port-file
ansible_port: "34625"
ansible_host: "localhost"
ansible_ssh_common_args: "-o ProxyCommand='ssh -q -W %h:%p jh' -o StrictHostKeyChecking=no"
Il pourrait être possible d'utiliser ProxyCommand
:
Il peut (en quelque sorte) utiliser la substitution de commande sur mes ordinateurs. ~/.ssh/config
fichier :
Host server
ProxyCommand ssh -q -W localhost:$(echo "34625") jh
Cela fonctionne (même sans echo -n
) où la substitution semble se faire sur mon ordinateur local.
Et malgré l'inefficacité de l'utilisation de SSH pour obtenir d'abord le numéro de port, cela ne fonctionne pas :
Host server
ProxyCommand ssh -q -W localhost:$(ssh jh cat /path/to/port-file) jh
Il en résulte :
Bad packet length 1349676916.
ssh_dispatch_run_fatal: Connection to UNKNOWN port 65535: message authentication code incorrect
Et curieusement, le serveur (à la fin de la chaîne), le note dans ses journaux d'authentification :
sshd[5558]: Bad protocol version identification '' from ::1 port 36048
Ce qui implique que le numéro de port est renvoyé. Mais je n'ai aucune idée de la raison pour laquelle il est cassé à ce stade.
Et ssh -vvv
montre qu'il identifie la clé de l'hôte dans mon ~/.ssh/known_hosts
.
J'ai également essayé de créer un fichier "ssh_config" personnalisé sur l'hôte Jump, en utilisant les éléments suivants ssh -F /path/to/ssh_config
avec le contenu :
Host tunnel.server
HostName localhost
Port 34625
Mais je ne pense pas que je puisse l'utiliser avec les ProxyCommand
.
Je soupçonne aussi StrictHostKeyChecking=no
pourrait devoir être introduite à un moment donné, lorsque le numéro de port change.