Najprostszy sposób na sprawdzenie dynamicznej zmiany adresu IP

9

Jaki byłby najłatwiejszy sposób znalezienia skryptu, jeśli mój adres IP się zmienił?


Podstawowe informacje:

Mam standardowe połączenie z modemem kablowym, a mój ISP przypisuje mi dynamiczny adres IP. Zmienia się co jakiś czas, czas dzierżawy DHCP wydaje się nieregularny.

Zasadniczo robię własną dynamiczną usługę DNS i mogę aktualizować rekordy DNS wskazujące na mój serwer domowy jednym kliknięciem. Pozostaje tylko wykryć zmianę adresu IP, aby w pełni zautomatyzować proces.

Teraz jest kilka stron, które mogą zwrócić Twój adres IP, i mogę użyć zadania cron wget jedna z tych stron i grep adres IP z niego ... Ale wydaje się przesadny pod względem wykorzystania procesora / przepustowości, i to nie jest zbyt KISS.

Czy brakuje mi prostego i eleganckiego sposobu odzyskania mojego publicznego adresu IP i sprawdzenia, czy się zmienił?

Dodatkowe informacje: mój modem / router to tania cegła, nie robi w tym względzie nic interesującego. Mój serwer działa z Centos 6.

Silver Quettier
źródło

Odpowiedzi:

4

Zakładając, że jesteś za NATem, najbardziej eleganckim sposobem, jaki mogę sobie wyobrazić, jest uruchomienie zadania cron na samym routerze, okresowe sprawdzanie ifconfig sprawdź także jego aktualny adres WAN. Może to być możliwe nawet w przypadku „taniej cegły”, jeśli można zainstalować niestandardowe oprogramowanie układowe. Jednak elegancki, ledwie prosty.

Jak ustalono tutaj , w Windows, ale argument ten jest równie ważny dla Centosa, w odpytywaniu IP WAN zza NAT, natrafiasz na problem, którego technicznie nie masz zewnętrznego adresu. Zamiast tego jesteś przekierowywany przez jednego według uznania routera. Oczywiście nadal będziesz miał dostęp do tych informacji, dopóki router jest pod twoją kontrolą, ale nie ma uniwersalnego sposobu przekazywania tego adresu IP hostom w sieci lokalnej. W rezultacie twój serwer nie może po prostu poprosić routera o zewnętrzne IP, którego będzie używał.

Najbardziej wydajną alternatywą byłoby po prostu pozwolić routerowi na wykonanie swojej magii i nawiązanie połączenia z zewnętrznym serwerem, a następnie poproszenie go o zwrot adresu, z którego pochodzi żądanie. W tym celu stworzono wiele serwerów WWW. Do pisania skryptów mogę polecić http://icanhazip.com/ , ponieważ nie wymaga dalszego analizowania z twojej strony (tylko IP jest zwracane w postaci zwykłego tekstu).

Jeśli to konieczne, odpowiedzi na pytanie związane z wcześniejszym powinny dostarczyć wiele wskazówek dotyczących wdrożenia.

Marcks Thomas
źródło
Dobre pomysły i linki. +1, jeśli tylko dla strony internetowej icanhazip, której nie znałem, i niepotrzebne pobieranie dodatkowego HTML i parsowanie.
Silver Quettier
1
Lub checkip.net-me.net/plain
Alex
2
Również ifconfig.me/ip i wtfismyip.com/text
Dmitry Fedorkov
6

Możesz wysłać zapytanie do dowolnej witryny, która wyświetla Twoje IP dla tego zadania. Za pomocą checkip.dyndns.com , ponieważ to tekst.

Przykład:

wget -q -O - checkip.dyndns.com | grep -Po "[\d\.]+"
Dennis
źródło
0

Dzisiaj miałem to samo pytanie i nie byłem zadowolony z odpowiedzi, które zobaczyłem tutaj lub w Google, więc napisałem Skrypt PowerShell, aby wysłać mi powiadomienie Slack przy każdej zmianie adresu IP .

Jeśli wolisz otrzymywać e-mail, możesz kliknąć linki w skrypcie, aby zobaczyć inną wersję, która obsługuje wiadomości e-mail programu Outlook.

Mam nadzieję, że to pomoże komuś i zdobędzie głos. :-)

Zapisz następujący tekst w pliku .ps1. Zmodyfikuj go odpowiednio za pomocą własnego URL-a Slack Webhook. Zapisać. Kliknij prawym przyciskiem myszy plik, aby „Uruchom z PowerShell”.

Możesz też zaplanować, aby działał codziennie lub często.

#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

Aby uruchomić Harmonogram zadań:

Musiałem uruchomić PowerShell jako administrator, a następnie uruchomić Get-ExecutionPolicy, który następnie powiedział mi, że moja obecna ExecutionPolicy jest „ograniczona”.

