12 votos

¿Cómo conectarse a Android a través de SSH a través de la IP pública de 3G/4G?

Tengo un dispositivo Android y quiero conectarme a través de 3G/4G y me sale conexión rechazada.

¿Alguna idea de cómo hacerlo?

1 votos

¿Estás seguro de que tu dispositivo tiene una dirección IP pública? El número de operadores de red móvil que proporcionan una IPv4 pública por dispositivo es muy pequeño y a menudo se limita a ciertos contratos comerciales o de IoT. Por lo tanto, es muy probable que tu dispositivo esté detrás de una puerta de enlace NAT, por lo que las conexiones entrantes no son posibles.

1 votos

Sí, está detrás de NAT y estaba esperando si hay alguna manera de hacer esto a través de un túnel inverso. Gracias Robert.

0 votos

19voto

Jack Wade Puntos 231

Si tienes un servidor SSH funcionando en un dispositivo Android, puedes conectarte a él en una red local/privada sin problemas (después de configurar la autenticación apropiada, obviamente). Lo mismo puede ser cierto para una red pública (internet) si tu teléfono tiene una dirección IP pública real (no creo que eso suceda en la Tierra). Sin embargo, cuando necesitas cruzar redes, es decir, atravesar puertas de enlace y enrutadores, se involucra la Traducción de Direcciones de Red. No podrás acceder a tu dispositivo desde internet si tu servidor SSH no puede exponerse a una dirección IP pública.


¿QUÉ ES NAT Y PAT?
En palabras simples, NAT es la traducción de la IP de origen desde una dirección privada a una pública - enrutable; lo que llaman - dirección cuando un paquete IP abandona el enrutador, para que el paquete pueda ser enviado de vuelta con una dirección IP identificable. Lo inverso ocurre cuando se recibe la respuesta para el mismo paquete en el enrutador. Significaría hacer un mapeo de la IP privada de cada host (teléfono, PC, etc.) en la red local a una IP pública única. Pero en casos habituales, solo tenemos una IP pública asignada por el ISP. Por lo tanto, entra en acción la Traducción de Direcciones de Puertos. PAT traduce cada dirección IP local a la misma dirección IP pública pero con un puerto único.

¿QUÉ ES CGNAT?
Para abordar el problema de la escasez de direcciones IP, los Proveedores de Servicios de Internet también realizan NAT, llamado NAT de Grado de Operador. Esto significa que la dirección IP asignada por el ISP a ti no es una IP pública sino privada. Esta es una situación definitiva con los Datos Móviles, es decir, en 3G/4G, pero menos común con las conexiones DSL.
Si la IP asignada a tu teléfono por el ISP (puedes verificarlo con el comando ip address | grep inet) es diferente a la que se muestra aquí, estás detrás de un CGNAT. De manera similar para el enrutador Wi-Fi, la dirección IP que aparece en Configuración de Conexión PPP Connection Settings debe coincidir con la IP pública.

DIRECCIÓN IP DINÁMICA:
Para utilizar al máximo el grupo disponible de direcciones IP, los ISP generalmente asignan una dirección IP dinámica incluso cuando no hay CGNAT. Por lo tanto, la IP pública sigue cambiando de forma diaria, semanal, mensual o aleatoria, dependiendo de la política del ISP.


IPv6 es el protocolo próximo que no necesitará NAT y cada host de red en la Tierra podrá tener una dirección IP única.


