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.
fuente
Respuestas:
Si establece 'LogLevel' en el archivo de configuración sshd_config en DEBUG1 (o cualquier nivel DEBUG), entonces sshd registrará los números de puerto en /var/log/auth.log.
Recuerde, que usar un LogLevel de DEBUG o superior podría ser un riesgo de privacidad, ya que mucho está registrado.
(de /var/log/auth.log, se eliminaron algunas líneas para mostrar información relevante)
Si lo sigue, puede ver dónde puede analizar la información de conexión y luego el puerto reenviado (39813 en este caso)
Utilicé esta línea de comando entre dos de mis máquinas, tengo configurado el inicio de sesión de ssh-key, por lo que no hay solicitudes de contraseña o retrasos
-N especifica que no se da ningún comando y -T detiene la asignación de un tty para esta conexión.
Otra forma de difundir la información de conexión del puerto sería analizarla desde el lado del cliente y enviar un correo electrónico, mensaje de texto, mensaje de texto, señales de humo o paloma para llevar el número de puerto a quien lo necesite.
fuente
Puede canalizar el stderr
ssh
en un programa que abre una conexión a un servidor en la máquina de destino e informa su nombre de máquina / dirección IP / número de serie / lo que sea junto con el número de puerto. Algo así:fuente