Al crear túneles inversos en versiones recientes de OpenSSH, se puede proporcionar un puerto remoto de 0 para vincular cualquier puerto disponible:
-R [bind_address:] puerto: host: hostport
...
Si el argumento del puerto es '0', el puerto de escucha se asignará dinámicamente en el servidor y se informará al cliente en tiempo de ejecución.
página de manual del cliente openssh ssh
Mi pregunta es cómo puedo (de manera automatizada) determinar esta asignación de puertos en el servidor. Parece bastante inútil que se informe al host que ejecuta el cliente ssh, pero no al destino, que querrá hacer conexiones a este puerto para acceder a los servicios en el cliente.
Dos opciones similares en las que puedo pensar se están ejecutando
# netstat -ntlp
en el servidor y busque puertos sospechosos vinculados en 127.0.0.1 por sshd o mirando la salida de
# lsof -p $PPID | grep TCP | grep LISTEN
Pero ninguno de estos es agradable desde el punto de vista de la automatización, y no hay forma de vincular los puertos dinámicos con el puerto de servicio de origen si se crea más de uno de estos túneles.
¿Me falta algo para obtener de manera efectiva una lista de túneles activos (números de puerto local y remoto) en el lado del servidor sshd, como un equivalente a la variable de entorno SSH_CONNECTION, pero para túneles activos?
Por algún contexto, estoy tratando de crear potencialmente muchos túneles inversos simultáneos a un host, haciendo un túnel hacia el mismo número de puerto en muchos hosts diferentes. Hacer que la pila TCP administre automáticamente el conjunto de puertos parece ser la forma más efectiva de hacerlo.