hacer una conexión SSH inversa automatizada en el arranque

9

Tengo una PC detrás de un NAT que hace una conexión SSH inversa a mi VPC Digitalocean. Utilizo esta conexión SSH invertida desde casa para iniciar sesión en la PC de mi oficina (estoy autorizado para hacerlo) y copiar archivos y hacer otras cosas importantes.

Aunque no con frecuencia, noté que mi PC de oficina se reinicia (debido a fallas de energía, etc.) y rompe la conexión SSH invertida que ha hecho con mi VPC. En este tipo de casos, no puedo conectarme desde la PC de mi casa a la PC de mi oficina.

Ejecuto el siguiente script para hacer la conexión inversa + proxy dinámico para anonimizar mi tráfico (ya que no estoy obligado a compartir información de navegación) generado en la PC de la oficina.

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

No hay forma de que pueda ejecutar este script nuevamente en mi PC de la oficina al reiniciar, ya que no estoy físicamente allí. Para resolver este problema instalé el siguiente crontab.

Nota: el rev.sharchivo contiene la línea anterior. El certificado "digitalOcean" y rev.sh se encuentra en Ubuntu home. Por lo tanto, cuando ejecuto ./rev.shen mi terminal Ubuntu obtengo un proxy dinámico y también accedo al servidor ym DigitalOcean. Este método funciona al 100%.

Sin embargo, cuando instalo el crontab con el siguiente método, Mi PC ubuntu nunca crea un proxy dinámico. Puedo ver esto porque cuando reviso este proxy de Google Chrome, dice que el proxy rechaza la conexión.

Aquí están los trabajos de cronejo que probé como trabajo de raíces También probé estos como un usuario normal, aún así no funcionaron.

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

Luego instalé un crontab varios minutos antes de la hora actual y esperé a que se ejecutara.

24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh

estos tampoco se ejecutaron.

Por favor, tenga la amabilidad de ayudarme a detectar mi error. Hay muchas preguntas similares en este sitio web sobre mi problema. He referido muchas respuestas por lo tanto, pero ninguna de ellas parecía ayudar.

Denis
fuente
No estoy muy seguro de cuál es tu problema aquí. ¿Es cron no comenzar ningún trabajo? ¿O el script no funciona? Con ambos problemas, por favor, consulte los registros. Cron debería escribir en alguna parte /var/log/cron*. Para fines de prueba, simplemente podría escribir algo como */2 * * * * /path/to/script: ejecutará un script cada 2 minutos. También verifique si hay correos para el usuario que ejecuta cron. ¿Es root? Usa el mailcomando. Oh, puedo ver que estás usando la clave ssh? Dudo que cron job pueda encontrarlo si no le das una ruta completa después del -icambio.
Kalavan el

Respuestas:

8

No estoy seguro de si usar cronpara ejecutar un script al inicio es una buena idea. Una alternativa que veo más adecuada es crear un servicio SystemD, como se describe aquí . Crea un archivo llamado /etc/systemd/system/autossh.service:

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

Luego ejecute el siguiente comando como root:

systemctl enable autossh.service
Dmitry Grigoryev
fuente
1

Un par de cosas que puedes probar:

chmod +x rev.sh

A veces su ruta no está completamente configurada en el momento del arranque o a través de cronjobs, así que reemplace autossh con la ruta completa, en mi sistema que es

/usr/bin/autossh

El motivo @reboot depende del tiempo de inicio del cron daemon, por lo tanto, puede invocarse antes de que otros subsistemas (¿red?) estén en funcionamiento

Y tu ejemplo de crontab:

24 12 8 * * * bash /home/user/rev.sh

solo invocará el día 8 de cada mes. Y tiene un campo extra. Tratar

24 12 * * * /home/user/rev.sh
slowko
fuente
Lo siento, fue un error. Intenté '24 12 * * * /home/user/rev.sh 'pero todavía no funcionó. Para mi sorpresa, ni siquiera '24 12 * * * reiniciar 'funcionó.
Denis
1
Bueno, reiniciar ciertamente no funcionará a menos que estés invocando como root.
slowko
Intenté agregar / usr / bin / autossh. No funcionó.
Denis
Intenté reiniciar 24 12 8 * * * en el crontab root. No funcionó. ¿Funciona en el tuyo?
Denis
/usr/binsiempre está en el valor predeterminado PATH, incluso paracron
roaima
1

