Einfachste Möglichkeit, nach dynamischen IP-Änderungen zu suchen

12

Was ist mit einem Skript am einfachsten zu finden, wenn sich meine IP-Adresse geändert hat?


Hintergrundinformation:

Ich habe eine Standardverbindung für ein Heimkabelmodem und mein ISP weist mir eine dynamische IP zu. Es ändert sich von Zeit zu Zeit, die DHCP-Lease-Zeiten scheinen unregelmäßig.

Grundsätzlich mache ich meine eigene dynamische DNS-Sache und kann die DNS-Einträge, die auf meinen Heimserver verweisen, mit einem Klick aktualisieren. Das einzige, was noch übrig bleibt, ist, eine IP-Änderung zu erkennen, damit ich den Prozess vollständig automatisieren kann.

Jetzt gibt es hier mehrere Websites, die Ihre IP-Adresse zurückgeben können, und ich könnte einen Cron-Job für wgeteine dieser Seiten und grepdie IP-Adresse von dort verwenden ... Aber es scheint in Bezug auf die CPU- / Bandbreitennutzung übertrieben zu sein, und es ist nicht sehr KUSS.

Fehlt mir eine einfache und elegante Möglichkeit, meine öffentliche IP-Adresse abzurufen und zu überprüfen, ob sie sich geändert hat?

Extra Info: Mein Modem / Router ist ein billiger Baustein, es macht in dieser Hinsicht nichts sehr Interessantes. Mein Server läuft mit Centos 6.

Silber Quettier
quelle

Antworten:

5

Angenommen, Sie stehen hinter NAT. Die eleganteste Art, die ich mir vorstellen kann, besteht darin, einen Cron-Job auf dem Router selbst auszuführen und regelmäßig ifconfigdie aktuelle WAN-Adresse zu überprüfen. Dies kann sogar auf einem "billigen Baustein" möglich sein, wenn Sie in der Lage sind, benutzerdefinierte Firmware zu installieren. Egal wie elegant, kaum einfach.

Wie hier erläutert , gilt unter Windows, aber das Argument gilt auch für Centos. Beim Abrufen der WAN-IP hinter NAT tritt das Problem auf, dass Sie technisch gesehen keine externe Adresse haben. Stattdessen werden Sie nach Ermessen des Routers durch einen weitergeleitet. Natürlich hätten Sie weiterhin Zugriff auf diese Informationen, solange der Router unter Ihrer Kontrolle steht, aber es gibt keine universelle Möglichkeit, diese IP-Adresse an Hosts im lokalen Netzwerk zu übermitteln. Infolgedessen kann Ihr Server den Router nicht einfach nach der externen IP-Adresse fragen, die er verwenden wird.

Die effizienteste Alternative wäre, den Router einfach seine Magie entfalten zu lassen und tatsächlich die Verbindung zu einem externen Server herzustellen, und ihn dann aufzufordern, die Adresse zurückzugeben, von der die Anforderung stammt. Viele Webserver wurden speziell für diesen Zweck eingerichtet. Für die Skripterstellung kann ich http://icanhazip.com/ empfehlen , da hierfür keine weitere Analyse erforderlich ist (nur die IP wird im Klartext zurückgegeben).

Falls erforderlich, sollten die Antworten auf die zuvor verlinkte Frage viele Tipps zur Implementierung enthalten.

Marcks Thomas
quelle
Gute Ideen und Links. +1, wenn auch nur für die icanhazip-Website, die ich nicht kannte, und macht das Herunterladen von zusätzlichem HTML und das Parsen unnötig.
Silver Quettier
1
Oder checkip.net-me.net/plain
Alex
2
Auch ifconfig.me/ip und wtfismyip.com/text
Dmitry Fedorkov
6

Sie können jede Website abfragen, auf der Ihre IP für diese Aufgabe angezeigt wird. Verwenden Sie checkip.dyndns.com , da es nur text.on ist.

