Moyen le plus simple de vérifier les changements IP dynamiques


12

Quelle serait la façon la plus simple de trouver, avec un script, si mon adresse IP a changé?


Informations de fond:

J'ai une connexion standard par modem câble domestique et mon FAI m'attribue une IP dynamique. Cela change de temps en temps, les durées de bail DHCP semblent irrégulières.

Fondamentalement, je fais ma propre chose DNS dynamique et je peux mettre à jour les enregistrements DNS pointant vers mon serveur domestique en un clic. La seule chose qui reste à faire est de détecter un changement d'adresse IP afin que je puisse automatiser entièrement le processus.

Maintenant, il y a plusieurs sites Web ici qui peuvent renvoyer votre adresse IP, et je pourrais utiliser un travail cron sur l' wgetune de ces pages et grepl'adresse IP à partir de celle-ci ... Mais il semble exagéré en termes d'utilisation du processeur / de la bande passante, et ce n'est pas très BAISER.

Me manque-t-il un moyen simple et élégant de récupérer mon adresse IP publique et de vérifier si elle a changé?

Information supplémentaire: mon modem / routeur est une brique bon marché, il ne fait rien de très intéressant à cet égard. Mon serveur fonctionne avec Centos 6.

Réponses:


6

En supposant que vous êtes derrière NAT, la façon la plus élégante à laquelle je peux penser est d'exécuter une tâche cron sur le routeur lui-même, en vérifiant périodiquement ifconfigaussi son adresse WAN actuelle. Cela peut même être possible sur une «brique bon marché» si vous pouvez installer un firmware personnalisé. Cependant élégant, à peine simple.

Comme discuté ici , sous Windows, mais l'argument est également valable pour Centos, en interrogeant l'IP WAN derrière NAT, vous rencontrez le problème que vous n'avez techniquement pas d'adresse externe. Au lieu de cela, vous êtes acheminé par l'un à la discrétion du routeur. De toute évidence, vous auriez toujours accès à ces informations tant que le routeur est sous votre contrôle, mais il n'existe aucun moyen universel de communiquer cette adresse IP aux hôtes du réseau local. Par conséquent, votre serveur ne peut pas simplement demander au routeur l'adresse IP externe qu'il utilisera.

L'alternative la plus efficace serait de laisser le routeur faire sa magie et d'établir la connexion avec un serveur externe, puis de lui demander de renvoyer l'adresse d'où provient la demande. De nombreux serveurs Web ont été créés spécialement à cet effet. Pour les scripts, je peux recommander http://icanhazip.com/ , car il ne nécessite aucune analyse supplémentaire de votre part (seule l'adresse IP est renvoyée en texte brut).

Si nécessaire, les réponses à la question liée à avant devraient fournir de nombreux conseils sur la mise en œuvre.


Bonnes idées et liens. +1, ne serait-ce que pour le site icanhazip que je ne connaissais pas, et rend le téléchargement de code HTML supplémentaire et l'analyse inutile.
Silver Quettier

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


6

Vous pouvez interroger n'importe quel site Web qui affiche votre adresse IP pour cette tâche. En utilisant checkip.dyndns.com , car il est text.only.

Exemple:

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

0

J'avais cette même question aujourd'hui, et je n'étais pas satisfait des réponses que j'ai vues ici ou sur Google, j'ai donc écrit un script PowerShell pour m'envoyer une notification Slack chaque fois que mon adresse IP change .

Si vous préférez recevoir un e-mail, vous pouvez cliquer sur les liens du script pour consulter une version différente qui prend en charge les e-mails Outlook.

J'espère que cela aide quelqu'un et mérite un vote. :-)

Enregistrez le texte suivant dans un fichier .ps1. Modifiez-le selon vos besoins avec votre propre URL de webhook Slack. Sauver. Cliquez avec le bouton droit sur le fichier pour "Exécuter avec PowerShell".

Ou vous pouvez le programmer pour qu'il s'exécute quotidiennement ou cependant souvent.

#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

Pour faire fonctionner le Planificateur de tâches:

J'ai dû exécuter PowerShell en tant qu'administrateur, puis exécuter Get-ExecutionPolicy, ce qui m'a alors dit que ma politique d'exécution actuelle était «restreinte».

Ensuite, j'ai couru Set-ExecutionPolicy RemoteSigned(comme indiqué ici, mais cela me rend nerveux: https://stackoverflow.com/a/26955050/470749 ).

Ensuite, à partir d'une invite de commande Windows de base, j'ai essayé d'exécuter la commande suivante à quelques reprises: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(une fois pour stocker l'IP et une deuxième fois pour vérifier si elle avait changé).

(Jusqu'à ce que cela fonctionne, ne vous embêtez pas à essayer d'utiliser le Planificateur de tâches.)