SOLUCIÓN:
Ahora, pasando a tu pregunta:

  • Si no hay CGNAT, podemos abordar el problema del NAT del enrutador DSL/3G/4G configurando Reenvío de Puertos. Pero esta opción no funciona si:

    • Hay más de un host en la red local que escuchan en el mismo puerto (22 en caso de ssh).
    • Los cortafuegos del ISP no te permiten recibir conexiones entrantes.
    • El ISP te bloquea la sección de Reenvío de Puertos de tu enrutador o un enrutador 3G/4G no tiene configuraciones de Reenvío de Puertos en absoluto.
  • El problema de la IP Dinámica se puede resolver registrándote en un servicio de DDNS. Te asigna un nombre de dominio que siempre se resuelve con tu IP pública actual. DynuDNS es un servicio gratuito que funciona perfectamente para mí. Tendrás que instalar su software en tu teléfono o PC para mantenerlos actualizados con tu IP pública.

  • En cuanto al CGNAT:

    • Puedes optar por comprar una IP pública estática si tu ISP ofrece este servicio, pero el precio no es "amigable para el oído" en la mayoría de los casos.
    • Regístrate en un servicio que te permita configurar el Reenvío de Puertos en una VPN pública. Hay soluciones gratuitas (para un reenvío de puertos) como portmap.io también si no temes que tu tráfico sea interceptado :) Otra solución especializada es ngrok que utiliza túneles HTTP, TLS y TCP.
    • Configura un túnel SSH (más lento) o VPN (más rápido) desde tu teléfono a un servidor personal.
      • Para una mejor seguridad y privacidad, configura un servidor propio. Puedes usar tu conexión de banda ancha (si tiene una IP pública) para este propósito o puedes pedirle a algún amigo que te ofrezca este servicio.
      • Compra alguna solución de la nube VPS confiable como AWS para alojar tu propio servidor SSH/VPN personal. La configuración es un poco técnica pero hay guías (1, 2) disponibles.

Si optas por la última opción (configurar un servidor SSH o VPN personal con una dirección IP pública/estática/dedicada), sigue los pasos a continuación para reenviar un puerto específico desde el servidor SSH/VPN a tu teléfono:

  • SSH:

    Con un servidor SSH configurado, puedes crear un túnel de Reenvío de Puertos Inverso desde tu teléfono. Nota que no puedes reenviar el puerto SSH predeterminado del servidor remoto (22) al puerto 22 de tu teléfono si te estás conectando al servidor en el mismo puerto.

    Asegúrate de que GatewayPorts yes y AllowTcpForwarding yes estén configurados en sshd_config en el servidor, para que sshd permita el reenvío de puertos y acepte conexiones desde el público. Ahora en tu teléfono crea un túnel inverso:

    ~$ ssh -NTR 2222:localhost:22 @

    Puedes hacer que el túnel ssh sea persistente usando autossh o alguna aplicación como ConnectBot si lo deseas.

    Para más opciones, consulta esta respuesta.

  • VPN:

    Desde tu teléfono, conéctate al servidor VPN utilizando una aplicación de VPN. Cuando estés en una Red Privada Virtual (VPN), tanto el servidor como el teléfono se convierten en parte de una red local, así que simplemente aplica iptables DNAT para reenviar el puerto específico a la IP de tu teléfono:

    ~# iptables -t nat -I PREROUTING -p tcp --dport 2222 -j DNAT --to :22

    El Reenvío de IP también es necesario en el servidor, que probablemente ya se haya configurado durante la configuración del servidor VPN:

    ~# echo 1 >/proc/sys/net/ipv4/ip_forward
    ~# iptables -I FORWARD -d  -j ACCEPT
    ~# iptables -I FORWARD -s  -j ACCEPT

Ahora puedes hacer ssh desde cualquier host en internet a tu teléfono:

~$ ssh @ -p 2222

Iniciarás sesión en tu teléfono después de la autenticación.


Expliqué aquí el ejemplo de SSH. De la misma manera, puedes ejecutar cualquier otro servidor en tu teléfono y reenviar su puerto desde el servidor SSH/VPN (con IP pública) a tu teléfono (sin IP pública) para que tu servidor sea accesible desde internet.


RELACIONADO:

0 votos

Solo un apéndice a la sección "VPN": Solo el teléfono en el que se está ejecutando el servidor debe utilizar una conexión VPN si la VPN utilizada proporciona una IP pública al teléfono (a menudo denominada IP estática o dedicada). En tal caso, el cliente podría utilizar la IP pública ofrecida por la VPN y acceder al servicio ssh ofrecido. Hay proveedores de VPN públicos que ofrecen este tipo de servicio de VPN.

1 votos

@Robert lo siento, no pude entender el punto. ¿Podrías elaborar?

1 votos

No necesitas dos conexiones VPN. Escribiste que deberían estar ubicadas en la misma red local. Pero no tiene que ser una red local, el mismo Internet también es válido. Si el dispositivo de servidor se encuentra con una IP pública en Internet, el segundo dispositivo no necesita una conexión VPN.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X