Come connettersi a una macchina Linux che cambia regolarmente IP?


12

Il mio problema è trovare un modo per SSH in un server Linux (Ubuntu 18.04) il cui indirizzo IP cambia quotidianamente.

Ho un cliente che occasionalmente aiuto nelle attività di amministrazione. Ho bisogno di entrare nella macchina quando hanno bisogno di aiuto, ma non hanno un IP statico, quindi l'IP pubblico del server è in continua evoluzione. Ho creato un piccolo script per segnalare l'indirizzo IP della macchina Linux e scoprire che cambia una volta al giorno verso mezzogiorno.

Sono in grado di configurare SSH e funziona sia localmente che da remoto ... fino a quando l'indirizzo IP cambia. Una volta che ciò accade, non sono più in grado di connettermi in remoto anche usando il nuovo indirizzo IP.

  • Devo riavviare il servizio SSH ogni volta che l'indirizzo IP cambia?
  • Se è così, perché?
  • Ci sono altre azioni che devo intraprendere quando l'indirizzo IP cambia per consentire l'accesso a SSH?

AGGIORNARE

Per essere chiari, il mio problema NON è trovare il nuovo indirizzo IP. Ho già una sceneggiatura per farlo. Il problema è che il server smette di rispondere una volta che l'IP cambia, anche se provo a connettermi usando il nuovo indirizzo IP.

Se riavvio il servizio SSH sul computer di destinazione, ho di nuovo accesso remoto. Ma non capisco perché dovrei farlo. Mi piacerebbe conoscere la causa principale nella speranza di trovare una soluzione migliore.

Molte persone sembrano pensare che SSH dovrebbe funzionare fintanto che conosciamo il nuovo IP, quindi questo è qualcosa di unico rispetto a 18.04? Ho installato questo server per il client di recente, quindi tutte le impostazioni di configurazione sono ancora predefinite. (Non saprebbero come cambiarlo.)



12
Urla al loro ISP. La modifica dell'indirizzo IP una volta al giorno è assurda per una connessione aziendale ed è persino relativamente inaudita per una connessione residenziale.
Michael Hampton

2
Dici che l'accesso ssh smette di funzionare quando l'indirizzo IP cambia. Ma non hai detto quando ricomincerà a funzionare. Presumo che debba in qualche modo ricominciare a funzionare, altrimenti non potresti vederlo smettere di funzionare ogni giorno. E non c'è niente che dovresti fare quando l'indirizzo IP cambia. Il server ssh sarà immediatamente raggiungibile sul nuovo indirizzo IP.
Kasperd,

1
Potrebbero esserci delle stranezze in corso come DDNS in esecuzione e qualcosa di simile ListenAddress <dynamic host name>nel file di configurazione sshd, forse perché qualcuno non voleva che gli utenti interni fossero in grado di accedere al server. Ciò richiederebbe effettivamente il riavvio del server SSH ogni volta che l'IP cambia.
Guntram Blohm sostiene Monica il

1
@MichaelHampton: urlare probabilmente non aiuterà, pagherà. Con l'attuale scarsità di indirizzi IPv4, la maggior parte dei provider addebitano costi aggiuntivi per un indirizzo IPv4 statico (alcuni addirittura addebitano costi aggiuntivi per un indirizzo IP pubblico non statico, altrimenti si ottiene Dual Stack Lite ). Naturalmente, se OP è su IPv6, le cose cambiano ...
sleske,

Risposte:


21

Le altre risposte sembrano aver trascurato una cosa nella tua domanda:

Una volta che ciò accade, non sono più in grado di connettermi in remoto anche usando il nuovo indirizzo IP

DDNS ti aiuterà a scoprire il nuovo indirizzo IP, ma questo non sembra essere il problema qui.

