Найпростіший спосіб перевірити наявність динамічної зміни IP-адреси


12

Який найпростіший спосіб знайти за допомогою сценарію, якщо моя IP-адреса змінилася?


Довідкова інформація:

У мене є стандартний підключення домашнього кабельного модему, і мій Інтернет-провайдер призначає мені динамічну IP-адресу. Він змінюється раз у раз, терміни оренди DHCP здаються нерегулярними.

В основному, я роблю власну динамічну річ DNS і можу оновлювати записи DNS, що вказують на мій домашній сервер одним клацанням. Залишилося лише виявити зміну IP-адреси, щоб я міг повністю автоматизувати процес.

Зараз тут є кілька веб-сайтів, які можуть повернути вашу IP-адресу, і я міг би використати завдання cron на wgetодній із цих сторінок та grepIP-адресу з неї ... Але це здається непосильним з точки зору використання процесора / пропускної здатності, і це не дуже KISS.

Чи пропускаю я якийсь простий та елегантний спосіб отримати свій публічний IP-адресу та перевірити, чи він змінився?

Додаткова інформація: мій модем / маршрутизатор - це дешева цегла, вона не робить нічого дуже цікавого в цьому плані. Мій сервер працює з Centos 6.

Відповіді:


6

Якщо припустити, що ти відстаєш від NAT, найелегантніший спосіб, про який я можу придумати, - це запустити роботу крон на самому маршрутизаторі, періодично перевіряючи ifconfigтакож перевірити його поточну адресу WAN. Це навіть можливо на "дешевій цеглі", якщо ви зможете встановити власну прошивку. Однак елегантний, навряд чи простий.

Як обговорювалося тут , у Windows, але аргумент однаково справедливий для Centos, опитуючи WAN IP з-за NAT, ви стикаєтеся з проблемою, що технічно у вас немає зовнішньої адреси. Натомість ви переходите через один на розсуд маршрутизатора. Очевидно, ви все одно матимете доступ до цієї інформації, поки маршрутизатор знаходиться під вашим контролем, але немає універсального способу передачі цієї IP-адреси хостам у локальній мережі. Як результат, ваш сервер не може просто запитати роутер про зовнішній IP, який він буде використовувати.

Найефективнішою альтернативою буде просто дозволити маршрутизатору зробити свою магію і фактично встановити з'єднання із зовнішнім сервером, а потім попросити його повернути адресу, звідки походить запит. Для цього було створено безліч веб-серверів. Для сценаріїв я можу порекомендувати http://icanhazip.com/ , оскільки він не потребує подальшого розбору з вашого боку (лише IP-адресу повертається у простому тексті).

У разі необхідності, відповіді на питання, пов'язане з цим раніше, мали б надати безліч порад щодо впровадження.


Хороші ідеї та посилання. +1, якщо тільки для веб-сайту icanhazip, про який я не знав, і робить завантаження додаткового HTML та розбору зайвим.
Silver Quettier

1
Або checkip.net-me.net/plain
Алекс


6

Ви можете здійснити запит на будь-який веб-сайт, який відображає вашу IP-адресу для цього завдання. Використовуючи checkip.dyndns.com , оскільки він це text.only.

Приклад:

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

0

У мене було таке ж питання сьогодні, і я не був задоволений відповідями, які я бачив тут або в Google, тому написав сценарій PowerShell, щоб надсилати мені повідомлення про слабку роботу, коли міняється моя IP-адреса .

Якщо ви хочете отримати електронний лист, ви можете натиснути посилання в сценарії, щоб переглянути іншу версію, яка підтримує електронні листи Outlook.

Я сподіваюся, що це комусь допоможе і заробить голос. :-)

Збережіть наступний текст у .ps1-файлі. Відредагуйте його відповідно до власної URL-адреси Slack webhook. Зберегти. Клацніть файл правою кнопкою миші, щоб «Запустити з PowerShell».

Або ви можете запланувати його запуск щодня або, однак, часто.

#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

Щоб робочий планувальник завдань працював:

Мені довелося запустити PowerShell як адміністратор, а потім запустити Get-ExecutionPolicy, який потім сказав мені, що моя поточна ExecutionPolicy "обмежена".