Beispiel:

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

Ich hatte heute dieselbe Frage und war mit den Antworten, die ich hier oder bei Google gesehen habe, nicht zufrieden. Deshalb habe ich ein PowerShell-Skript geschrieben, um mir eine Slack-Benachrichtigung zu senden, wenn sich meine IP-Adresse ändert .

Wenn Sie eine E-Mail erhalten möchten, können Sie auf die Links im Skript klicken, um eine andere Version anzuzeigen, die Outlook-E-Mails unterstützt.

Ich hoffe das hilft jemandem und verdient eine Stimme. :-)

Speichern Sie den folgenden Text in einer .ps1-Datei. Bearbeiten Sie es entsprechend mit Ihrer eigenen Slack-Webhook-URL. Speichern. Klicken Sie mit der rechten Maustaste auf die Datei, um "Mit PowerShell ausführen".

Oder Sie können festlegen, dass es täglich oder wie oft ausgeführt wird.

#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

So funktioniert der Taskplaner:

Ich musste PowerShell als Administrator ausführen und dann ausführen Get-ExecutionPolicy, was mir dann mitteilte, dass meine aktuelle ExecutionPolicy "eingeschränkt" war.

Dann bin ich gelaufen Set-ExecutionPolicy RemoteSigned(wie hier gezeigt, aber es macht mich nervös: https://stackoverflow.com/a/26955050/470749 ).

Dann habe ich an einer einfachen Windows-Eingabeaufforderung ein paar Mal versucht, den folgenden Befehl auszuführen: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(einmal, um die IP zu speichern, und ein zweites Mal, um zu überprüfen, ob sie sich geändert hat).

(Bis das funktioniert, versuchen Sie nicht, den Taskplaner zu verwenden.)

Dann habe ich eine Aufgabe mit C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeals Programm und -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1als Argumente geplant.

Ryan
quelle
Es ist eine großartige Lösung, aber leider hat das OP festgestellt, dass er CentOS verwendet, sodass dies die Frage technisch nicht beantwortet.
MaQleod
0

Die vorherigen Antworten ohne die PS-Implementierung sagen Ihnen nicht, ob sich die IP geändert hat. (Ich möchte PowerShell lieben. Ryan hat gut herausgefunden, warum ich das nicht tue: Ausführungssicherheitsberechtigungen sind störend).

Das Parsen der IP ist nicht erforderlich, solange sich keine zusätzliche Ausgabe ändert, wenn sich die IP nicht geändert hat. Zum Beispiel gibt checkip.dyndns.com so etwas wie die aktuelle IP-Adresse zurück: ddd.ddd.ddd.ddd. Es reicht also aus, einfach die gesamte Ausgabe zu vergleichen.

Auch wenn Sie Curl verwenden, möchten Sie möglicherweise den Fortschritt mit dem Flag -s ausblenden. Da es in stderr geschrieben ist, verschmutzt es stdout nicht.

Hier ist also ein einfaches .cmd-Skript, das Curl verwendet, um die Ausgabe zu speichern. Anschließend wird FC verwendet, um es mit der vorherigen Ausgabe zu vergleichen, falls vorhanden. Ich muss keine FC-Optionen für Unicode, Groß- und Kleinschreibung usw. festlegen, da die Ausgabe eine binäre Übereinstimmung sein sollte, wenn sich die IP nicht geändert hat. Unix hat cmp anstelle von 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
)

Offensichtlich kann CurrentIp.txt LastIp.txt entsprechend geändert werden, z. B. mit dem Präfix "% TMP% \". Dieses Skript sollte mit geringfügigen Änderungen über den Taskplaner funktionieren.

Andrew Dennison
quelle
0

Antwort auf OP: "Fehlt mir eine einfache und elegante Möglichkeit, meine öffentliche IP-Adresse abzurufen und zu überprüfen, ob sie sich geändert hat?"

