La forma más simple de verificar el cambio dinámico de IP


12

¿Cuál sería la forma más fácil de encontrar, con un script, si mi dirección IP ha cambiado?


Información de fondo:

Tengo una conexión estándar de módem de cable doméstico y mi ISP me asigna una IP dinámica. Cambia de vez en cuando, los tiempos de arrendamiento de DHCP parecen irregulares.

Básicamente, estoy haciendo mi propio DNS dinámico y puedo actualizar los registros DNS apuntando a mi servidor doméstico con un clic. Lo único que queda es detectar un cambio de IP para poder automatizar completamente el proceso.

Ahora hay varios sitios web aquí que pueden devolver su dirección IP, y podría usar un trabajo cron en wgetuna de estas páginas y grepla dirección IP de la misma ... Pero parece excesivo en términos de uso de CPU / ancho de banda, y no es muy BESO.

¿Me estoy perdiendo alguna forma simple y elegante de recuperar mi IP pública y verificar si ha cambiado?

Información adicional: mi módem / enrutador es un ladrillo barato, no hace nada muy interesante a ese respecto. Mi servidor funciona con Centos 6.

Respuestas:


6

Suponiendo que está detrás de NAT, la forma más elegante en la que puedo pensar es ejecutar un trabajo cron en el enrutador, verificando periódicamente ifconfigtambién para verificar su dirección WAN actual. Esto incluso puede ser posible en un 'ladrillo barato' si puede instalar un firmware personalizado. Sin embargo elegante, apenas simple.

Como se discutió aquí , en Windows, pero el argumento es igualmente válido para Centos, al sondear la IP WAN desde detrás de NAT, se encuentra con el problema de que técnicamente no tiene una dirección externa. En su lugar, se enruta a través de uno a discreción del enrutador. Obviamente, aún tendría acceso a esta información siempre que el enrutador esté bajo su control, pero no existe una forma universal de comunicar esta dirección IP a los hosts en la red local. Como resultado, su servidor no puede simplemente pedirle al enrutador la IP externa que usará.

La alternativa más eficiente sería simplemente dejar que el enrutador haga su magia y realmente hacer la conexión a un servidor externo, luego pedirle que devuelva la dirección desde la que se originó la solicitud. Se han creado muchos servidores web específicamente para este propósito. Para las secuencias de comandos, puedo recomendar http://icanhazip.com/ , ya que no requiere más análisis por su parte (solo la IP se devuelve en texto sin formato).

Si es necesario, las respuestas a la pregunta vinculada anteriormente deberían proporcionar muchos consejos sobre la implementación.


Buenas ideas y enlaces. +1, aunque solo sea para el sitio web icanhazip que no conocía, y hace innecesaria la descarga de HTML adicional y el análisis.
Silver Quettier

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


6

Puede consultar cualquier sitio web que muestre su IP para esta tarea. Usando checkip.dyndns.com , ya que solo envía mensajes de texto.

Ejemplo:

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

0

Tenía la misma pregunta hoy, y no estaba satisfecho con las respuestas que vi aquí o en Google, así que escribí un script de PowerShell para enviarme una notificación de Slack cada vez que cambia mi dirección IP .

Si prefiere recibir un correo electrónico, puede hacer clic en los enlaces del script para ver una versión diferente que admita correos electrónicos de Outlook.

Espero que esto ayude a alguien y gane un voto. :-)

Guarde el siguiente texto en un archivo .ps1. Edítelo según corresponda con su propia URL de webhook Slack. Salvar. Haga clic derecho en el archivo para "Ejecutar con PowerShell".

O puede programarlo para que se ejecute a diario o con la frecuencia que sea.

#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

Para que funcione el Programador de tareas:

Tuve que ejecutar PowerShell como administrador y luego ejecutar Get-ExecutionPolicy, lo que luego me dijo que mi ExecutionPolicy actual estaba "restringida".

