it-swarm.com.de

Wie stelle ich eine Verbindung zu einem Linux-Computer her, der die IP regelmäßig ändert?

Mein Problem besteht darin, einen Weg zu SSH in einen Linux-Server (Ubuntu 18.04) zu finden, dessen IP-Adresse sich täglich ändert.

Ich habe einen Kunden, dem ich gelegentlich bei Verwaltungsaufgaben helfe. Ich muss in den Computer ssh, wenn sie Hilfe benötigen, aber sie haben keine statische IP, so dass sich die öffentliche IP des Servers ständig ändert. Ich habe ein kleines Skript erstellt, um die IP-Adresse des Linux-Computers zu melden, und festgestellt, dass sie sich einmal täglich gegen Mittag ändert.

Ich kann SSH einrichten und es funktioniert sowohl lokal als auch remote ... bis sich die IP-Adresse ändert. In diesem Fall kann ich auch mit der neuen IP-Adresse keine Remoteverbindung mehr herstellen.

  • Muss ich den SSH-Dienst jedes Mal neu starten, wenn sich die IP-Adresse ändert?
  • Wenn ja warum?
  • Muss ich weitere Maßnahmen ergreifen, wenn sich die IP-Adresse ändert, um den SSH-Zugriff zu ermöglichen?

UPDATE

Mein Problem ist, dass ich die neue IP-Adresse NICHT finde. Ich habe bereits ein Skript dafür. Das Problem ist, dass der Server nicht mehr reagiert, sobald sich die IP ändert, obwohl ich versuche, eine Verbindung mit der neuen IP-Adresse herzustellen.

Wenn ich den SSH-Dienst auf dem Zielcomputer neu starte, habe ich erneut Remotezugriff. Aber ich verstehe nicht, warum ich das tun muss. Ich würde gerne die Grundursache kennen, um eine bessere Lösung zu finden.

Die meisten Leute scheinen zu denken, dass SSH funktionieren sollte, solange wir die neue IP kennen. Ist dies also etwas Einzigartiges für den 18.04? Ich habe diesen Server kürzlich für den Client installiert, daher sind alle Konfigurationseinstellungen weiterhin Standard. (Die würden nicht wissen, wie sie es ändern sollen.)

12
Richard

Die anderen Antworten scheinen eines in Ihrer Frage übersehen zu haben:

In diesem Fall kann ich auch mit der neuen IP-Adresse keine Remoteverbindung mehr herstellen

DDNS hilft Ihnen dabei, die neue IP-Adresse herauszufinden, aber das scheint hier nicht das Problem zu sein.

Leider ist der Server, der eine neue IP erhält sollte kein Problem im Standard-Setup, bei dem der ISP einen Router bereitstellt, der Server eine interne Adresse hinter dem Router hat und der Router die Portweiterleitung durchführt . Möglicherweise müssen Sie weitere Informationen zur Netzwerktopologie bereitstellen, um eine gute Antwort zu erhalten.

Was ich mir vorstellen kann ist, dass der Server nicht hinter einem Router steht und seine eigene Verbindung herstellt PPPoE, und a) der SSH-Server bindet an die spezifische Schnittstellenadresse unter der Punkt des Serverneustarts, b) eine Firewall auf dem Computer, die eingehenden SSH nur auf die IP des Servers zulässt, wobei die Firewall nicht aktualisiert wird, wenn sich die IP ändert.

Um den ersten Fall zu überprüfen, führen Sie ein netstat -nta | grep -w 22 | grep LISTEN. Wenn dort 0.0.0.0:22 steht, ist das in Ordnung. Wenn eine bestimmte IP-Adresse aufgeführt ist, überprüfen Sie die sshd-Konfigurationsdatei (/etc/sshd.conf) für ListenAddress.

Um den zweiten Fall zu überprüfen, führen Sie iptables -L -n und prüfen Sie, ob eine der Regeln in der Kette INCOMING mit der IP und dem Port 22 Ihres Servers übereinstimmt.

Wenn eine dieser Adressen die aktuelle Serveradresse hat, müssen Sie sie entweder in 0.0.0.0 ändern (stellen Sie sicher, dass Sie über die Auswirkungen auf die Sicherheit informiert sind) oder die Regel/Konfiguration aktualisieren, wenn sich die IP ändert.

Bearbeiten

Da sich der Server hinter einem Router befindet, gelten die oben genannten Ideen wahrscheinlich nicht (*). In diesem Setup verfügt der Router über eine externe IP-Adresse (die sich täglich ändert), und Ihre internen Geräte sollten über Adressen von 10.x.y.z oder 192.168.x.y verfügen, die sich nicht ändern sollten. Sie stellen eine Verbindung zur externen Adresse her, und der Router sollte eine Portweiterleitungsregel an die interne Adresse senden.

Diese Portweiterleitung sollte nicht unterbrochen werden, wenn sich die externe IP ändert (vorhandene SSH-Verbindungen werden jedoch getrennt), aber vielleicht Es ist eine Regel, die nicht von Ihnen eingerichtet wurde, sondern von etwas UPNP-Magie. Der Router löscht UPNP weiter, wenn er eine neue Adresse erhält, und sshd ruft die Regel nur beim Neustart auf. Haben Sie selbst eine Portweiterleitung im Router eingerichtet?.

