¿Cómo conectarse a una máquina Linux que cambia la IP regularmente?

12

Mi problema es encontrar una forma de SSH en un servidor Linux (Ubuntu 18.04) cuya dirección IP cambia a diario.

Tengo un cliente al que ocasionalmente ayudo con las tareas administrativas. Necesito ingresar en la máquina cuando necesitan ayuda, pero no tienen una IP estática, por lo que la IP pública del servidor cambia constantemente. Creé un pequeño script para informar la dirección IP de la máquina Linux, y descubrí que cambia una vez al día alrededor del mediodía.

Puedo configurar SSH, y funciona tanto local como remotamente ... hasta que cambie la dirección IP. Una vez que eso sucede, ya no puedo conectarme de forma remota, incluso usando la nueva dirección IP.

  • ¿Necesito reiniciar el servicio SSH cada vez que cambia la dirección IP?
  • Si es así, ¿por qué?
  • ¿Hay alguna otra acción que deba tomar cuando cambie la dirección IP para permitir el acceso SSH?

ACTUALIZAR

Para que quede claro, mi problema NO es encontrar la nueva dirección IP. Ya tengo un guión para hacerlo. El problema es que el servidor deja de responder una vez que cambia la IP, aunque trato de conectarme usando la nueva dirección IP.

Si reinicio el servicio SSH en la máquina de destino, tengo acceso remoto nuevamente. Pero no entiendo por qué debería tener que hacer esto. Me gustaría conocer la causa raíz con la esperanza de encontrar una mejor solución.

La mayoría de la gente parece pensar que SSH debería funcionar siempre que conozcamos la nueva IP, entonces, ¿es algo exclusivo de 18.04? Instalé este servidor para el cliente recientemente, por lo que toda la configuración sigue siendo predeterminada. (El no sabría cómo cambiarlo).

Ricardo
fuente
8
Utiliza dns dinámicos .
Ipor Sircer
12
Gritar a su ISP. Cambiar la dirección IP una vez al día es absurdo para una conexión comercial, e incluso es relativamente desconocido para una conexión residencial.
Michael Hampton
2
Dice que el acceso ssh deja de funcionar cuando cambia la dirección IP. Pero no ha dicho cuándo comienza a funcionar nuevamente. Supongo que de alguna manera debe comenzar a funcionar nuevamente, de lo contrario no podría ver que deja de funcionar todos los días. Y no se debe hacer nada cuando cambia la dirección IP. El servidor ssh será accesible de inmediato en la nueva dirección IP.
kasperd
1
Podría haber algunas rarezas como DDNS en ejecución, y algo así como ListenAddress <dynamic host name>en el archivo de configuración sshd, tal vez porque alguien no quería que los usuarios internos pudieran ingresar al servidor. En realidad, esto requeriría reiniciar el servidor ssh cada vez que cambie la IP.
Guntram Blohm apoya a Monica el
1
@MichaelHampton: Gritar probablemente no ayudará, pagar lo hará. Con la escasez actual de direcciones IPv4, la mayoría de los proveedores cobran extra por una dirección IPv4 estática (algunos incluso cobran extra por una dirección IP pública no estática, de lo contrario obtienes Dual Stack Lite ). Por supuesto, si OP está en IPv6, las cosas cambian ...
sleske

Respuestas:

21

Las otras respuestas parecen haber pasado por alto una cosa en su pregunta:

Una vez que eso sucede, ya no puedo conectarme de forma remota, incluso usando la nueva dirección IP

DDNS lo ayudará a encontrar la nueva dirección IP, pero ese no parece ser el problema aquí.

Desafortunadamente, el servidor que obtiene una nueva IP no debería ser un problema en la configuración estándar donde el ISP proporciona un enrutador, el servidor tiene una dirección interna detrás del enrutador y el enrutador realiza el reenvío de puertos. Es posible que deba proporcionar más información sobre la topología de la red para obtener una buena respuesta.