Luego corrí Set-ExecutionPolicy RemoteSigned(como se muestra aquí, pero me pone nervioso: https://stackoverflow.com/a/26955050/470749 ).

Luego, desde un símbolo del sistema básico de Windows, intenté ejecutar el siguiente comando un par de veces: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(una vez para almacenar la IP, y una segunda vez para verificar si había cambiado).

(Hasta que funcione, no se moleste en intentar usar el Programador de tareas).

Luego programé una tarea con C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeel programa y -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1los argumentos.


Es una gran solución, pero desafortunadamente el OP notó que está usando CentOS, por lo que técnicamente esto no responde la pregunta.
MaQleod

0

Las respuestas anteriores, excluyendo la implementación de PS, en realidad no le dicen si la IP ha cambiado. (Quiero amar a PowerShell. Ryan ha hecho un buen trabajo al identificar por qué no: los permisos de seguridad de ejecución son molestos).

No es necesario analizar la IP siempre que no se modifique ninguna salida adicional cuando la IP no haya cambiado. Por ejemplo, checkip.dyndns.com devuelve algo como Dirección IP actual: ddd.ddd.ddd.ddd. Por lo tanto, es suficiente simplemente comparar todo el resultado.

Además, si está utilizando curl, es posible que desee ocultar el progreso utilizando la bandera -s. Como está escrito en stderr, no contamina stdout.

Entonces, aquí hay un script simple .cmd, que usa curl para guardar la salida. Luego usa FC para compararlo con el resultado anterior, si lo hay. No necesito configurar las opciones de FC para Unicode, mayúsculas y minúsculas, etc., ya que la salida debe ser una coincidencia binaria, cuando la IP no ha cambiado. Unix tiene cmp en lugar 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
)

Obviamente CurrentIp.txt LastIp.txt se puede cambiar para adaptarlo, por ejemplo, prefijo con "% TMP% \". Este script debería funcionar desde el Programador de tareas, con cambios menores.


0

En respuesta a OP: "¿Me estoy perdiendo alguna forma simple y elegante de recuperar mi IP pública y verificar si ha cambiado?"

Una respuesta realmente simple es no. Simplemente actualice periódicamente su IP.

Parece un desperdicio, pero las soluciones "más inteligentes" son simplemente más complejas y menos confiables, sin ahorrar CPU, ancho de banda, etc. Enviar 1500 bytes o menos (un paquete) una vez por hora es muy barato. Un año completo consumirá 365 * 24 * 1,500 = 13 Meg Bytes o aproximadamente 3 minutos del Fusilero en Netflix.

El costo de CPU / ancho de banda de obtener su ip externa y ocasionalmente publicar su nueva ip, es muy probable que sea más alta que simplemente publicar su ip de forma redundante. He estado publicando mi ip en duckdns cada hora durante años, sin problema. Obviamente, si comienzas a hacer esto 1 / segundo, tu servicio de dominio puede resolverlo y molestarse. Del mismo modo, cualquier servicio que utilice para buscar su IP no será feliz si hace esto.

Un último pensamiento, la pregunta que haces es parte del problema que mencionas. El desencadenante para actualizar su dns dinámico podría ser cuando su nombre de dominio no se resuelve en su servidor. Puede usar ping, pero si su antigua dirección IP se reutiliza, el nuevo titular de arrendamiento de IP puede responder al ping.

Con esto en mente, puede intentar periódicamente descargar un pequeño archivo de firma / magia de su servidor. Realmente podría tratarse de cualquier archivo estático que le diga que encontró su servidor, incluso su página web principal funcionaría, pero un nombre inusual sería mucho mejor que default.html.

Si el d / l falla, actualice su IP, borre su caché DNS e intente nuevamente. La actualización puede tardar unos minutos en ser efectiva, dependiendo de su servicio DNS. Este enfoque elimina la dependencia de algún otro sitio de IP externo, y realmente prueba lo que realmente quiere saber: ¿Pueden otros llegar a mi sitio?


0

Como una opción alternativa que podría ayudarlo, he escrito un script de Python diseñado para monitorear los cambios de la dirección IP externa. Lo uso en Linux, pero como es Python, debería funcionar bien en Windows después de configurar el entorno Python adecuado. Actualmente guarda la dirección IP externa "actual" en un archivo y, cuando se ejecuta, toma una nueva dirección IP y luego la compara con la anterior. Está diseñado para enviarle un correo electrónico si se detecta un cambio.

Está diseñado para ejecutarse como una tarea cronjob (Linux) o programada (Windows) y no se ejecuta como un demonio de fondo por sí solo.

Aquí está el enlace al repositorio de github: https://github.com/begleysm/ipwatch

¡Ojalá ayude!


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.