Il modo più semplice per verificare la modifica dinamica dell'IP


12

Quale sarebbe il modo più semplice per trovare, con uno script, se il mio indirizzo IP è cambiato?


Informazioni sullo sfondo:

Ho una connessione modem via cavo standard domestica e il mio ISP mi assegna un IP dinamico. Ogni tanto cambia, i tempi di noleggio DHCP sembrano irregolari.

Fondamentalmente, sto facendo la mia cosa DNS dinamica e posso aggiornare i record DNS che punta al mio server di casa con un clic. L'unica cosa rimasta è rilevare una modifica dell'IP in modo da poter automatizzare completamente il processo.

Ora ci sono diversi siti Web qui che possono restituire il tuo indirizzo IP, e potrei usare un lavoro cron su wgetuna di queste pagine e grepl'indirizzo IP da esso ... Ma sembra eccessivo in termini di utilizzo della CPU / larghezza di banda, e non è molto BACIO.

Mi sto perdendo un modo semplice ed elegante per recuperare il mio IP pubblico e verificare se è cambiato?

Informazioni extra: il mio modem / router è un mattone economico, non fa nulla di molto interessante al riguardo. Il mio server funziona con Centos 6.

Risposte:


6

Supponendo che tu sia dietro NAT, il modo più elegante che mi viene in mente è quello di eseguire un lavoro cron sul router stesso, controllando periodicamente ifconfiganche il suo indirizzo WAN corrente. Ciò può anche essere possibile su un "mattone economico" se si è in grado di installare un firmware personalizzato. Comunque elegante, appena semplice.

Come discusso qui , su Windows, ma l'argomento è ugualmente valido per Centos, nel polling dell'IP WAN da dietro NAT, si verifica il problema di non avere tecnicamente un indirizzo esterno. Invece, si viene instradati attraverso uno a discrezione del router. Ovviamente, avresti comunque accesso a queste informazioni fintanto che il router è sotto il tuo controllo, ma non esiste un modo universale di comunicare questo indirizzo IP agli host sulla rete locale. Di conseguenza, il tuo server non può semplicemente chiedere al router l'IP esterno che utilizzerà.

L'alternativa più efficiente sarebbe quella di lasciare che il router faccia la sua magia e effettivamente effettuare la connessione a un server esterno, quindi chiedendogli di restituire l'indirizzo da cui proviene la richiesta. Molti server web sono stati creati appositamente per questo scopo. Per lo scripting, posso raccomandare http://icanhazip.com/ , poiché non richiede ulteriori analisi da parte dell'utente (solo l'IP viene restituito in testo normale).

Se necessario, le risposte alla domanda precedentemente collegata dovrebbero fornire molti suggerimenti sull'attuazione.


Buone idee e collegamenti. +1, se non altro per il sito Web icanhazip che non conoscevo, e rende superfluo il download di HTML aggiuntivo e l'analisi.
Silver Quettier

1
Oppure checkip.net-me.net/plain
Alex


6

È possibile eseguire una query su qualsiasi sito Web che visualizza il proprio IP per questa attività. Utilizzando checkip.dyndns.com , dal momento che è text.only.

Esempio:

wget -q -O - checkip.dyndns.com | grep -Po "[\d\.]+"

0

Ho avuto questa stessa domanda oggi e non ero soddisfatto delle risposte che ho visto qui o su Google, quindi ho scritto uno script PowerShell per inviarmi una notifica Slack ogni volta che il mio indirizzo IP cambia .

Se preferisci ricevere un'e-mail, puoi fare clic sui collegamenti nello script per visualizzare una versione diversa che supporti le e-mail di Outlook.

Spero che questo aiuti qualcuno e guadagni un voto. :-)

Salvare il testo seguente in un file .ps1. Modificalo come appropriato con il tuo URL webhook Slack. Salva. Fare clic con il tasto destro del mouse su "Esegui con PowerShell".

Oppure puoi programmarlo per l'esecuzione giornaliera o comunque spesso.