J'ai ensuite planifié une tâche avec C:\Windows\System32\WindowsPowerShell\v1.0\powershell.execomme programme et -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1comme arguments.


C'est une excellente solution, mais malheureusement, l'OP a noté qu'il utilise CentOS, donc cela ne répond pas techniquement à la question.
MaQleod

0

Les réponses précédentes, à l'exclusion de l'implémentation PS, ne vous disent pas réellement si l'IP a changé. (Je veux aimer PowerShell. Ryan a fait un bon travail pour identifier pourquoi je ne le fais pas: les autorisations de sécurité d'exécution sont nuisibles).

L'analyse de l'IP n'est pas nécessaire tant qu'aucune sortie supplémentaire ne change lorsque l'IP n'a pas changé. Par exemple, checkip.dyndns.com renvoie quelque chose comme l'adresse IP actuelle: ddd.ddd.ddd.ddd. Ainsi, il suffit de comparer simplement la sortie entière.

De plus, si vous utilisez curl, vous souhaiterez peut-être masquer la progression à l'aide de l'indicateur -s. Comme il est écrit sur stderr, il ne pollue pas stdout.

Voici donc un simple script .cmd, qui utilise curl pour enregistrer la sortie. Il utilise ensuite FC pour le comparer à la sortie précédente, le cas échéant. Je n'ai pas besoin de définir les options FC pour Unicode, la sensibilité à la casse, etc., car la sortie doit être une correspondance binaire, lorsque l'IP n'a pas changé. Unix a cmp au lieu de 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
)

De toute évidence, CurrentIp.txt LastIp.txt peut être modifié pour convenir, par exemple le préfixe avec "% TMP% \" Ce script devrait fonctionner à partir du Planificateur de tâches, avec des modifications mineures.


0

En réponse à OP: "Est-ce qu'il me manque un moyen simple et élégant de récupérer mon adresse IP publique et de vérifier si elle a changé?"

Une réponse très simple est de ne pas le faire. Mettez à jour périodiquement votre IP.

Cela semble inutile, mais les solutions «plus intelligentes» sont juste plus complexes et moins fiables, sans économiser le processeur, la bande passante, etc. Envoyer 1 500 octets ou moins (un paquet) une fois par heure est très bon marché. Une année entière consommera 365 * 24 * 1,500 = 13 Meg Bytes ou environ 3 minutes du Rifleman sur Netflix.

Le coût du processeur / de la bande passante pour obtenir votre adresse IP externe et publier occasionnellement votre nouvelle adresse IP est probablement plus élevé que de publier régulièrement votre adresse IP de manière redondante. Je poste mon IP sur duckdns toutes les heures depuis des années, sans problème. Évidemment, si vous commencez à faire cette 1 / seconde, votre service de domaine peut le comprendre et s'énerver. De même, tout service que vous utilisez pour rechercher votre adresse IP ne sera pas heureux si vous faites cela.

Une dernière pensée, la question que vous posez fait partie du problème que vous mentionnez. Le déclencheur de l'actualisation de votre DNS dynamique pourrait être lorsque votre nom de domaine ne se résout pas sur votre serveur. Vous pouvez utiliser ping, mais si votre ancienne adresse ip est réutilisée, le nouveau titulaire de bail ip peut bien répondre au ping.

Dans cet esprit, vous pouvez périodiquement tenter de télécharger un petit fichier signature / magique à partir de votre serveur. Vraiment, cela pourrait être n'importe quel fichier statique qui vous indique que vous avez trouvé votre serveur, même votre page Web d'accueil fonctionnerait, mais un nom inhabituel serait bien meilleur que default.html.

Si le d / l échoue, mettez à jour votre adresse IP, videz votre cache DNS et réessayez. La mise à jour peut prendre quelques minutes pour être efficace, selon votre service DNS. Cette approche supprime la dépendance à l'égard d'un autre site IP externe et teste réellement ce que vous voulez vraiment savoir: d'autres personnes peuvent-elles accéder à mon site?


0

Comme option alternative qui pourrait vous aider, j'ai écrit un script python conçu pour surveiller les changements d'adresse IP externes. Je l'utilise sous Linux, mais comme il s'agit de python, il devrait fonctionner correctement sous Windows après avoir configuré l'environnement Python approprié. Il enregistre actuellement l'adresse IP externe "actuelle" dans un fichier et, une fois exécuté, saisit une nouvelle adresse IP, puis la compare à l'ancienne. Il est conçu pour vous envoyer un e-mail si un changement est détecté.

Il est conçu pour s'exécuter en tant que tâche cronjob (Linux) ou planifiée (Windows) et ne s'exécute pas en tant que démon d'arrière-plan seul.

Voici le lien vers le référentiel github: https://github.com/begleysm/ipwatch

J'espère que ça aide!


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.