Lo que podría imaginar es que el servidor no está detrás de un enrutador y está haciendo su propia conexión PPPoE, y a) el servidor ssh se vincula a la dirección de interfaz específica en el punto de reinicio del servidor, b) un firewall en la máquina que permite que ssh entrante solo la IP del servidor con el firewall que no se actualiza cuando cambia la IP.

Para verificar el primer caso, haga a netstat -nta | grep -w 22 | grep LISTEN. Si dice 0.0.0.0:22, está bien; si enumera una IP específica, verifique el archivo de configuración sshd ( /etc/sshd.conf) para ListenAddress.

Para verificar el segundo caso, iptables -L -nverifique si una de las reglas de la INCOMINGcadena coincide con la IP de su servidor y el puerto 22.

Si uno de estos tiene la dirección del servidor actual, deberá cambiarlo a 0.0.0.0 (asegúrese de conocer las implicaciones de seguridad) o actualizar la regla / configuración cada vez que cambie la IP.

Editar

Como el servidor está detrás de un enrutador, las ideas anteriores probablemente no se apliquen (*). En esta configuración, el enrutador tiene una IP externa (que cambia diariamente), y sus dispositivos internos deben tener algunas direcciones 10.xyz o 192.168.xy que no deberían cambiar. Se conecta a la dirección externa y el enrutador debe tener una regla de reenvío de puertos a la dirección interna.

Este reenvío de puertos no debe romperse cuando cambia la IP externa (sin embargo, se eliminarán las conexiones ssh existentes), pero tal vez es una regla que no fue configurada por usted, sino por un poco de magia UPNP, con el enrutador soltando UPNP hacia adelante cuando llega una nueva dirección, y sshd solo invoca la regla cuando se reinicia. ¿Configuró usted mismo un reenviador de puertos dentro del enrutador?

O bien, es la IP interna del servidor la que cambia; en ese caso, algo se rompe gravemente con su DHCP. Dele a su servidor una dirección interna fija.

¿O estás usando IPV6? Hay algunas configuraciones en las que un dispositivo sigue cambiando su IP para que sea menos fácil de rastrear. Ver, por ejemplo, https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/ - pero en ese caso, la culpa es tuya por no mencionándolo en tu publicación original. Esto podría significar que su enrutador no está haciendo NAT, y mis ideas originales siguen siendo válidas incluso detrás de un enrutador.

Guntram Blohm apoya a Monica
fuente
2
+1 por ser la primera respuesta para abordar realmente lo que se preguntó en la pregunta.
Kasperd
@Guntram Blohm ¡Gracias por la respuesta! El servidor está detrás de un enrutador. ¿Seguirían siendo válidas estas dos posibilidades en ese escenario? Si es así, los revisaré ambos al día siguiente más o menos cuando pueda acceder localmente a la máquina de destino.
Richard
11

El DNS dinámico es una opción, otra es tener el correo del servidor o enviarle su IP. Una simple llamada HTTP lo haría (a un punto final que controle y registre solicitudes).

También es posible resolver toda la red pública al revés; puede hacer que el servidor configure un túnel inverso o una conexión VPN, que no se verá afectada por el cambio de IP.

Con respecto a los servicios que no responden en la nueva dirección: esto depende completamente de la configuración de su red. Por ejemplo: WAN IP en una interfaz interna a través de DHCP y un servidor SSH configurado para escuchar solo la IP en su interfaz conocida en el inicio significaría que sshd debe reiniciarse en los cambios de interfaz.

John Keates
fuente
1
Como se describe en la pregunta, ya existe una solución para encontrar la nueva dirección IP. Por lo tanto, agregar DNS dinámico realmente no resolvería ningún problema. El problema descrito es que el servidor ssh deja de responder cuando cambia la dirección IP. No has abordado ese problema. OTOH espera que las conexiones VPN y los túneles inversos dejen de funcionar cuando cambie la IP, por lo que necesita algo en su lugar para reiniciarlos automáticamente.
kasperd el
7

Realmente deberías buscar en los servicios de ddns. En cuanto a la posibilidad de conectarse de forma remota a una determinada máquina con una dirección IP dinámica; ddns es la solución más utilizada.