#Script to compare current IP with old IP and sends Slack notification if different (and do nothing if there was no change).
#We can put this as a scheduled task to run daily.
#ScriptName: IP_change_detection_notification.ps1

$slackWebhookUrl = "XXXXXXXXXX" #put yours here
$ipDetectionUrl = "https://wtfismyip.com/text"
$IPAddFile = "C:\code\IP_change_detection_notification.dat" #absolute path to file that stores the old IP record
$slackOutputFile = "C:\code\IP_change_detection_notification_Slack.txt"
$optionalDebuggingFile = "C:\code\IP_change_detection_notification_debugging.txt"

$Request = Invoke-WebRequest $ipDetectionUrl
$IP_new = ($Request.Content.Trim())
Write-Host "Current IP address: [$IP_new]"

#Check if old IP record exists
If(Test-Path "$IPAddFile")
{
#Get old IP
$IP_old = Get-Content "$IPAddFile"
    #Compare IPs
    if(-not($IP_new -eq $IP_old))
    {
        Write-Host "Old IP address: [$IP_old]"
        $msg = "Your WAN IP has changed to $IP_new (was $IP_old)!"
        Write-Host "$msg"               
        $body = $("{""text"":""$msg""}")
        Write-Host "$body"
        Invoke-RestMethod -Uri $slackWebhookUrl -Method Post -ContentType 'application/json' -Body $body -OutFile $slackOutputFile

        "Notification Sent"     

        #Overwrite and update new IP
        $IP_new |  Out-File $IPAddFile

    }
    else
    {"No change, no notification"}

}
else
{
#Create new, as file not found
$IP_new |  Out-File $IPAddFile
"File created"
}
$(get-date -f yyyy-MM-dd_HH_mm_ss)  |  Out-File $optionalDebuggingFile
#Read-Host -Prompt "Press Enter to exit" #Comment out this line if this script will be run by a cron job. Otherwise, uncomment it so that you can see the results of the script in the console.

#This script was adapted from https://gallery.technet.microsoft.com/scriptcenter/Detect-IP-address-change-aeb51118 by Satyajit

Per far funzionare l'Utilità di pianificazione:

Ho dovuto eseguire PowerShell come amministratore e quindi eseguire Get-ExecutionPolicy, che poi mi ha detto che il mio attuale ExecutionPolicy era "Limitato".

