Comment se connecter à une machine Linux qui change régulièrement d'IP?


12

Mon problème est de trouver un moyen de SSH dans un serveur Linux (Ubuntu 18.04) dont l'adresse IP change quotidiennement.

J'ai un client que j'aide occasionnellement pour les tâches d'administration. J'ai besoin de ssh dans la machine quand ils ont besoin d'aide, mais ils n'ont pas d'IP statique, donc l'IP publique du serveur change constamment. J'ai créé un petit script pour signaler l'adresse IP de la machine Linux et je constate qu'elle change une fois par jour vers midi.

Je suis capable de configurer SSH, et cela fonctionne à la fois localement et à distance ... jusqu'à ce que l'adresse IP change. Une fois que cela se produit, je ne peux plus me connecter à distance, même en utilisant la nouvelle adresse IP.

  • Dois-je redémarrer le service SSH chaque fois que l'adresse IP change?
  • Si oui, pourquoi?
  • Y a-t-il une autre action que je dois entreprendre lorsque l'adresse IP change afin de permettre l'accès SSH?

MISE À JOUR

Pour être clair, mon problème n'est PAS de trouver la nouvelle adresse IP. J'ai déjà un script pour le faire. Le problème est que le serveur cesse de répondre une fois que l'IP change, même si j'essaie de me connecter en utilisant la nouvelle adresse IP.

Si je redémarre le service SSH sur la machine cible, j'ai à nouveau un accès à distance. Mais je ne comprends pas pourquoi je devrais faire ça. Je voudrais connaître la cause profonde dans l'espoir de trouver une meilleure solution.

La plupart des gens semblent penser que SSH devrait fonctionner tant que nous connaissons la nouvelle IP, est-ce donc quelque chose d'unique au 18.04? J'ai récemment installé ce serveur pour le client, donc tous les paramètres de configuration sont toujours par défaut. (Ils ne sauraient pas comment le changer.)



12
Criez à leur FAI. Changer d'adresse IP une fois par jour est absurde pour une connexion professionnelle, et c'est même relativement inconnu pour une connexion résidentielle.
Michael Hampton

2
Vous dites que l'accès ssh cesse de fonctionner lorsque l'adresse IP change. Mais vous n'avez pas dit quand il recommencerait à fonctionner. Je suppose qu'il doit en quelque sorte recommencer à fonctionner, sinon vous ne pourriez pas le voir cesser de fonctionner tous les jours. Et vous n'êtes pas censé faire quoi que ce soit lorsque l'adresse IP change. Le serveur ssh sera immédiatement accessible sur la nouvelle adresse IP.
kasperd

1
Il pourrait y avoir une bizarrerie comme DDNS en cours d'exécution, et quelque chose comme ListenAddress <dynamic host name>dans le fichier de configuration sshd, peut-être parce que quelqu'un ne voulait pas que les utilisateurs internes puissent ssh dans le serveur. Cela nécessiterait en fait de redémarrer le serveur ssh chaque fois que l'IP change.
Guntram Blohm prend en charge Monica

1
@MichaelHampton: Crier n'aidera probablement pas, payer sera. Avec la rareté actuelle des adresses IPv4, la plupart des fournisseurs facturent un supplément pour une adresse IPv4 statique (certains facturent même un supplément pour une adresse IP publique non statique, sinon vous obtenez Dual Stack Lite ). Bien sûr, si OP est sur IPv6, les choses changent ...
sleske

Réponses:


21

Les autres réponses semblent avoir oublié une chose dans votre question:

Une fois que cela se produit, je ne peux plus me connecter à distance, même en utilisant la nouvelle adresse IP

DDNS vous aidera à trouver la nouvelle adresse IP, mais cela ne semble pas être le problème ici.

Malheureusement, le serveur obtenant une nouvelle adresse IP ne devrait pas être un problème dans la configuration standard où le FAI fournit un routeur, le serveur a une adresse interne derrière le routeur et le routeur fait la redirection de port. Vous devrez peut-être fournir plus d'informations sur la topologie du réseau pour obtenir une bonne réponse.