Sfortunatamente, il server che ottiene un nuovo IP non dovrebbe essere un problema nella configurazione standard in cui l'ISP fornisce un router, il server ha un indirizzo interno dietro il router e il router esegue il port forwarding. Potrebbe essere necessario fornire ulteriori informazioni sulla topologia di rete per ottenere una buona risposta.

Quello che potrei immaginare è che il server non si trova dietro un router e non fa la propria connessione PPPoE, e a) il server SSH che si lega all'indirizzo di interfaccia specifico al momento del riavvio del server, b) un firewall sulla macchina che consente a SSH in arrivo di solo l'IP del server con il firewall che non si aggiorna quando l'IP cambia.

Per verificare il primo caso, eseguire un netstat -nta | grep -w 22 | grep LISTEN. Se dice 0.0.0.0:22, va bene; se elenca un IP specifico, quindi controllare il file di configurazione sshd ( /etc/sshd.conf) per ListenAddress.

Per verificare il secondo caso, eseguire iptables -L -ne verificare se una delle regole nella INCOMINGcatena corrisponde all'IP del server e alla porta 22.

Se uno di questi ha l'indirizzo del server corrente, dovrai cambiarlo in 0.0.0.0 (assicurati di conoscere le implicazioni di sicurezza) o aggiornare la regola / configurazione ogni volta che cambia l'IP.

modificare

Poiché il server si trova dietro un router, le idee precedenti probabilmente non si applicano (*). In questa configurazione, il router ha un IP esterno (che cambia quotidianamente) e i tuoi dispositivi interni dovrebbero avere degli indirizzi 10.xyz o 192.168.xy che non dovrebbero cambiare. Ti connetti all'indirizzo esterno e il router dovrebbe avere una regola di port forwarding all'indirizzo interno.

Questo port forwarding non dovrebbe interrompersi quando cambia l'IP esterno (le connessioni ssh esistenti verranno comunque interrotte), ma forse è una regola che non è stata impostata da te, ma da un po 'di magia UPNP, con il router che rilascia UPNP in avanti quando viene un nuovo indirizzo e sshd invocando la regola solo al riavvio. Hai impostato tu stesso un port forwarder all'interno del router.

Oppure, è l' IP interno del server che cambia - in tal caso, qualcosa è gravemente rotto con il tuo DHCP. Dai al tuo server un indirizzo interno fisso.

Oppure stai usando IPV6? Esistono alcune configurazioni in cui un dispositivo cambia continuamente il suo IP per renderlo meno facile da tracciare. Vedi, ad esempio, https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/ - ma in tal caso, vergogna per te per non menzionandolo nel tuo post originale. Ciò potrebbe significare che il tuo router non esegue affatto NAT e che le mie idee originali sono ancora valide anche dietro un router.


2
+1 per essere la prima risposta a rispondere effettivamente a ciò che è stato posto nella domanda.
Kasperd,

@Guntram Blohm Grazie per la risposta! Il server è dietro un router. Queste due possibilità sarebbero ancora vere in quello scenario? In tal caso, li controllerò entrambi nel giorno successivo, quando potrò accedere localmente alla macchina target.
Richard,

11

Il DNS dinamico è un'opzione, un'altra è avere la posta del server o altrimenti inviarti il ​​suo IP. Farebbe una semplice chiamata HTTP (a un endpoint su cui controlli e accederai alle richieste).

È anche possibile risolvere l'intera rete pubblica al contrario; potresti avere il server impostato un tunnel inverso o una connessione VPN, che non sarà influenzata dalla modifica dell'IP.

Per quanto riguarda i servizi che non rispondono al nuovo indirizzo: questo dipende completamente dalla configurazione della rete. Ad esempio: l'IP WAN su un'interfaccia interna tramite DHCP e un server SSH impostato per l'ascolto dell'IP sull'interfaccia nota all'avvio significherebbe che sshd deve essere riavviato quando si cambia l'interfaccia.