Poi ho corso Set-ExecutionPolicy RemoteSigned(come mostrato qui, ma mi rende nervoso: https://stackoverflow.com/a/26955050/470749 ).

Quindi da un prompt dei comandi di Windows di base, ho provato a eseguire il comando seguente un paio di volte: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(una volta per memorizzare l'IP e una seconda volta per verificare se era cambiato).

(Fino a quando non riuscirai a farlo funzionare, non preoccuparti di provare a utilizzare l'Utilità di pianificazione.)

Quindi ho programmato un'attività con C:\Windows\System32\WindowsPowerShell\v1.0\powershell.execome programma e -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1come Argomenti.


È un'ottima soluzione, ma sfortunatamente l'OP ha notato che sta usando CentOS, quindi tecnicamente questo non risponde alla domanda.
MaQleod,

0

Le risposte precedenti escludendo l'implementazione di PS, in realtà non ti dicono se l'IP è cambiato. (Voglio amare PowerShell. Ryan ha fatto un buon lavoro nell'identificare il motivo per cui non lo faccio: le autorizzazioni di sicurezza dell'esecuzione sono un fastidio).

L'analisi dell'IP non è necessaria a condizione che qualsiasi output aggiuntivo non cambi quando allora l'IP non è cambiato. Ad esempio checkip.dyndns.com restituisce qualcosa come l'attuale indirizzo IP: ddd.ddd.ddd.ddd. Quindi è sufficiente confrontare semplicemente l'intero output.

Inoltre, se stai usando l'arricciatura, potresti voler nascondere i progressi usando il flag -s. Poiché è scritto su stderr, non inquina lo stdout.

Quindi, ecco un semplice script .cmd, che usa l'arricciatura per salvare l'output. Quindi utilizza FC per confrontarlo con l'output precedente, se presente. Non ho bisogno di impostare le opzioni FC per Unicode, maiuscole e minuscole, poiché l'output dovrebbe essere una corrispondenza binaria, quando l'IP non è cambiato. Unix ha cmp invece di FC.

@REM 12/30/2017 The following work:
@REM                checkip.dyndns.com
@REM                wtfismyip.com/text
@REM                icanhazip.com
@REM                ifconfig.me/ip -- can be slow

curl icanhazip.com > CurrentIp.txt
fc /B LastIp.txt CurrentIp.txt 1> nul: 2>>&1

if ERRORLEVEL 1 (
    ECHO Ip Changed
    REM Remember for next time
    MOVE /Y CurrentIp.txt LastIp.txt 1>nul:
    exit /b 1
) else (
    ECHO Ip not Changed
)

Ovviamente CurrentIp.txt LastIp.txt può essere modificato per adattarlo, ad es. Prefisso con "% TMP% \" Questo script dovrebbe funzionare da Utilità di pianificazione, con modifiche minori.


0

In risposta a OP: "Mi sto perdendo un modo semplice ed elegante per recuperare il mio IP pubblico e verificare se è cambiato?"

Una risposta davvero semplice è non farlo. Aggiorna periodicamente il tuo IP.

Sembra dispendioso, ma le soluzioni "più intelligenti" sono solo più complesse e meno affidabili, senza risparmiare CPU, larghezza di banda, ecc. L'invio di 1500 byte o meno (un pacchetto) una volta all'ora è molto economico. Un anno intero consumerà 365 * 24 * 1.500 = 13 Meg Byte o circa 3 minuti del Rifleman su Netflix.

Il costo della CPU / larghezza di banda per ottenere il tuo IP esterno e pubblicare di tanto in tanto il tuo nuovo IP, è probabilmente molto più alto rispetto alla semplice pubblicazione periodica del tuo IP. Pubblico il mio IP su duckdns ogni ora per anni, senza problemi. Ovviamente se inizi a fare questo 1 / secondo il tuo servizio di dominio potrebbe capirlo e infastidirti. Allo stesso modo qualsiasi servizio che usi per cercare il tuo IP non sarà contento se lo fai.

Un ultimo pensiero, la domanda che fai è una parte del problema che menzioni. Il trigger per l'aggiornamento del DNS dinamico potrebbe essere quando il nome del tuo dominio non viene risolto sul tuo server. È possibile utilizzare il ping, ma se il vecchio indirizzo IP viene riutilizzato, il nuovo titolare del leasing ip potrebbe rispondere al ping.

Con questo in mente, potresti periodicamente tentare di scaricare un piccolo file di firma / magia dal tuo server. In realtà questo potrebbe essere qualsiasi file statico che ti dice che hai trovato il tuo server, anche la tua pagina web funzionerebbe, ma un nome insolito sarebbe molto meglio di default.html.

Se il d / l fallisce, aggiorna il tuo IP, svuota la cache DNS e riprova. L'aggiornamento potrebbe richiedere alcuni minuti, a seconda del servizio DNS. Questo approccio rimuove la dipendenza da qualche altro sito ip esterno e verifica effettivamente ciò che vuoi veramente sapere: altri possono raggiungere il mio sito?


0

Come opzione alternativa che potrebbe esserti d'aiuto, ho scritto uno script Python progettato per monitorare le modifiche dell'indirizzo IP esterno. Lo uso sotto Linux ma dato che è Python dovrebbe funzionare bene su Windows dopo aver configurato l'ambiente Python appropriato. Attualmente salva l'indirizzo IP esterno "corrente" in un file e, quando eseguito, acquisisce un nuovo indirizzo IP e quindi lo confronta con quello precedente. È designato inviarti un'e-mail se viene rilevata una modifica.

È progettato per essere eseguito come cronjob (Linux) o attività pianificata (Windows) e non può essere eseguito da solo come daemon in background.

Ecco il link al repository github: https://github.com/begleysm/ipwatch

Speriamo che aiuti!


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.