Oder es ist die intern IP des Servers, die sich ändert - in diesem Fall ist etwas mit Ihrem DHCP schwer beschädigt. Geben Sie Ihrem Server eine feste interne Adresse.

Oder verwenden Sie IPV6? In einigen Konfigurationen ändert ein Gerät ständig seine IP-Adresse, um die Nachverfolgung zu vereinfachen. Siehe zum Beispiel https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/ - aber darin Fall, schäme dich dafür, dass du es in deinem ursprünglichen Beitrag nicht erwähnt hast. Dies kann bedeuten, dass Ihr Router überhaupt nicht NAT) ausführt und meine ursprünglichen Ideen auch hinter einem Router noch gültig sind.

Dynamisches DNS ist eine Option, eine andere besteht darin, die Server-Mail zu erhalten oder Ihnen auf andere Weise die IP zu senden. Ein einfacher HTTP-Aufruf reicht aus (für einen Endpunkt, den Sie steuern und anfordern).

Es ist auch möglich, das gesamte öffentliche Netzwerk umgekehrt zu lösen. Möglicherweise hat der Server einen Reverse-Tunnel oder eine VPN-Verbindung eingerichtet, die von der IP-Änderung nicht betroffen ist.

In Bezug auf Dienste, die nicht auf die neue Adresse antworten: Dies hängt vollständig von Ihrer Netzwerkeinrichtung ab. Beispiel: WAN IP auf einer internen Schnittstelle über DHCP und ein SSH-Server, der so eingestellt ist, dass er nur die IP auf Ihrer Schnittstelle abhört, die beim Start bekannt ist, würde bedeuten, dass sshd bei Schnittstellenänderungen neu gestartet werden muss.

11
John Keates

Sie sollten sich wirklich mit ddns-Diensten befassen. Soweit es möglich ist, eine Verbindung zu einem bestimmten Computer mit dynamischer IP-Adresse herzustellen; ddns ist die am häufigsten verwendete Lösung.

gehen Sie zu https://noip.com und melden Sie sich für ein Konto an (es ist, ähm ... angeblich..coff..cof .. Kostenlos für 1-3 Computer, die im selben Netzwerk ausgeführt werden ( Wenn ich mich nicht irre, zitiere mich hier nicht: Es ist schon eine Weile her, dass ich einem dieser 'kostenlosen' Dienste vertraut habe ...). Es gibt auch andere Alternativen wie Afraid DNS ( https: //freedns.afraid) .org / Und sogar Ciscos Open DNS: könnte auch verwendet werden (vorausgesetzt, dies ist nicht nur Ihr Kunde, ich würde vorschlagen, dass Sie sich für eine Testversion eines Umbrella-Kontos anmelden, es ausprobieren und später testen Melden Sie sich für das echte Geschäft an >>> Sie haben sogar eine von ihnen herunterladbare GUI-ähnliche Erweiterungen erhalten, die den ddns-Hostnamen automatisch erneuern, wenn sich die IP-Adresse Ihrer Kunden ändert. Ich bin mir bewusst [nur für den Fall, dass Sie einen Ihrer Kunden anrufen und darum bitten müssen, die GUI herunterzuladen ...])

7
dotbiggie

Ich kann SSH einrichten und es funktioniert sowohl lokal als auch remote ... bis sich die IP-Adresse ändert. In diesem Fall kann ich auch mit der neuen IP-Adresse keine Remoteverbindung mehr herstellen.

Manchmal dauert es eine Weile, bis DHCP-Änderungen wirksam werden. Versuchen Sie, den DHCP-Client auf dem Zielcomputer zu recyceln

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

Nein. Sie müssen Ihren SSH-Dienst nur recyceln, wenn sich die Konfiguration ändert (/etc/ssh/sshd_conf).

Muss ich weitere Maßnahmen ergreifen, wenn sich die IP-Adresse ändert, um den SSH-Zugriff zu ermöglichen?

Nein.

Ich habe eine Lösung, die davon ausgeht, dass Sie sendmail auf Ihrem Zielcomputer eingerichtet haben.

Dieses Skript sendet eine E-Mail mit der IP-Adresse, die die Welt für uns hält (Danke ipify.org). E-Mail hat immer die aktuellste IP-Adresse.

  1. Erstellen Sie ein dhcp-notify-Bash-Skript (ohne die Erweiterung .sh).
  2. Setzen Sie das Skript in /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
    

Wenn dies nicht funktioniert, können Sie jederzeit einen Cron einrichten, der Ihnen die aktuelle IP-Adresse sendet (verlieren Sie die case-Anweisung).

#!/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

Über den Tellerrand hinaus denken - könnten Sie eine feste IPv6-Adresse festlegen? Aufgrund ihrer Knappheit müssen normalerweise nur IPv4-Adressen geändert werden.

3
MSalters