1
Come descritto nella domanda, esiste già una soluzione per trovare il nuovo indirizzo IP. Pertanto, l'aggiunta di DNS dinamico non risolverebbe davvero alcun problema. Il problema descritto è che il server ssh smette di rispondere quando l'indirizzo IP cambia. Non hai affrontato questo problema. Si prevede che OTOH smetterà di funzionare con connessioni VPN e tunnel inversi quando l'IP cambia, quindi hai bisogno di qualcosa sul posto per riavviarli automaticamente.
Kasperd,

7

Dovresti davvero esaminare i servizi DNS. Per quanto riguarda la possibilità di connettersi in remoto a una determinata macchina con indirizzo IP dinamico; ddns è la soluzione più comunemente usata.

vai su https://noip.com e registrati per un account (è, errr ... presumibilmente..coff..cof .. Gratuito per 1-3 macchine in esecuzione sulla stessa rete (se non sbaglio, non citare io qui: è da un po 'che non mi fido di nessuno di questi servizi "gratuiti" ...) Ci sono anche altre alternative come Afraid DNS ( https://freedns.afraid.org/ E persino, Cisco, Open DNS: potrebbe anche essere utilizzato (a condizione che questo non sia solo un cliente, ti suggerirei di iscriverti per una prova dell'account ombrello, fare un giro e poi iscriverti per davvero affare >>> hanno anche ottenuto una di quelle estensioni scaricabili simili a una GUI che rinnoveranno automaticamente il nome host ddns ogni volta che cambia l'ip dei tuoi clienti. È davvero il modo più semplice e non esperto di tecnologia di cui sono a conoscenza [solo in nel caso in cui devi chiamare uno dei tuoi clienti e chiedermi di scaricare la GUI piuttosto ....])


3
Sebbene ciò sia certamente utile per accedere a un host quando si cambiano gli indirizzi IP, non è questo il problema. La domanda è: perché il server SSH smette di rispondere quando l'indirizzo IP cambia e come risolverlo. Un servizio DNS dinamico non risolve questo problema.
Kasperd,

4

Sono in grado di configurare SSH e funziona sia localmente che da remoto ... fino a quando l'indirizzo IP cambia. Una volta che ciò accade, non sono più in grado di connettermi in remoto anche usando il nuovo indirizzo IP.

A volte, è necessario del tempo prima che le modifiche DHCP abbiano effetto. Prova a riciclare il client DHCP sul computer di destinazione

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

No. Devi solo riciclare il tuo servizio ssh quando cambia la configurazione ( /etc/ssh/sshd_conf).

Ci sono altre azioni che devo intraprendere quando l'indirizzo IP cambia per consentire l'accesso a SSH?

No.

Ho una soluzione che presuppone che hai configurato sendmail sul tuo computer di destinazione.

Questo script invia un'e-mail che mostra l'indirizzo IP che il mondo pensa che abbiamo (Grazie ipify.org). L'email avrà sempre l'indirizzo IP più attuale.

  1. Crea script bash dhcp-notification (senza estensione .sh)
  2. Inserisci la sceneggiatura /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
    

Se questo non funziona, puoi sempre impostare un cron per inviarti l'indirizzo IP corrente (perdere l'istruzione 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

Stavo per suggerire questo, è una grande idea e la prima cosa che mi è venuta in mente quando ho letto la domanda. Inoltre, se riscontri problemi con api.ipify.org (per qualche motivo è bloccato sulla mia rete scolastica), puoi utilizzare questo altro sito che avevo creato alcuni mesi prima, che fa la stessa cosa: findip.win
annulla

@karlchilders Grazie per la risposta! Ho già uno script cron che mi riporta l'indirizzo IP, ma non avevo idea degli hook di dhclient. Questo è impressionante! Preferirei che l'IP venisse segnalato solo quando cambia effettivamente. Domanda: se questo script è in grado di funzionare e riportare l'indirizzo IP, perché il riciclaggio di dhclient avrebbe un effetto sull'accesso SSH?
Richard,

