Самый простой способ проверить динамическое изменение IP

12

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


Справочная информация:

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

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

Теперь есть несколько веб-сайтов, которые могут вернуть ваш IP-адрес, и я мог бы использовать задание cron для wgetодной из этих страниц и grepIP-адрес с нее ... Но это кажется излишним с точки зрения использования ЦП / пропускной способности, и это не очень ПОЦЕЛУЙ.

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

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

Серебряный Кветтье
источник

Ответы:

5

Предполагая, что вы находитесь за NAT, самый элегантный способ, который я могу придумать, - запустить задание cron на самом маршрутизаторе, периодически проверяя ifconfigи проверяя его текущий WAN-адрес. Это может быть даже возможно на «дешевом кирпиче», если вы можете установить пользовательскую прошивку. Однако элегантный, вряд ли простой.

Как обсуждалось здесь , в Windows, но аргумент в равной степени действителен для Centos, при опросе IP-адреса WAN из-за NAT вы сталкиваетесь с проблемой, что у вас технически нет внешнего адреса. Вместо этого вы маршрутизируете через один на усмотрение маршрутизатора. Очевидно, что вы все равно будете иметь доступ к этой информации, пока маршрутизатор находится под вашим контролем, но универсального способа передачи этого IP-адреса хостам в локальной сети не существует. В результате ваш сервер не может просто запросить у маршрутизатора внешний IP-адрес, который он будет использовать.

Наиболее эффективной альтернативой было бы просто позволить маршрутизатору сделать свое волшебство и фактически установить соединение с внешним сервером, а затем попросить его вернуть адрес, с которого был получен запрос. Многие веб-серверы были созданы специально для этой цели. Для сценариев я могу порекомендовать http://icanhazip.com/ , так как он не требует дальнейшего анализа с вашей стороны (только IP возвращается в виде простого текста).

При необходимости ответы на вопрос, связанный с ранее, должны содержать множество советов по реализации.

Маркс Томас
источник
Хорошие идеи и ссылки. +1, если только для сайта icanhazip, которого я не знал, и делает ненужным скачивание дополнительного HTML и анализ.
Серебро Кветтье
1
Или checkip.net-me.net/plain
Alex
2
Также ifconfig.me/ip и wtfismyip.com/text
Дмитрий Федорков
6

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

Пример:

wget -q -O - checkip.dyndns.com | grep -Po "[\d\.]+"
Деннис
источник
0

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

Если вы предпочитаете получать электронную почту, вы можете щелкнуть ссылки в сценарии, чтобы посмотреть другую версию, поддерживающую электронную почту Outlook.

Надеюсь, это кому-нибудь поможет и заслужит голос. :-)

Сохраните следующий текст в файл .ps1. Отредактируйте его соответствующим образом с вашим собственным URL-адресом Slack. Сохранить. Щелкните правой кнопкой мыши файл, чтобы «Запустить с 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аргументов.

Райан
источник
Это отличное решение, но, к сожалению, OP отметил, что он использует CentOS, так что технически это не отвечает на вопрос.
MaQleod
0

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

Синтаксический анализ IP не требуется, если любой дополнительный вывод не изменяется, тогда как IP-адрес не изменился. Например, checkip.dyndns.com возвращает что-то вроде текущего IP-адреса: ddd.ddd.ddd.ddd. Таким образом, достаточно просто сравнить весь вывод.

Также, если вы используете curl, вы можете скрыть прогресс, используя флаг -s. Поскольку он написан на stderr, он не загрязняет стандартный вывод.

Итак, вот простой скрипт .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

В ответ на OP: «Я упускаю какой-то простой и элегантный способ получить мой публичный IP и проверить, изменился ли он?»

Действительно простой ответ - нет. Просто периодически обновляйте свой IP.

Это кажется расточительным, но «умные» решения просто более сложные и менее надежные, без экономии ресурсов процессора, пропускной способности и т. Д. Отправка 1500 байт или меньше (пакет) один раз в час очень дешева. Весь год будет потреблять 365 * 24 * 1500 = 13 мегабайт или около 3 минут стрелка на Netflix.

Стоимость процессора / полосы пропускания для получения вашего внешнего ip и периодической публикации нового ip, скорее всего, выше, чем просто избыточная периодическая публикация вашего ip. Я публиковал свой ip на duckdns каждый час в течение многих лет, без проблем. Очевидно, что если вы начнете делать это 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

Надеюсь, это поможет!

begleysm
источник
-2

Я использую curl ifconfig.me, но это не то, что я пробовал на платформах, отличных от Debian.

ChangosMuertos
источник
Я (и другие) нашел, что это медленно из командной строки. См. "Curl ifconfig.me" смехотворно медленно работает из командной строки # 4 github.com/learn-co-curriculum/fe-how-the-web-works/issues/4
Эндрю Деннисон,