Ce que je pourrais imaginer, c'est que le serveur n'est pas derrière un routeur et qu'il fait sa propre connexion PPPoE, et a) que le serveur ssh se lie à l'adresse d'interface spécifique au point de redémarrage du serveur, b) un pare-feu sur la machine qui permet aux ssh entrants de juste l'IP du serveur avec le pare-feu qui ne se met pas à jour lorsque l'IP change.

Pour vérifier le premier cas, procédez comme suit netstat -nta | grep -w 22 | grep LISTEN. S'il indique 0.0.0.0:22, c'est ok; si elle énumère une adresse IP spécifique, puis vérifier le fichier de configuration de sshd ( /etc/sshd.conf) pour ListenAddress.

Pour vérifier le deuxième cas, faites iptables -L -net vérifiez si l'une des règles de la INCOMINGchaîne correspond à l'IP et au port 22 de votre serveur.

Si l'un d'eux a l'adresse du serveur actuelle, vous devrez soit la changer en 0.0.0.0 (assurez-vous que vous connaissez les implications pour la sécurité), soit mettre à jour la règle / configuration chaque fois que l'IP change.

Éditer

Comme le serveur est derrière un routeur, les idées ci-dessus ne s'appliquent probablement pas (*). Dans cette configuration, le routeur a une adresse IP externe (qui change quotidiennement) et vos périphériques internes doivent avoir des adresses 10.xyz ou 192.168.xy qui ne devraient pas changer. Vous vous connectez à l'adresse externe et le routeur doit appliquer une règle de transfert de port à l'adresse interne.

Cette redirection de port ne doit pas se rompre lorsque l'IP externe change (les connexions ssh existantes seront cependant abandonnées), mais c'est peut-être une règle qui n'a pas été configurée par vous, mais par un peu de magie UPNP, le routeur abandonnant UPNP vers l'avant lorsqu'il obtient une nouvelle adresse, et sshd n'appelle la règle qu'au redémarrage. Avez-vous configuré vous-même un redirecteur de port dans le routeur?

Ou, c'est l' IP interne du serveur qui change - dans ce cas, quelque chose est gravement cassé avec votre DHCP. Donnez à votre serveur une adresse interne fixe.

Ou utilisez-vous IPV6? Il existe certaines configurations où un appareil change constamment son IP pour le rendre moins facile à suivre. Voir, par exemple, https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/ - mais dans ce cas, honte à vous de ne pas en le mentionnant dans votre message d'origine. Cela pourrait signifier que votre routeur ne fait pas du tout de NAT, et mes idées originales sont toujours valables même derrière un routeur.


2
+1 pour être la première réponse à répondre réellement à ce qui a été demandé dans la question.
kasperd

@Guntram Blohm Merci pour la réponse! Le serveur est derrière un routeur. Ces deux possibilités seraient-elles toujours valables dans ce scénario? Si c'est le cas, je les vérifierai tous les deux le lendemain ou alors quand je pourrai accéder localement à la machine cible.
Richard

11

Le DNS dynamique est une option, une autre consiste à recevoir le courrier du serveur ou à vous envoyer son adresse IP. Un simple appel HTTP ferait l'affaire (vers un point de terminaison que vous contrôlez et connectez les demandes).

Il est également possible de résoudre l'ensemble du réseau public dans l'autre sens; vous pouvez demander au serveur de configurer un tunnel inverse ou une connexion VPN, qui ne seront pas affectés par le changement d'adresse IP.

Concernant les services ne répondant pas sur la nouvelle adresse: cela dépend complètement de la configuration de votre réseau. Par exemple: IP WAN sur une interface interne via DHCP et un serveur SSH configuré pour écouter uniquement l'IP sur votre interface connue au démarrage signifierait que sshd doit être redémarré lors des changements d'interface.


1
Comme décrit dans la question, il existe déjà une solution pour trouver la nouvelle adresse IP. Ainsi, l'ajout d'un DNS dynamique ne résoudrait pas vraiment les problèmes. Le problème décrit est que le serveur ssh cesse de répondre lorsque l'adresse IP change. Vous n'avez pas résolu ce problème. Les connexions VPN et les tunnels inverses devraient cesser de fonctionner lorsque l'IP change, vous avez donc besoin de quelque chose en place pour les redémarrer automatiquement.
kasperd