@karlchilders O questo script funziona solo quando ricicli manualmente dhclient?
Richard,

dhclient -r; dhclient rinnoverà il contratto di locazione dhcp in modo che l'host sia aggiornato. Gli hook funzioneranno ogni volta che si verifica un evento dhcp manualmente o in altro modo.
karlchilders,

@Richard Contrassegna una delle risposte come risposta preferita. Grazie.
karlchilders,

3

Pensare fuori dagli schemi - potresti organizzare un indirizzo IPv6 fisso? Di solito sono solo gli indirizzi IPv4 che devono cambiare, a causa della loro scarsità.


L'indirizzo IP che tengo giù è in realtà IPv6 ogni volta.
Richard,

1
@Richard: mi dispiace sapere che non funziona per te. Lascerò la risposta per altre persone che hanno questo problema con IPv4.
Salterio,

@Richard Dovresti davvero menzionare nella tua domanda che hai a che fare con IPv6. Questo rende il problema abbastanza diverso.
Dubu,

1
@Dubu In effetti rende il problema diverso. Questo tipo di problema non dovrebbe accadere su IPv6, il che potrebbe essere il motivo per cui tutti presumevano che fosse IPv4. Ma in effetti potresti ottenere alcuni dei sintomi descritti se usi erroneamente un indirizzo di privacy piuttosto che un indirizzo statico. Se, ad esempio, chiedi a un sito Web quale sia il tuo indirizzo IP, mostrerà il tuo indirizzo di privacy piuttosto che il tuo indirizzo statico. E usarlo per le connessioni ssh non è una buona idea. Non spiega ancora perché non funziona fino a quando il server SSH non è stato riavviato.
Kasperd,

1
@Dubu: questo è un approccio piuttosto non standard. DHCPv6-PD (Delega prefisso) in combinazione con ID univoco DHCP (DUID) dovrebbe impedirlo.
Salterio

1

Quello che faccio da quasi un anno. Mi sono imbattuto nel tuo problema a gennaio di quest'anno mentre tenevo un discorso nella mia università locale.

Questo script è in esecuzione sulla mia macchina da allora: // Abbastanza autoesplicativo //

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 dovrebbe funzionare alla perfezione Forse non è la soluzione migliore in circolazione, ma funziona.

Riceverai un'email nella Posta in arrivo ogni volta che l'IP pubblico della macchina cambia.

Ora, per quanto riguarda le tue domande:

Devo riavviare il servizio ogni volta che l'indirizzo IP cambia? Se riavviando il servizio si intende ristabilire la connessione ssh, sì.

Se è così, perché? Perché se l'indirizzo con cui stai tentando di comunicare non fornisce più il servizio che stai cercando. Non è più la tua macchina.

Ci sono altre azioni che devo intraprendere quando l'indirizzo IP cambia per consentire l'accesso a SSH? Basta SSH al nuovo indirizzo.

Saluti! JSR


Grazie per la risposta @JSR! In realtà ho scritto uno script simile per segnalarmi l'indirizzo IP. Ma una volta che cambia, anche conoscendo il nuovo indirizzo IP, non riesco a SSH nella macchina remota. Hai riscontrato questo problema?
Richard,

Sei sicuro di recuperare l'indirizzo giusto? in tal caso, prova a eseguire il ping su di esso una volta ottenuto l'IP. Non ho mai visto questo problema prima Inoltre, nel caso in cui non lo sapessi, puoi eseguire lo script in background con "python3 scriptname.py &" Inoltre, controlla le porte di inoltro del router, presumo che l'IP locale non lo faccia cambiano, ma vale comunque la pena dare un'occhiata.
Jaime Satorres Rey,

Sì, l'IP è corretto. Se riavvio il servizio SSH sul computer di destinazione, sono in grado di riconnettermi. Ma non capisco perché dovrebbe essere così.
Richard,

