¿Cómo puedo ayudar a alguien (como la abuela) sobre SSH que está detrás de un enrutador NAT?

14

Para ayudar a otros rápidamente, SSH es muy útil, especialmente combinado con GNU Screen. Es común que los usuarios estén detrás de un enrutador NAT. Incluso si el usuario puede configurar el enrutador, lleva algún tiempo recordar la contraseña, encontrar las opciones correctas, etc.

Entonces, ¿cuál es la forma más fácil de ayudar a otros a través de SSH si están detrás de un enrutador NAT?

Actualmente le digo a las personas que abran una terminal ejecuten el siguiente comando y me pasen su IP desde un sitio como http://ip.appspot.com/ :

sudo apt-get install openssh-server ssh-import-id && ssh-import-id lekensteyn

Obviamente, esto no funcionará si están detrás de un enrutador NAT o si tienen un firewall personal configurado. Entonces, ¿hay algo como:

sshd --accept-help-from lekensteyn

No estoy buscando alternativas como Teamviewer, solo un shell como SSH. También debe ser de código abierto.

Lekensteyn
fuente

Respuestas:

13

Si su propia computadora puede aceptar conexiones SSH, hay una manera de usar la técnica que Pavlos G. conectó sin una computadora adicional.

Primero necesita un usuario desfavorecido * que su amigo se conectará como:

sudo adduser reverse --shell /bin/false

Dile a tu amigo que comience el túnel:

ssh -N -R 62222:localhost:22 reverse@lekensteyns-server

Luego, en su propia computadora ( lekensteyns-server), inicie la conexión inversa:

ssh -p 62222 localhost

* No sé lo suficiente sobre seguridad para poder asesorar sobre la creación de un usuario adecuadamente desfavorecido. Eso es probablemente algo que debería cubrirse en una pregunta separada.

ændrük
fuente
3
Parece prometedor, he hecho una nueva pregunta sobre esa parte de usuario restringida
Lekensteyn
2

Según sus necesidades específicas, probablemente:

  1. Pídales que me digan la contraseña del enrutador
  2. Inicie sesión y configure el reenvío de puertos solo para el puerto 22
  3. Conéctese a través de SSH (o túneles SSH si necesita puertos adicionales abiertos) y realice el trabajo.

También olvidé que puedes probar el túnel ssh inverso , aunque esta solución técnicamente necesita una computadora más, la del medio, para funcionar.

Más información se puede encontrar aquí

Pavlos G.
fuente
1) probablemente no va a funcionar ya que el acceso al enrutador a menudo está prohibido para el público.
Lekensteyn
2

Por lo general, configuro un túnel IPv6 (de sixxs.net o he.net) si aún no tienen IPv6 y de esa manera la computadora tiene una dirección estática y no tengo que meterme con NAT. También me gusta configurar la autenticación basada en claves (entonces no tienen que decirle su contraseña).

Sixxs tiene su propio cliente que usted usa. Funciona detrás de casi cualquier NAT y se actualiza automáticamente cuando cambia la dirección IPv4. Tienen instrucciones sobre cómo configurarlo y está empaquetado para Ubuntu.

Hurricane Electric utiliza un túnel donde los paquetes de IPv6 se envían como la carga útil de un paquete de IPv4. A diferencia de Sixxs, no se utiliza TCP / UDP. Esto significa que el NAT que está detrás debe admitir el PROTOCOLO de reenvío 41 (no el puerto) y solo una computadora detrás del NAT puede usarlo. El software para usar un túnel como este está integrado en Ubuntu.

Para HE, uso algo como esto en /etc/network/interfaces:

auto he-ipv6
iface he-ipv6 inet6 v4tunnel
     endpoint 216.218.226.238
     address  2001:470:a29f::2
     netmask  64
     ttl 64
     up ip -6 route add default dev he-ipv6
     down ip -6 route del default dev he-ipv6

La otra cosa que debe hacer es actualizar su punto final del túnel. Como no sabe cuándo cambia la IP externa, tendrá que intentar actualizar el punto final cada pocos minutos. Podría usar algo como esto y ejecutarlo desde cron:

#!/bin/sh
echo -n "Hurricane Electric Proto-41 tunnel endpoint update: "
#(C) 2010 Erik B. Andersen This script is licensed under the latest version of the
# AGPL published by the Free Software Foundation at http://www.gnu.org/licenses/ .
####Set these for each different site#########
pass="passwordhere"
user_id="a765b8e2f474667dcb56e08c5f1aa05b"
tunnel_id="97817"
####Past here doesn't need to be changed######
wget -4 "https://ipv4.tunnelbroker.net/ipv4_end.php?ipv4b=AUTO&pass=$(echo -n "${pass}" | md5sum | grep -o -E "[0-9a-fA-F]{32}")&user_id=${user_id}&tunnel_id=${tunnel_id}" -O /dev/null -o /dev/null --no-check-certificate
echo " Done"
Azendale
fuente
1
¿Qué esfuerzos se deben hacer para configurar dicho túnel correctamente? Esta conexión, por supuesto, está basada en claves, por eso uso ssh-import-id
Lekensteyn
De hecho, me encantaría aprender más sobre este truco.
Rafał Cieślak
0

A lo largo de los años, desarrollé una GUI para hacer exactamente lo que el OP pide ... excepto que requiere un acceso ssh a un tercer servidor con IP pública, como lo sugiere Pavlos. Puede encontrar aquí los paquetes de Debian y las instrucciones:

http://pietrobattiston.it/reachme

Tenga en cuenta que (todavía) no puede encargarse de la configuración inicial, es decir, debe configurar usted mismo las claves rsa para una conexión sin contraseña. Una vez configurado, "reachthem" le permite ver si "reachme" está conectado, y abrir un shell ssh / navegar por el sistema de archivos / ver la pantalla (experimental).

Claramente, no necesita una tercera computadora si su computadora tiene una IP pública, como en la respuesta de ændrük. Y claramente, el beneficio de la GUI es que el usuario remoto no tiene que ingresar ningún comando en una terminal ... pero parte de este beneficio se pierde si el usuario remoto tiene que instalar reachme. Por lo tanto, siempre instalo y configuro reachme para todos los que instalo Ubuntu.

Pietro Battiston
fuente