web-dev-qa-db-fra.com

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

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 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 aussi longtemps que nous connaissons la nouvelle IP, est-ce donc quelque chose d'unique au 18.04? J'ai installé ce serveur pour le client récemment, donc tous les paramètres de configuration sont toujours par défaut. (Ils ne sauraient pas comment le changer.)

12
Richard

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 IP devrait ne soit pas 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 fait sa propre PPPoE, et a) le serveur ssh se liant à l'adresse d'interface spécifique à le point de redémarrage du serveur, b) un pare-feu sur la machine qui permet à ssh entrant uniquement l'adresse IP du serveur, le pare-feu ne se mettant pas à jour lorsque l'IP change.

Pour vérifier le premier cas, effectuez une netstat -nta | grep -w 22 | grep LISTEN. S'il indique 0.0.0.0:22, c'est ok; s'il répertorie une adresse IP spécifique, vérifiez le fichier de configuration sshd (/etc/sshd.conf) pour ListenAddress.

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

Si l'un d'eux a l'adresse de 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.

Modifier

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.x.y.z ou 192.168.x.y 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 s'arrêter lorsque l'IP externe change (les connexions ssh existantes seront cependant abandonnées), mais peut-être c'est une règle qui n'a pas été configurée par vous, mais par un peu de magie UPNP, avec le routeur abandonnant UPNP vers l'avant quand il obtient une nouvelle adresse, et sshd n'appelant 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 en cela cas, honte à vous de ne pas en parler dans votre post d'origine. Cela peut signifier que votre routeur ne fait pas du tout NAT, et mes idées originales sont toujours valables même derrière un routeur.

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 à la nouvelle adresse: cela dépend complètement de la configuration de votre réseau. Par exemple: WAN IP 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.

11
John Keates

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 me citez pas ici: cela fait un moment que ive n'a fait confiance à aucun de ces services "gratuits" ...) Il existe également d'autres alternatives telles que Afraid DNS ( https: //freedns.afraid .org / Et même, Cisco, Open DNS: pourrait également être utilisé (à condition que vous ne soyez pas seulement client, je vous suggère de vous inscrire à un essai de compte parapluie, de le prendre pour un tour et plus tard inscrivez-vous pour la vraie affaire >>> ils ont même obtenu l'une d'entre elles 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. Je suis au courant [juste au cas où vous devriez appeler un de vos clients et me demander de télécharger plutôt l'interface graphique ....])

7
dotbiggie

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 devez uniquement recycler votre service ssh 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: [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 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: [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
4
karlchilders

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é.

3
MSalters

Ce que je fais depuis presque un an. J'ai rencontré votre problème en janvier de cette année alors que je prononçais 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 = '[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 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 pour permettre l'accès SSH? Juste SSH à la nouvelle adresse.

À votre santé! JSR

1
Jaime Satorres Rey

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 autre pare-feu) les paramètres 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 entrer dans une machine distante R. La seule exigence est que vous puissiez fournir un accès public ssh à l'une de vos propres machines locales (appelons-le S). Procédez ensuite comme suit:

  1. Créer une connexion vers l'extérieur ssh de R vers S, rétablir un tunnel inverse dans R:

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

  2. Sur S, utilisez le tunnel inverse pour ssh dans la 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 sur R qui maintiendra continuellement 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
Alex O

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 simple 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 de 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 persistance. 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 /proc/sys/net/ipv4/tcp_* entrées pour le rendre plus acceptable.

Modifier:

  • mosh a besoin de ssh pour l'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 de ssh à votre guise (par exemple strace -f -p pid_of_sshd)
  • il est possible d'utiliser mosh sans ssh, réponse adaptée de 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 $serverip doit ê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 le faire dicter par un utilisateur local par appel téléphonique.

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

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

1
Radovan Garabík