7

Vous devriez vraiment regarder dans les services ddns. En ce qui concerne la possibilité de se connecter à distance à une certaine machine avec une adresse IP dynamique; ddns est la solution la plus utilisée.

rendez-vous sur https://noip.com et inscrivez-vous pour un compte (c'est, errr ... supposément..coff..cof .. Gratuit pour 1-3 machines fonctionnant sur le même réseau (si je ne me trompe pas, ne citez pas moi ici: ça fait un moment que ive ne fait confiance à aucun de ces services "gratuits" ...) Il existe aussi d'autres alternatives comme Afraid DNS ( https://freedns.afraid.org/ Et même, Cisco, Open DNS: pourrait également être utilisé (à condition que ce ne soit pas seulement votre client, je vous suggère de vous inscrire à un essai de compte parapluie, de le prendre pour un tour et de vous inscrire plus tard pour le vrai >>> ils ont même obtenu l'une d'entre elles comme des extensions téléchargeables de type GUI qui renouvelleraient automatiquement le nom d'hôte ddns chaque fois que l'IP de vos clients changerait. au cas où vous devez appeler un de vos clients et me demander de télécharger l'interface graphique plutôt ....])


3
Bien que cela soit certainement utile pour accéder à un hôte sur la modification des adresses IP, ce n'est pas ce que la question pose. La question est de savoir pourquoi le serveur ssh cesse de répondre lorsque l'adresse IP change et comment y remédier. Un service DNS dynamique ne résout pas cela.
kasperd

4

Je suis capable de configurer SSH, et cela fonctionne à la fois localement et à distance ... jusqu'à ce que l'adresse IP change. Une fois que cela se produit, je ne peux plus me connecter à distance, même en utilisant la nouvelle adresse IP.

Parfois, il faut du temps pour que les modifications DHCP prennent effet. Essayez de recycler le client DHCP sur la machine cible

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

Non. Vous n'avez besoin de recycler votre service ssh que lorsque la configuration change ( /etc/ssh/sshd_conf).

Y a-t-il une autre action que je dois entreprendre lorsque l'adresse IP change afin de permettre l'accès SSH?

Non.

J'ai une solution qui suppose que vous avez configuré sendmail sur votre machine cible.

