Tengo dos máquinas, Cliente y Servidor.
El cliente (que está detrás de un firewall corporativo) abre un túnel SSH inverso al Servidor, que tiene una dirección IP de acceso público, usando este comando:
ssh -nNT -R0: localhost: 2222 [email protected]
En OpenSSH 5.3+, lo que 0
ocurre justo después de los -R
medios "elige un puerto disponible" en lugar de llamarlo explícitamente. La razón por la que hago esto es porque no quiero elegir un puerto que ya esté en uso. En verdad, en realidad hay muchos clientes que necesitan establecer túneles similares.
El problema en este punto es que el servidor no sabe qué Cliente es cuál. Si queremos volver a conectarnos con uno de estos Clientes (a través de localhost), ¿cómo sabemos qué puerto se refiere a qué cliente?
Soy consciente de que ssh informa el número de puerto a la línea de comando cuando se usa de la manera anterior. Sin embargo, también me gustaría usar autossh para mantener vivas las sesiones. autossh ejecuta su proceso hijo a través de fork / exec, presumiblemente, para que la salida del comando ssh real se pierda en el éter.
Además, no se me ocurre otra forma de obtener el puerto remoto del Cliente. Por lo tanto, me pregunto si hay una manera de determinar este puerto en el servidor.
Una idea que tengo es usar de alguna manera / etc / sshrc, que supuestamente es un script que se ejecuta para cada conexión. Sin embargo, no sé cómo se obtendría la información pertinente aquí (¿tal vez el PID del proceso sshd particular que maneja esa conexión?) Me encantaría algunos consejos.
¡Gracias!
fuente
Respuestas:
¿No sería una VPN más apropiada? OpenVPN es muy simple de configurar. Aquí hay una configuración de muestra y algunos enlaces para guiarlo a través del proceso de creación del certificado:
Luego cree un nuevo archivo
/etc/openvpn/client_server.conf
y coloque lo siguiente en él, cambiando el archivoSERVER_IP_ADDRESS
según correspondaLuego, cree una clave por usuario que se va a conectar y cree el archivo de configuración en el directorio ccd
La dirección IP DEBE ser adecuada para una subred / 30 (consulte http://www.subnet-calculator.com/cidr.php ), ya que solo hay 2 direcciones disponibles (servidor y cliente) por conexión. Entonces su próxima IP de cliente disponible sería 192.168.100.6 y así sucesivamente.
Entonces ahora tiene IP estáticas por usuario conectado.
Luego suministre el
the [email protected]
archivo al usuario final y use el siguiente archivo de configuraciónfuente
ifconfig-push 192.168.100.2 192.168.100.3
- No tengo idea de por qué difiere en las plataformas. Y sí, significa que se usan 4 IP por cliente (desperdicio, pero la naturaleza de la bestia).Si los clientes tienen nombres de usuario diferentes, puede usar
netstat
para averiguar en qué puertosshd
está escuchando el proceso de ese usuario . Por ejemplo:fuente
Puede alterar el rango de puertos efímero (
/proc/sys/net/ipv4/ip_local_port_range
para Linux) y luego usar puertos asignados estáticamente fuera de ese rango.fuente
echo $[61002+RANDOM%4532]
elegir un número de puerto en ese rango.Quiero la misma configuración que tú, aumenté el nivel de registro del servidor SSH a DEPURAR, y mostró en los registros cuál era el puerto local del cliente
por ejemplo:
comando del cliente:
ssh -N -R0:127.0.0.1:5522 [email protected]
registro del servidor:
ahí ves el número de puerto
fuente
Debería poder extraer la información relevante de la salida de:
Ejecutar como root.
fuente
Ejecute este script en el servidor:
Puede que necesite o no los dos sudo's. Eliminar si no lo hace.
PD: esta es una versión modificada de una solución que encontré en otro lugar hace un tiempo. Creo que puede provenir de StackOverflow, pero no puedo encontrar la referencia original.
fuente