Eine wirklich einfache Antwort ist nicht. Aktualisieren Sie einfach regelmäßig Ihre IP.

Es scheint verschwenderisch, aber "intelligentere" Lösungen sind nur komplexer und weniger zuverlässig, ohne CPU, Bandbreite usw. zu sparen. Das Senden von 1500 Bytes oder weniger (ein Paket) einmal pro Stunde ist sehr billig. Ein ganzes Jahr verbraucht 365 * 24 * 1.500 = 13 Meg Bytes oder ungefähr 3 Minuten des Rifleman auf Netflix.

Die CPU- / Bandbreitenkosten für das Abrufen Ihrer externen IP-Adresse und das gelegentliche Posten Ihrer neuen IP-Adresse sind höchstwahrscheinlich höher als nur das periodische redundante Posten Ihrer IP-Adresse. Ich poste meine IP seit Jahren stündlich jede Stunde auf duckdns, ohne Probleme. Wenn Sie dies 1 / Sekunde tun, kann Ihr Domain-Service dies natürlich herausfinden und sich ärgern. Ebenso wird jeder Dienst, den Sie zum Nachschlagen Ihrer IP verwenden, nicht glücklich sein, wenn Sie dies tun.

Ein letzter Gedanke, die Frage, die Sie stellen, ist ein Teil des Problems, das Sie erwähnen. Der Auslöser für die Aktualisierung Ihrer dynamischen DNS kann sein, wenn Ihr Domain-Name nicht auf Ihrem Server aufgelöst wird. Sie könnten Ping verwenden, aber wenn Ihre alte IP-Adresse wiederverwendet wird, reagiert der neue IP-Leasingnehmer möglicherweise auf Ping.

In diesem Sinne können Sie regelmäßig versuchen, eine kleine Signatur- / Magic-Datei von Ihrem Server herunterzuladen. Dies könnte wirklich jede statische Datei sein, die Ihnen sagt, dass Sie Ihren Server gefunden haben, sogar Ihre Homepage würde funktionieren, aber ein ungewöhnlicher Name wäre viel besser als default.html.

Wenn das D / L fehlschlägt, aktualisieren Sie Ihre IP, leeren Sie Ihren DNS-Cache und versuchen Sie es erneut. Abhängig von Ihrem DNS-Dienst kann es einige Minuten dauern, bis das Update wirksam wird. Dieser Ansatz beseitigt die Abhängigkeit von einer anderen externen IP-Site und testet tatsächlich, was Sie wirklich wissen möchten: Können andere meine Site erreichen?

Andrew Dennison
quelle
0

Als alternative Option, die Ihnen helfen könnte, habe ich ein Python-Skript geschrieben, das zur Überwachung auf Änderungen der externen IP-Adresse entwickelt wurde. Ich benutze es unter Linux, aber da es Python ist, sollte es unter Windows gut funktionieren, nachdem die entsprechende Python-Umgebung eingerichtet wurde. Derzeit wird die "aktuelle" externe IP-Adresse in einer Datei gespeichert. Beim Ausführen wird eine neue IP-Adresse abgerufen und mit der alten verglichen. Es ist beabsichtigt, Ihnen eine E-Mail zu senden, wenn eine Änderung festgestellt wird.

Es kann als Cronjob (Linux) oder geplante Aufgabe (Windows) ausgeführt werden und wird nicht als eigenständiger Hintergrunddämon ausgeführt.

Hier ist der Link zum Github-Repository: https://github.com/begleysm/ipwatch

Hoffentlich hilft es!

Begleysmus
quelle
-2

Ich benutze curl ifconfig.me, aber es ist nichts, was ich auf anderen Plattformen als Debian versucht habe.

ChangosMuertos
quelle
Ich (und andere) fanden es langsam von der Kommandozeile. Siehe "curl ifconfig.me" ist lächerlich langsam von der Kommandozeile # 4 github.com/learn-co-curriculum/fe-how-the-web-works/issues/4
Andrew Dennison