dirígete a https://noip.com y regístrate para obtener una cuenta (es, errr ... supuestamente ... café ... café ... Gratis para 1-3 máquinas que se ejecutan en la misma red (si no estoy equivocado, no cotices yo aquí: ha pasado un tiempo desde que he confiado en cualquiera de estos servicios 'gratuitos'). También hay otras alternativas como DNS asustado ( https://freedns.afraid.org/ E incluso, el DNS abierto de Cisco: también se podría utilizar (siempre que no se trate de su único cliente, le sugiero que se registre para una prueba de cuenta general, pruébelo y luego regístrese para el verdadero trato >>> incluso obtuvieron una de ellas extensiones descargables tipo GUI que renovarían automáticamente el nombre de host ddns cada vez que cambian los ip de sus clientes. Realmente es la forma más fácil y no tecnológica que conozco [solo en en caso de que tengas que llamar a uno de tus clientes y pedirme que descargue la GUI más bien ...

dotbiggie
fuente
3
Si bien esto es ciertamente útil para acceder a un host al cambiar las direcciones IP, esa no es la pregunta. La pregunta es por qué el servidor ssh deja de responder cuando cambia la dirección IP y cómo solucionarlo. Un servicio DNS dinámico no aborda eso.
kasperd el
4

Puedo configurar SSH, y funciona tanto local como remotamente ... hasta que cambie la dirección IP. Una vez que eso sucede, ya no puedo conectarme de forma remota, incluso usando la nueva dirección IP.

A veces, los cambios de DHCP tardan un tiempo en surtir efecto. Intente reciclar el cliente DHCP en la máquina de destino.

$> sudo dhclient -r
$> sudo dhclient
Do I need to restart the service every time the IP address changes?
If so, why?

No. Solo necesita reciclar su servicio ssh cuando la configuración cambia ( /etc/ssh/sshd_conf).

¿Hay alguna otra acción que deba tomar cuando cambie la dirección IP para permitir el acceso SSH?

No.

Tengo una solución que asume que tiene configurado sendmail en su máquina de destino.

Este script envía un correo electrónico que muestra la dirección IP que el mundo cree que tenemos (Gracias ipify.org). El correo electrónico siempre tendrá la dirección IP más actual.

  1. Crear script bash dhcp-notify (sin la extensión .sh)
  2. Pon el guión en /etc/dhcp/dhclient-exit-hooks.d

    #!/bin/sh
    case "$reason" in (BOUND|RENEW|REBIND|REBOOT)
    (
       echo To: [email protected]
       echo From: [email protected]
       echo "Content-Type: text/html; "
       echo Subject: DHCP reason: $reason
       echo
       echo Your IP address is: `curl -s https://api.ipify.org`
    ) | sendmail -t
    ;;
    esac
    

Si esto no funciona, siempre puede configurar un cron para que le envíe la dirección IP actual (pierda la declaración del caso).

#!/bin/sh
(
   echo To: [email protected]
   echo From: [email protected]
   echo "Content-Type: text/html; "
   echo Subject: IP address change
   echo
   echo Your IP address is: `curl -s https://api.ipify.org`
) | sendmail -t
karlchilders
fuente
Estaba a punto de sugerir esto, es una gran idea, y lo primero que se me ocurrió cuando leí la pregunta. Además, si tiene problemas con api.ipify.org (está bloqueado en la red de mi escuela por alguna razón), puede usar este otro sitio que hice unos meses antes y que hace lo mismo: findip.win
deshacer
@karlchilders Gracias por la respuesta! Ya tengo un script cron que me informa la dirección IP, pero no tenía idea de los enlaces de dhclient. Eso es asombroso! Preferiría que solo se informara la IP cuando realmente cambie. Pregunta: Si este script puede funcionar e informar la dirección IP, ¿por qué el reciclaje de dhclient tendría un efecto en el acceso SSH?
Richard
@karlchilders ¿O este script solo funciona cuando reciclas manualmente dhclient?
Richard
dhclient -r; dhclient renovará la concesión de dhcp para que su host esté actualizado. Los ganchos funcionarán cada vez que ocurra un evento dhcp, ya sea manualmente o de otra manera.
karlchilders
@ Richard Marque una de las respuestas como la respuesta preferida. Gracias.
karlchilders
3