@Richard il problema qui è che, poiché il tuo IP cambia, il tuo host interrompe ogni connessione poiché la chiave RSA che stai utilizzando per autenticare non corrisponde a quella richiesta. Non sono affatto un esperto di questo argomento, quindi non prendere le mie parole come un fatto ... Ma la tua situazione è così PROBABILMENTE a causa di quello che ho appena detto.
Jaime Satorres Rey,

1

Vale la pena vederlo da un lato diverso: di solito, è molto più semplice creare una connessione esterna dalla macchina che richiede la tua attenzione (DNS, NAT e altre impostazioni del firewall non contano affatto o sono molto più semplici).

È possibile utilizzare questo per stabilire una soluzione semplice e a prova di proiettile per accedere a una macchina remota R. L'unico requisito è che puoi fornire l' sshaccesso pubblico a uno dei tuoi computer locali (chiamiamolo S). Quindi procedere come segue:

  1. Crea una sshconnessione esterna da Ra S, stabilendo un tunnel inverso inR :

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

  2. Acceso S, utilizzare il tunnel inverso per accedere alla sshmacchina remota R:

    ssh -p 22000 127.0.0.1

Il passaggio 1 può essere attivato manualmente e su richiesta dal lato remoto ogni volta che è necessaria l'assistenza. In alternativa, è possibile creare un servizio Rche mantenga continuamente tale tunnel inverso S.

Ho usato una tale configurazione per accedere a sistemi remoti (mobili) che erano dietro firewall / NAT e che non avevano alcuna voce DNS.


1

Se hai solo bisogno di un accesso remoto, usa mosh . Oltre a essere in grado di far fronte in modo eccellente alle modifiche dell'IP (con quasi nessuna latenza durante lo switch) ha anche altri vantaggi rispetto al semplice ssh, come l'eco predittivo locale, la bassa latenza, il recupero molto più veloce da collegamenti interrotti.

Se hai specificamente bisogno ssh(diciamo, hai bisogno dell'inoltro X11 o qualcosa del genere), ti suggerisco di configurare VPN (ad esempio OpenVPN), preferibilmente su UDP, con un breve keepalive. Le connessioni TCP (cioè il tuo SSH) su VPN guariranno e rimarranno connesse dopo la modifica dell'IP, ci vorrà solo più tempo (fino a un minuto circa), ma puoi giocare con le /proc/sys/net/ipv4/tcp_*voci per renderlo più accettabile.

Modificare:

  • mosh necessita sshdell'autenticazione, ma una volta autenticato, la connessione rimane fino a quando non ti disconnetti (o riavvia), e puoi indagare sul fallimento di sshtuo piacimento (es. strace -f -p pid_of_sshd )
  • è possibile utilizzare moshsenza ssh, risposta adattata da qui :

Sul server eseguire:

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

ottieni un risultato simile QzdRHbAWzL7eRobi75DCrz

In esecuzione client:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

Nota che $serveripdeve essere un IP, nessuna risoluzione del nome host.

Il modo in cui ottieni la chiave da un lato all'altro dipende da te. Suggerirei la crittografia con una chiave precondivisa e la messaggistica istantanea, l'invio tramite posta o il fatto che un utente locale lo imponga tramite una telefonata.

  • se c'è davvero un problema con ssh, installa inetded esegui ssh da lì, non come un demone autonomo, ad esempio da questa riga di configurazione per "classic" inetd.conf, questo eseguirà un nuovo demone ogni volta che accedi (nota che non tutti forcelle inetd gestiscono ipv6):

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


1
Grazie per la risposta @Radovan! Mosh sembra interessante, ma sembra che usi SSH per autenticarsi. Quindi la radice del mio problema esisterebbe ancora, giusto? Fammi sapere se ho frainteso i documenti.
Richard,

@Richard Sì, tuttavia ci sono possibilità ... Ho modificato la mia risposta.
Radovan Garabík,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.