Ce script envoie un e-mail qui montre l'adresse IP que le monde pense que nous avons (merci ipify.org). L'email aura toujours l'adresse IP la plus récente.

  1. Créer un script bash dhcp-notify (sans l'extension .sh)
  2. Mettez le script dans /etc/dhcp/dhclient-exit-hooks.d

    #!/bin/sh
    case "$reason" in (BOUND|RENEW|REBIND|REBOOT)
    (
       echo To: me@my.email
       echo From: me@my.email
       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 cela ne fonctionne pas, vous pouvez toujours configurer un cron pour vous envoyer l'adresse IP actuelle (perdre l'instruction case).

#!/bin/sh
(
   echo To: me@my.email
   echo From: me@my.email
   echo "Content-Type: text/html; "
   echo Subject: IP address change
   echo
   echo Your IP address is: `curl -s https://api.ipify.org`
) | sendmail -t

J'étais sur le point de suggérer cela, c'est une excellente idée, et la première chose qui m'est venue à l'esprit lorsque j'ai lu la question. De plus, si vous rencontrez des problèmes avec api.ipify.org (il est bloqué sur le réseau de mon école pour une raison quelconque), vous pouvez utiliser cet autre site que j'ai fait quelques mois auparavant qui fait la même chose: findip.win
annuler

@karlchilders Merci pour la réponse! J'ai déjà un script cron me rapportant l'adresse IP, mais je n'avais aucune idée des hooks dhclient. C'est génial! Je préfère de loin que l'IP soit signalée lorsqu'elle change réellement. Question: Si ce script est capable de fonctionner et de signaler l'adresse IP, pourquoi le recyclage de dhclient aurait-il un effet sur l'accès SSH?
Richard

@karlchilders Ou ce script ne fonctionne-t-il que lorsque vous recyclez manuellement dhclient?
Richard

dhclient -r; dhclient renouvellera le bail dhcp afin que votre hôte soit à jour. Les hooks fonctionneront chaque fois qu'un événement DHCP se produit manuellement ou autrement.
karlchilders

@Richard Veuillez marquer l'une des réponses comme réponse préférée. Je vous remercie.
karlchilders

3

Sortir des sentiers battus - pourriez-vous organiser une adresse IPv6 fixe? Ce ne sont généralement que les adresses IPv4 qui doivent changer, en raison de leur rareté.


L'adresse IP que je dérive est en fait IPv6 à chaque fois.
Richard

1
@ Richard: Désolé d'entendre que cela ne fonctionne pas pour vous. Je laisserai la réponse à d'autres personnes qui ont ce problème avec IPv4.
MSalters

@Richard Vous devriez vraiment mentionner dans votre question que vous avez affaire à IPv6. Cela rend le problème très différent.
Dubu

1
@Dubu Cela rend effectivement le problème différent. Ce type de problème n'est pas censé se produire sur IPv6, ce qui peut expliquer pourquoi tout le monde a supposé qu'il s'agissait d'IPv4. Mais en fait, vous pourriez obtenir certains des symptômes décrits si vous utilisez par erreur une adresse de confidentialité plutôt qu'une adresse statique. Si, par exemple, vous demandez à un site Web quelle est votre adresse IP, il affichera votre adresse de confidentialité plutôt que votre adresse statique. Et l'utiliser pour les connexions ssh n'est pas une bonne idée. N'explique toujours pas pourquoi cela ne fonctionne pas tant que le serveur ssh n'a pas été redémarré.
kasperd

1
@Dubu: C'est une approche plutôt non standard. DHCPv6-PD (délégation de préfixe) en combinaison avec DHCP Unique ID (DUID) devrait empêcher cela.
MSalters

1

Ce que je fais depuis presque un an. J'ai rencontré votre problème en janvier de cette année en prononçant un discours dans mon université locale.

Ce script fonctionne depuis sur ma machine depuis lors: // Plutôt explicite //

import smtplib
from requests import get
import time

user = 'exampleemail@gmail.com'
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 devrait fonctionner sans problème Peut-être pas la meilleure solution, mais cela fonctionne.

Vous recevrez un e-mail dans votre boîte de réception chaque fois que l'adresse IP publique de la machine change.

Maintenant, concernant vos questions:

Dois-je redémarrer le service chaque fois que l'adresse IP change? Si en redémarrant le service, vous entendez rétablir la connexion ssh, oui.

Si oui, pourquoi? Parce que si l'adresse avec laquelle vous essayez de communiquer ne fournit plus le service que vous recherchez. Ce n'est plus votre machine.

Y a-t-il une autre action que je dois entreprendre lorsque l'adresse IP change afin de permettre l'accès SSH? Juste SSH à la nouvelle adresse.

À votre santé! JSR


Merci pour la réponse @JSR! J'ai en fait écrit un script similaire pour me signaler l'adresse IP. Mais une fois qu'il change, même en connaissant la nouvelle adresse IP, je ne peux pas me connecter à SSH sur la machine distante. Avez-vous rencontré ce problème?
Richard

Êtes-vous sûr de récupérer la bonne adresse? si c'est le cas, essayez de lui envoyer une requête ping une fois que vous avez obtenu l'IP. Je n'ai jamais vu ce problème auparavant. Au cas où vous ne le sauriez pas, vous pouvez exécuter le script en arrière-plan avec "python3 scriptname.py &". Vérifiez également les ports de transfert du routeur, je suppose que l'adresse IP locale ne fonctionne pas. ne change pas, mais ça vaut quand même le coup d'oeil.
Jaime Satorres Rey

Oui, l'IP est correcte. Si je redémarre le service SSH sur la machine cible, je peux me reconnecter. Mais je ne comprends pas pourquoi cela devrait être le cas.
Richard

@Richard, le problème ici est que depuis que votre adresse IP change, votre hôte arrête chaque connexion car la clé RSA que vous utilisez pour vous authentifier ne correspond pas à celle qu'il demande. Je ne suis en aucun cas un expert sur ce sujet, alors ne prenez pas mes mots comme un fait ... Mais votre situation est probablement comme ça à cause de ce que je viens de dire.
Jaime Satorres Rey

1

Cela vaut la peine de voir cela d'un autre côté: généralement, il est beaucoup plus simple de créer une connexion sortante à partir de la machine qui nécessite votre attention (DNS, NAT et autres paramètres de pare-feu n'ont pas d'importance du tout ou sont beaucoup plus simples).

Vous pouvez l'utiliser pour établir une solution à l'épreuve des balles et simple pour accéder à une machine distante R. La seule condition est que vous puissiez fournir un sshaccès public à l'une de vos propres machines locales (appelons-la S). Procédez ensuite comme suit:

  1. Créez une sshconnexion extérieure de Rà S, en établissant un tunnel inverse dansR :

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

  2. Activé S, utilisez le tunnel inverse pour accéder à sshla machine distante R:

    ssh -p 22000 127.0.0.1

L'étape 1 peut être déclenchée manuellement et à la demande par le côté distant chaque fois que votre assistance est nécessaire. Alternativement, vous pouvez créer un service Rqui maintiendra en permanence un tel tunnel inverse vers S.

J'ai utilisé une telle configuration pour me connecter à des systèmes distants (mobiles) qui étaient derrière des pare-feu / NAT et qui n'avaient aucune entrée DNS du tout.


1

Si vous avez juste besoin d'une connexion à distance, utilisez mosh . En plus d'être en mesure de faire face parfaitement aux changements IP (avec presque aucune latence pendant le commutateur), il présente également d'autres avantages par rapport à la simplicité ssh, comme l'écho local prédictif, une faible latence, une récupération beaucoup plus rapide à partir de liens rompus.

Si vous avez spécifiquement besoin ssh(par exemple, vous avez besoin du transfert X11 ou quelque chose), je suggère de configurer un VPN (par exemple OpenVPN), de préférence sur UDP, avec une courte durée de vie. Les connexions TCP (c'est-à-dire votre ssh) sur VPN guérissent et restent connectées après le changement d'IP, cela prendra juste plus de temps (jusqu'à une minute environ), mais vous pouvez jouer avec les /proc/sys/net/ipv4/tcp_*entrées pour le rendre plus acceptable.

Éditer:

  • mosh a besoin sshd'authentification, mais une fois authentifiée, la connexion reste jusqu'à ce que vous vous déconnectiez (ou redémarrez), et vous pouvez enquêter sur l'échec sshà votre guise (par exemple strace -f -p pid_of_sshd )
  • il est possible d'utiliser moshsans ssh, réponse adaptée d' ici :

Sur le serveur, exécutez:

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

vous obtenez un résultat comme QzdRHbAWzL7eRobi75DCrz

Sur le client exécutez:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

Notez que cela $serveripdoit être une adresse IP, pas de résolution de nom d'hôte.

La façon dont vous obtenez la clé d'un côté à l'autre dépend de vous. Je suggérerais de chiffrer avec une clé pré-partagée et de messagerie instantanée, de mailing ou de faire en sorte qu'un utilisateur local le dicte par appel téléphonique.

  • s'il y a vraiment un problème avec ssh, installez inetdet exécutez ssh à partir de là, pas en tant que démon autonome, par exemple par cette ligne de configuration pour inetd.conf "classique", cela lancera un nouveau démon à chaque connexion (notez que tous les fourches inetd gèrent ipv6):

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


1
Merci pour la réponse @Radovan! Mosh semble intéressant, mais il semble qu'il utilise SSH pour s'authentifier. Donc, la racine de mon problème existe toujours, n'est-ce pas? Faites-moi savoir si j'ai mal compris les documents.
Richard

@ Richard Oui, mais il y a des possibilités ... J'ai édité ma réponse.
Radovan Garabík
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.