Потім я побіг Set-ExecutionPolicy RemoteSigned(як показано тут, але це мене нервує: https://stackoverflow.com/a/26955050/470749 ).

Потім з базового командного рядка Windows я кілька разів спробував запустити таку команду: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(один раз для зберігання IP-адреси, а другий раз, щоб перевірити, чи змінився він).

(Поки ви не зробляте це на роботі, не переймайтеся спробами використовувати Планувальник завдань.)

Тоді я запланував завдання з C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeпрограмою і -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1як Аргументи.


Це чудове рішення, але, на жаль, ОП зазначив, що він використовує CentOS, тому це технічно не відповідає на питання.
MaQleod

0

Попередні відповіді, що виключають реалізацію PS, насправді не повідомляють, чи змінився IP-адрес. (Я хочу любити PowerShell. Райан зробив гарну роботу, визначивши, чому я цього не роблю: дозволи безпеки виконання неприємності).

Розбір ІР не потрібен до тих пір, поки будь-який додатковий вихід не зміниться, коли тоді IP не змінився. Наприклад, checkip.dyndns.com повертає щось на зразок Поточна IP-адреса: ddd.ddd.ddd.ddd. Таким чином, достатньо просто порівняти весь результат.

Крім того, якщо ви використовуєте curl, ви можете приховати прогрес за допомогою прапора -s. Оскільки воно написано на stderr, воно не забруднює stdout.

Отже, ось простий .cmd скрипт, який використовує curl для збереження виводу. Потім він використовує FC, щоб порівняти його з попереднім результатом, якщо такий є. Мені не потрібно встановлювати параметри FC для Unicode, чутливості регістру тощо, оскільки вихід має бути двійковим збігом, коли IP не змінювався. У Unix є cmp замість 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
)

Очевидно, що CurrentIp.txt LastIp.txt може бути змінено відповідно до, наприклад, префікса "% TMP% \" Цей скрипт повинен працювати з Планувальником завдань, з незначними змінами.


0

У відповідь на ОП: "Чи пропускаю я якийсь простий та елегантний спосіб отримати свій публічний IP-адресу та перевірити, чи змінився він?"

Справді проста відповідь - ні. Просто періодично оновлюйте свою IP-адресу.

Здається, марно, але «розумніші» рішення просто складніші і менш надійні, не економлячи процесор, пропускну здатність і т.д. Цілий рік буде споживати 365 * 24 * 1,500 = 13 мегабайтів або приблизно 3 хвилини стрілецького на Netflix.

Вартість CPU / пропускної здатності на отримання вашого зовнішнього ip та періодично розміщення нового ip, швидше за все, вище, ніж просто надмірно періодично публікувати ваш ip. Я розміщую свій ip у качках щогодини, без проблем, без проблем. Очевидно, що якщо ви почнете робити це 1 / секунду, ваша послуга домену може зрозуміти це і роздратувати. Так само будь-яка послуга, яку ви використовуєте для пошуку свого ip, не буде задоволена, якщо ви це зробите.

Остання думка, запитання, яке ви задаєте, є частиною проблеми, про яку ви згадуєте. Пусковим механізмом для оновлення динамічного dns може стати те, коли ваше доменне ім’я не відповідає вашому серверу. Ви можете використовувати ping, але якщо ваша стара IP-адреса буде повторно використана, новий власник ip оренди цілком може відповісти на ping.

Зважаючи на це, ви можете періодично намагатися завантажити невеликий файл підписів / чарів з вашого сервера. Дійсно, це може бути будь-який статичний файл, який говорить вам про те, що ви знайшли свій сервер, навіть ваша домашня веб-сторінка спрацювала, але незвичне ім'я було б набагато краще, ніж default.html.

Якщо d / l не вдається, то оновіть IP-адресу, очистіть кеш-пам'ять DNS і повторіть спробу. Це може зайняти кілька хвилин, щоб оновлення було ефективним, залежно від послуги DNS. Такий підхід знімає залежність від іншого зовнішнього ip-сайта та фактично перевіряє те, що ви насправді хочете знати: Чи можуть інші звернутися до мого сайту?


0

Як альтернативний варіант, який може допомогти вам, я написав сценарій python, призначений для моніторингу змін зовнішніх IP-адрес. Я використовую його під Linux, але оскільки це python, він повинен працювати в ОС Windows просто після встановлення відповідного середовища Python. В даний час він зберігає "поточну" зовнішню IP-адресу до файлу і під час запуску захоплює нову IP-адресу, а потім перевіряє її на стару. Це дизайн, щоб надіслати вам повідомлення електронною поштою, якщо будуть виявлені зміни.

Він розроблений як запуск cronjob (Linux) або заплановане завдання (Windows) і не працює як фоновий демон самостійно.

Ось посилання на сховище github: https://github.com/begleysm/ipwatch

Сподіваємось, це допомагає!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.