Parece ser que cuando el script se ejecuta a través de crontab no puede encontrar su certificado.

Cuando usted, como usuario, ejecuta el script, utiliza el certificado de /home/ubuntu-user/.ssh / ... Sin embargo, cuando el script se ejecuta desde crontab, se ejecuta como root. root toma los certificados de /root/.ssh

Entonces, tiene varias formas de hacerlo funcionar, pero creo que ejecutar el script como lo hace ubuntu-user en crontab .

Editar:

asegúrese de proporcionar una ruta completa calificada para el certificado

syss
fuente
1

Intenta usar su:

su -l user -c /home/user/rev.sh

¿Te ayudará con tu problema?

Fedor Dikarev
fuente
0

Como la pregunta no contiene tantos datos, comenzaré desde cero con lo que haría

Pondría todas las configuraciones en / etc / ssh / ssh_config:

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

Pondría la llave /etc/ssh/mytunnel_key

entonces intentaría con una entrada cron (un servicio upstart / systemd sería mejor) como este:

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel
Diego Roccia
fuente
0

Debe usar -f y ejecutar un comando cuando se ejecuta sin un terminal. Así que aquí hay un ejemplo:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
[email protected] \
sleep 31536000

-f lo coloca en segundo plano, pero colocarlo en segundo plano significa que ssh se conectará y luego se desconectará tan pronto como haya completado su tarea. Entonces necesitas una tarea.

sleep 31536000 le dice a ssh que ejecute "sleep" durante 1 año después de conectarse. Durante este tiempo, tus túneles permanecerán arriba.

Si no ejecuta un comando, ssh se conectará, configurará el túnel inverso en el puerto 2205, y cuando termine con eso, saldrá. Usando autossh, si la conexión falla, se volverá a conectar y reiniciará la suspensión nuevamente. Incluso con una conexión a Internet realmente estable, dudo que sea posible un año.

Por cierto, a diferencia de estos otros comodines, sé que esto funciona, ya que en realidad lo probé porque, por supuesto, estoy haciendo algo similar y como lo tengo funcionando ahora, de manera muy confiable, puedo darle la respuesta correcta.

-f y "comando"

Eso es lo que te estás perdiendo.

Jimminy Doe
fuente
1
No creo que necesitemos llamar a otras personas aquí.
Jeff Schaller
1
No estoy llamando nombres de otras personas. Estoy señalando que las soluciones sugeridas anteriormente nunca fueron probadas por las personas que las sugirieron. No me creas Pruébalos.
Jimminy Doe
1
Tampoco creo que haya abordado el punto de la pregunta: el OP afirma que este método funciona al 100% . Creo que su pregunta se centra en ejecutar su script de manera automatizada después de que se reinicia su PC.
Jeff Schaller
1
Si está en el trabajo, puede configurar los túneles inversos a casa, porque el OP se está ejecutando en una terminal, ESO funciona el 100% del tiempo. Los programas ssh (y autossh) actúan de manera diferente si no tienen un terminal asociado con el proceso. Tuvo problemas para que crontab (que se ejecuta sin un terminal) vuelva a conectar los túneles, precisamente porque no está usando -f, e incluso si lo fuera, el ssh se cerraría una vez que los túneles se configuraron, sin ejecutar algo, en mi caso, voy dormir por un año En el script, -f debe usarse CON UN COMANDO que evite que SSH salga. Ese es su problema.
Jimminy Doe
1
Supongo que fuiste tú, Jeff Schaller, por darme un voto negativo, por dar la solución correcta y probarlo. Básicamente estoy haciendo exactamente la misma configuración que él, excepto que estoy configurando un PI para pasar a través de un firewall, y arrancar rdesktop, y dárselo a nuestro gerente de oficina, que no sabe nada sobre Linux, para que lo use . Estoy bastante seguro de que tengo una solución a prueba de balas, ya que la estoy usando ahora, y he reiniciado mi pi remotamente y mi módem de cable local, solo para estar seguro ... Pero, diablos, no dejes que entre una respuesta correcta. el camino de un ego exagerado y no ganado.
Jimminy Doe