Pensando fuera de la caja: ¿podría organizar una dirección IPv6 fija? Por lo general, solo las direcciones IPv4 deben cambiar debido a su escasez.

MSalters
fuente
La dirección IP que extraigo es en realidad IPv6 cada vez.
Richard
1
@ Richard: Lamento escuchar que no funciona para ti. Dejaré la respuesta para otras personas que tienen este problema con IPv4.
MSalters
@ Richard Realmente debería mencionar en su pregunta que está tratando con IPv6. Esto hace que el problema sea bastante diferente.
Dubu
1
@Dubu De hecho, hace que el problema sea diferente. No se supone que este tipo de problema ocurra en IPv6, por lo que todo el mundo asumió que era IPv4. Pero, de hecho, podría obtener algunos de los síntomas descritos si usa por error una dirección de privacidad en lugar de una dirección estática. Si, por ejemplo, le pregunta a un sitio web cuál es su dirección IP, mostrará su dirección de privacidad en lugar de su dirección estática. Y usar eso para conexiones ssh no es una buena idea. Todavía no explica por qué no funciona hasta que se reinicia el servidor ssh.
kasperd
1
@Dubu: Ese es un enfoque bastante no estándar. DHCPv6-PD (Delegación de prefijo) en combinación con DHCP Unique ID (DUID) debería evitar eso.
MSalters
1

Lo que he estado haciendo durante casi un año. Me encontré con tu problema en enero de este año mientras daba un discurso en mi universidad local.

Este script se ha estado ejecutando en mi máquina desde entonces: // Se explica por sí mismo //

import smtplib
from requests import get
import time

user = '[email protected]'
psd = 'examplepassword'
msg = 'Hey, your ip has changed! Use this one from now on: '
currip = '0.0.0.0' # It'll send an email the first time you execute this aswell
while True:
    newip = get('https://api.ipify.org').text
    if currip == newip:
        print("nonewip")
        #You can just comment the line above this one if you want to
    else:
        tmpmsg = "\n"+msg + newip +" The old one used to be: "+currip
        currip = newip
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.connect('smtp.gmail.com')
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(user,psd)
        #You can change the second parameter, use ('from','to','message')
        server.sendmail(user, user, tmpmsg)

        server.quit()
        with open('/home/pi/DEV/iphistory.txt', 'a') as f:
            f.write('newip: '+currip+'\n')
            f.close()
        print('New IP Found: '+tmpmsg)
    time.sleep(7200)

Python 3.x debería funcionar sin problemas Tal vez no sea la mejor solución, pero funciona.

Recibirá un correo electrónico en su Bandeja de entrada cada vez que cambie la IP pública de la máquina.

Ahora, con respecto a sus preguntas:

¿Necesito reiniciar el servicio cada vez que cambia la dirección IP? Si al reiniciar el servicio te refieres a restablecer la conexión ssh, sí.

Si es así, ¿por qué? Porque si la dirección con la que estás tratando de comunicarte ya no proporciona el servicio que estás buscando. Ya no es tu máquina.

¿Hay alguna otra acción que deba tomar cuando cambie la dirección IP para permitir el acceso SSH? Solo SSH a la nueva dirección.

¡Salud! JSR

Jaime Satorres Rey
fuente
Gracias por la respuesta @JSR! De hecho, he escrito un script similar para informarme la dirección IP. Pero una vez que cambia, incluso conociendo la nueva dirección IP, no puedo ingresar SSH a la máquina remota. ¿Has encontrado ese problema?
Richard
¿Estás seguro de que estás recuperando la dirección correcta? si es así, intente hacer ping en él una vez que obtenga la IP. Nunca he visto ese problema antes. Además, en caso de que no lo supieras, puedes ejecutar el script en segundo plano con "python3 scriptname.py &" Además, verifica los puertos de reenvío del enrutador, supongo que la IP local no No cambies, pero aún así vale la pena echarle un vistazo.
Jaime Satorres Rey
Sí, la IP es correcta. Si reinicio el servicio SSH en la máquina de destino, puedo volver a conectarme. Pero no entiendo por qué ese debería ser el caso.
Richard
@Richard, el problema aquí es que, dado que su IP cambia, su host detiene todas las conexiones, ya que la clave RSA que está utilizando para autenticar no coincide con la que está solicitando. De ninguna manera soy un experto en este tema, así que no tome mis palabras como un hecho ... Pero su situación es así PROBABLEMENTE debido a lo que acabo de decir.
Jaime Satorres Rey
1