Was ich seit fast einem Jahr mache. Ich bin im Januar dieses Jahres auf Ihr Problem gestoßen, als ich an meiner örtlichen Universität eine Rede hielt.

Dieses Skript läuft seitdem auf meinem Computer: // Ziemlich selbsterklärend //

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 sollte einwandfrei funktionieren Vielleicht nicht die beste Lösung, aber es funktioniert.

Sie erhalten jedes Mal eine E-Mail in Ihrem Posteingang, wenn sich die öffentliche IP-Adresse des Computers ändert.

Nun zu Ihren Fragen:

Muss ich den Dienst jedes Mal neu starten, wenn sich die IP-Adresse ändert? Wenn Sie mit dem Neustart des Dienstes die SSH-Verbindung wiederherstellen möchten, ja.

Wenn ja, warum? Denn wenn die Adresse, mit der Sie kommunizieren möchten, nicht mehr den gewünschten Dienst bietet. Es ist nicht mehr deine Maschine.

Muss ich noch etwas unternehmen, wenn sich die IP-Adresse ändert, um den SSH-Zugriff zu ermöglichen? Nur SSH an die neue Adresse.

Prost! JSR

1

Es lohnt sich, dies von einer anderen Seite aus zu betrachten: Normalerweise ist es viel einfacher, eine Verbindung nach außen herzustellen von dem Computer aus, der Ihre Aufmerksamkeit erfordert (DNS, NAT und andere Firewall) Einstellungen spielen überhaupt keine Rolle oder sind viel einfacher).

Sie können dies verwenden, um eine kugelsichere und einfache Lösung für den Zugriff auf eine Remote-Maschine R zu erstellen. Die einzige Voraussetzung ist, dass Sie öffentlichen ssh Zugriff auf einen Ihrer eigenen lokalen Computer gewähren können (nennen wir es S). Gehen Sie dann wie folgt vor:

  1. Erstellen Sie eine ssh Verbindung nach außen von R zu S, Erstellen eines umgekehrten Tunnels zurück in R:

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

  2. Verwenden Sie auf S den umgekehrten Tunnel, um ssh in den Remote-Computer R:

    ssh -p 22000 127.0.0.1

Schritt 1 kann manuell und bei Bedarf von der Remote-Seite ausgelöst werden, wenn Ihre Unterstützung benötigt wird. Alternativ können Sie einen Dienst für R erstellen, der einen solchen umgekehrten Tunnel zu S kontinuierlich aufrechterhält.

Ich habe ein solches Setup verwendet, um mich bei entfernten (mobilen) Systemen anzumelden, die sich hinter Firewalls/NAT befanden und überhaupt keine DNS-Einträge hatten.

1
Alex O

Wenn Sie nur eine Remote-Anmeldung benötigen, verwenden Sie mosh . Abgesehen davon, dass es in der Lage ist, IP-Änderungen hervorragend zu bewältigen (fast ohne Latenz während des Wechsels), hat es auch andere Vorteile gegenüber einfachem ssh, wie lokales Vorhersageecho, geringe Latenz und eine viel schnellere Wiederherstellung nach unterbrochenen Verbindungen.

Wenn Sie speziell ssh benötigen (z. B. X11-Weiterleitung oder ähnliches), empfehle ich, VPN (z. B. OpenVPN), vorzugsweise über UDP, mit einem kurzen Keepalive einzurichten. TCP Verbindungen (dh Ihr SSH) über VPN werden nach einer IP-Änderung wiederhergestellt und bleiben verbunden. Es dauert nur länger (bis zu einer Minute oder so), aber Sie können mit /proc/sys/net/ipv4/tcp_* Einträge, um es akzeptabler zu machen.

Bearbeiten:

  • mosh benötigt ssh für die Authentifizierung, aber nach der Authentifizierung bleibt die Verbindung bestehen, bis Sie sich abmelden (oder neu starten), und Sie können den Fehler von ssh nach Belieben untersuchen (z. B. strace -f -p) pid_of_sshd)
  • es ist möglich, mosh ohne ssh zu verwenden, Antwort angepasst von hier :

Auf dem Server ausführen:

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

sie erhalten ein Ergebnis wie QzdRHbAWzL7eRobi75DCrz

Auf dem Client ausführen:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

Beachten Sie, dass $serverip Eine IP-Adresse ohne Hostnamenauflösung sein muss.

Wie Sie den Schlüssel von einer Seite zur anderen bekommen, liegt bei Ihnen. Ich würde vorschlagen, mit einem vorinstallierten Schlüssel zu verschlüsseln und Instant Messaging, Mailing oder einen lokalen Benutzer per Telefonanruf diktieren zu lassen.

  • wenn es wirklich ein Problem mit ssh gibt, installieren Sie inetd und führen Sie ssh von dort aus aus, nicht als eigenständiger Daemon, z. In dieser Konfigurationszeile für "classic" inetd.conf wird bei jeder Anmeldung ein neuer Daemon ausgeführt (beachten Sie, dass nicht alle inetd-Gabeln IPv6 verarbeiten):

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

1