¿Cómo determinar el puerto asignado en el servidor para un túnel inverso openssh enlazado dinámicamente?

16

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.

estructura codificada
fuente
Cuando se usa la sintaxis "-R 0: xxxx: y", ssh generará el "Puerto asignado 49488 para el reenvío remoto a xxxx: y en stderr.
BlakBat
Sí, el problema es cómo llevar esa información al lado del servidor, donde sería mucho más útil ...
estructura codificada

Respuestas:

1

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)

Jun 24 06:18:24 radon sshd[9334]: Connection from 192.168.13.10 port 39193
Jun 24 06:18:24 radon sshd[9334]: Accepted publickey for lornix from 192.168.13.10 port 39193 ssh2
Jun 24 06:18:24 radon sshd[9334]: pam_unix(sshd:session): session opened for user lornix by (uid=0)
Jun 24 06:18:24 radon sshd[9334]: User child is on pid 9339
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on 0.0.0.0 port 0.
Jun 24 06:18:24 radon sshd[9339]: debug1: Allocated listen port 39813
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 0: new [port listener]
Jun 24 06:18:24 radon sshd[9339]: debug1: Local forwarding listening on :: port 39813.
Jun 24 06:18:24 radon sshd[9339]: debug1: channel 1: new [port listener]
Jun 24 06:18:27 radon sshd[9339]: Received disconnect from 192.168.13.10: 11: disconnected by user

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

-xenon- lornix:~> ssh -R "*:0:radon:22" -N -T radon
Allocated port 39813 for remote forward to radon:22

-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.

lornix
fuente
0

Puede canalizar el stderr sshen 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í:

% ssh -R "*:0:radon:22" -N -T radon 2>&1 | sed "s/^/`uname -n` /" | netcat radon 3743
Russell Nelson
fuente