Vale la pena ver esto desde un lado diferente: por lo general, es mucho más simple crear una conexión externa desde la máquina que requiera su atención (DNS, NAT y otras configuraciones de firewall no importan en absoluto o son mucho más simples).

Puede usar esto para establecer una solución simple y a prueba de balas para ingresar a una máquina remota R. El único requisito es que puede proporcionar sshacceso público a una de sus propias máquinas locales (llamémosla S). Luego proceda de la siguiente manera:

  1. Cree una sshconexión externa de Ra S, estableciendo un túnel inverso enR :

    ssh -L 22:<address-of-S>:22000

  2. Encendido S, use el túnel inverso para sshingresar a la máquina remota R:

    ssh -p 22000 127.0.0.1

El paso 1 podría activarse manualmente y a pedido desde el lado remoto cada vez que necesite su ayuda. Alternativamente, puede crear un servicio en el Rque mantendrá continuamente dicho túnel inverso S.

Utilicé tal configuración para iniciar sesión en sistemas remotos (móviles) que estaban detrás de firewalls / NAT y que no tenían entradas de DNS en absoluto.

Alex O
fuente
1

Si solo necesita un inicio de sesión remoto, use mosh . Además de poder hacer frente de manera excelente a los cambios de IP (casi sin latencia durante el cambio) también tiene otras ventajas sobre el plano ssh, como el eco predictivo local, baja latencia, recuperación mucho más rápida de enlaces rotos.

Si necesita específicamente ssh(por ejemplo, necesita reenvío X11 o algo así), sugiero configurar VPN (por ejemplo, OpenVPN), preferiblemente sobre UDP, con un breve keepalive. Las conexiones TCP (es decir, su ssh) sobre VPN sanarán y permanecerán conectadas después del cambio de IP, solo llevará más tiempo (hasta un minuto más o menos), pero puede jugar con /proc/sys/net/ipv4/tcp_*entradas para que sea más aceptable.

Editar:

  • Mosh necesita sshautenticación, pero una vez autenticada, la conexión permanece hasta que cierre la sesión (o reinicie), y puede investigar la falla sshen su tiempo libre (por ejemplo, strace -f -p pid_of_sshd )
  • es posible usar moshsin ssh, respuesta adaptada desde aquí :

En el servidor ejecute:

mosh-server new -p $randomport -- $shellprogram

obtienes un resultado como QzdRHbAWzL7eRobi75DCrz

En el cliente ejecute:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

Tenga en cuenta que $serveriptiene que ser una ip, sin resolución de nombre de host.

La forma de obtener la llave de un lado a otro depende de usted. Sugeriría cifrar con una clave precompartida y mensajería instantánea, envío por correo o hacer que un usuario local lo dicte mediante una llamada telefónica.

  • si realmente hay un problema con ssh, instale inetdy ejecute ssh desde allí, no como un demonio independiente, por ejemplo, mediante esta línea de configuración para inetd.conf "clásico", esto ejecutará un nuevo demonio cada vez que inicie sesión (tenga en cuenta que no todos Las horquillas inetd manejan ipv6):

ssh stream tcp6 nowait root /usr/sbin/sshd sshd -i

Radovan Garabík
fuente
1
Gracias por la respuesta @Radovan! Mosh parece interesante, pero parece que usa SSH para autenticarse. Entonces la raíz de mi problema aún existiría, ¿correcto? Avíseme si he entendido mal los documentos.
Richard
@ Richard Sí, sin embargo, hay posibilidades ... He editado mi respuesta.
Radovan Garabík