Lors de la création de tunnels inverses sur les versions récentes d'OpenSSH, un port distant de 0 peut être attribué pour lier n'importe quel port disponible:
-R [bind_address:] port: hôte: port hôte
...
Si l'argument du port est «0», le port d'écoute sera alloué dynamiquement sur le serveur et signalé au client au moment de l'exécution.
page de manuel du client openssh ssh
Ma question est de savoir comment je peux (de manière automatisée) déterminer cette allocation de port sur le serveur. Il semble plutôt inutile qu'il soit signalé à l'hôte exécutant le client ssh - mais pas à la cible, qui voudra établir des connexions à ce port pour accéder aux services sur le client.
Deux options similaires auxquelles je peux penser sont en cours d'exécution
# netstat -ntlp
sur le serveur et recherchez les ports suspects liés sur 127.0.0.1 par sshd ou en regardant la sortie de
# lsof -p $PPID | grep TCP | grep LISTEN
Mais aucun de ces éléments n'est agréable du point de vue de l'automatisation, et il n'y a aucun moyen de rattacher les ports dynamiques au port de service d'origine si plusieurs tunnels de ce type sont créés.
Y a-t-il quelque chose qui me manque pour obtenir efficacement une liste des tunnels actifs (à la fois les numéros de port locaux et distants) côté serveur sshd, comme un équivalent à la variable d'environnement SSH_CONNECTION, mais pour les tunnels actifs?
Pour un certain contexte, j'essaie de créer potentiellement de très nombreux tunnels inverses simultanés vers un hôte, en tunnelant vers le même numéro de port sur de nombreux hôtes différents. La gestion automatique du pool de ports par la pile TCP semble être le moyen le plus efficace de procéder.
la source
Réponses:
Si vous définissez «LogLevel» dans le fichier de configuration sshd_config sur DEBUG1 (ou tout niveau DEBUG), sshd enregistrera les numéros de port dans /var/log/auth.log.
N'oubliez pas que l'utilisation d'un LogLevel de DEBUG ou supérieur peut représenter un risque pour la confidentialité, car une grande partie est enregistrée.
(de /var/log/auth.log, supprimé quelques lignes pour afficher les informations pertinentes)
Si vous le suivez, vous pouvez voir où vous pouvez analyser les informations de connexion, puis le port redirigé (39813 dans ce cas)
J'ai utilisé cette ligne de commande entre deux de mes machines, j'ai une connexion ssh-key configurée, donc pas d'invite de mot de passe ni de retard
-N spécifie qu'aucune commande n'est donnée et -T arrête l'allocation d'un terminal pour cette connexion.
Une autre façon de diffuser les informations de connexion au port serait de les analyser du côté client et d'envoyer un e-mail, un jabber, un SMS, des signaux de fumée ou un pigeon pour transporter le port # à qui en a besoin.
la source
Vous pouvez diriger le stderr de
ssh
dans un programme qui ouvre une connexion à un serveur sur la machine cible et signale son nom de machine / adresse IP / numéro de série / peu importe avec le numéro de port. Un peu comme ça:la source