Potem pobiegłem Set-ExecutionPolicy RemoteSigned (jak pokazano tutaj, ale denerwuję: https://stackoverflow.com/a/26955050/470749 ).

Następnie z podstawowego wiersza polecenia systemu Windows próbowałem uruchomić następujące polecenie kilka razy: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1" (raz, aby zapisać adres IP, a drugi, aby sprawdzić, czy się zmienił).

(Dopóki to nie zadziała, nie przejmuj się używaniem Harmonogramu zadań).

Potem zaplanowałem zadanie C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe jak program i -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1 jak argumenty.

Ryan
źródło
To świetne rozwiązanie, ale niestety OP zauważył, że używa CentOS, więc technicznie nie odpowiada na pytanie.
MaQleod
0

Poprzednie odpowiedzi wykluczające implementację PS, właściwie nie mówią, czy adres IP uległ zmianie. (Chcę kochać PowerShell. Ryan wykonał dobrą robotę, identyfikując, dlaczego nie: uprawnienia do wykonywania zabezpieczeń są uciążliwe).

Analizowanie adresu IP nie jest konieczne, o ile jakiekolwiek dodatkowe wyjście nie zmieni się, gdy adres IP nie ulegnie zmianie. Na przykład checkip.dyndns.com zwraca coś w rodzaju bieżącego adresu IP: ddd.ddd.ddd.ddd. Wystarczy więc po prostu porównać całe wyjście.

Także jeśli używasz curl, możesz ukryć postęp używając flagi -s. Ponieważ jest zapisywany na stderr, nie zanieczyszcza standardowego wyjścia.

Oto prosty skrypt .cmd, który używa curl do zapisywania danych wyjściowych. Następnie używa FC do porównania go z poprzednim wyjściem, jeśli istnieje. Nie muszę ustawiać opcji FC dla Unicode, rozróżniania wielkości liter itp., Ponieważ wyjście powinno być dopasowaniem binarnym, gdy IP nie ulegnie zmianie. Unix ma cmp zamiast 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
)

Oczywiście CurrentIp.txt LastIp.txt można zmienić, np. Przedrostek „% TMP%” Ten skrypt powinien działać z Harmonogramem zadań, z niewielkimi zmianami.

Andrew Dennison
źródło
0

W odpowiedzi na OP: „Czy brakuje mi prostego i eleganckiego sposobu odzyskania mojego publicznego adresu IP i sprawdzenia, czy się zmienił?”

Naprawdę prostą odpowiedzią jest nie. Po prostu okresowo aktualizuj swój adres IP.

Wydaje się marnotrawstwem, ale „inteligentniejsze” rozwiązania są po prostu bardziej złożone i mniej niezawodne, bez oszczędzania procesora, przepustowości itp. Wysyłanie 1500 bajtów lub mniej (pakiet) raz na godzinę jest bardzo tanie. Cały rok pochłonie 365 * 24 * 1 500 = 13 megabajtów lub około 3 minuty strzelca na Netflix.

Koszt procesora / przepustowości związany z uzyskiwaniem zewnętrznego IP i sporadycznie wysyłaniem nowego IP jest prawdopodobnie wyższy niż okresowe publikowanie IP. Od lat publikuję moje IP na duckdns bez problemu. Oczywiście, jeśli zaczniesz robić to 1 / sekundę, twoja usługa domeny może to rozgryźć i denerwować. Podobnie każda usługa, której używasz do wyszukiwania ip, nie będzie szczęśliwa, jeśli to zrobisz.

Ostatnia myśl, pytanie, które zadajesz, jest częścią problemu, o którym wspomniałeś. Wyzwalaczem odświeżania dynamicznych DN może być sytuacja, w której nazwa domeny nie zostanie rozstrzygnięta na serwerze. Możesz użyć polecenia ping, ale jeśli twój stary adres IP zostanie ponownie użyty, nowy właściciel dzierżawy ip może odpowiedzieć na ping.

Mając to na uwadze, możesz okresowo próbować pobrać mały plik podpisu / magii z serwera. Naprawdę może to być dowolny plik statyczny, który mówi, że znalazłeś swój serwer, nawet twoja strona domowa działałaby, ale niezwykła nazwa byłaby znacznie lepsza niż default.html.

Jeśli d / l nie powiedzie się, zaktualizuj swój adres IP, wyczyść pamięć podręczną DNS i spróbuj ponownie. Aktualizacja może potrwać kilka minut, w zależności od usługi DNS. Takie podejście eliminuje zależność od innej zewnętrznej witryny ip i faktycznie testuje to, co naprawdę chcesz wiedzieć: czy inni mogą dotrzeć do mojej witryny?

Andrew Dennison
źródło
-2

używam curl ifconfig.me, ale nie jest to coś, czego próbowałem na platformach innych niż Debian.

ChangosMuertos
źródło
Ja (i inni) stwierdziliśmy, że jest wolny z linii poleceń. Zobacz „curl ifconfig.me” jest śmiesznie powolny z linii poleceń # 4 github.com/learn-co-curriculum/fe-how-the-web-works/issues/4
Andrew Dennison