Maneira mais simples de verificar alterações dinâmicas de IP

12

Qual seria a maneira mais fácil de encontrar, com um script, se meu endereço IP foi alterado?


Informações de fundo:

Eu tenho uma conexão de modem a cabo doméstico padrão e meu ISP me atribui um IP dinâmico. Ele muda de vez em quando, os tempos de concessão do DHCP parecem irregulares.

Basicamente, estou fazendo minha própria coisa de DNS dinâmico e posso atualizar os registros DNS que apontam para o meu servidor doméstico com um clique. A única coisa que resta é detectar uma alteração de IP para que eu possa automatizar completamente o processo.

Agora, existem vários sites aqui que podem retornar seu endereço IP, e eu poderia usar um trabalho cron em wgetuma dessas páginas e grepo endereço IP dele ... Mas parece um exagero em termos de uso de CPU / largura de banda, e não é muito BEIJO.

Estou perdendo uma maneira simples e elegante de recuperar meu IP público e verificar se ele mudou?

Informação extra: meu modem / roteador é um tijolo barato, não faz nada muito interessante nesse sentido. Meu servidor roda com o Centos 6.

Silver Quettier
fonte

Respostas:

5

Supondo que você esteja atrás do NAT, a maneira mais elegante em que consigo pensar é executar uma tarefa cron no próprio roteador, verificando periodicamente ifconfigtambém a verificação do endereço WAN atual. Isso pode até ser possível em um 'bloco barato' se você conseguir instalar um firmware personalizado. No entanto elegante, dificilmente simples.

Como discutido aqui , no Windows, mas o argumento é igualmente válido para o Centos, ao pesquisar o IP da WAN por trás do NAT, você se depara com o problema de que tecnicamente não possui um endereço externo. Em vez disso, você é roteado através de um, a critério do roteador. Obviamente, você ainda teria acesso a essas informações enquanto o roteador estiver sob seu controle, mas não há uma maneira universal de comunicar esse endereço IP aos hosts na rede local. Como resultado, seu servidor não pode simplesmente solicitar ao roteador o IP externo que ele usará.

A alternativa mais eficiente seria apenas deixar o roteador fazer sua mágica e realmente fazer a conexão com um servidor externo, solicitando que ele retornasse o endereço de onde a solicitação se originou. Muitos servidores web foram configurados especificamente para esse fim. Para scripts, posso recomendar http://icanhazip.com/ , pois não requer análise adicional de sua parte (apenas o IP é retornado em texto sem formatação).

Se necessário, as respostas à pergunta vinculada antes devem fornecer muitas dicas sobre a implementação.

Marcks Thomas
fonte
Boas idéias e links. +1, mesmo que seja apenas para o site icanhazip que eu não conhecia, e torna desnecessário o download de HTML extra e a análise.
Silver Quettier 6/03/13
1
Ou checkip.net-me.net/plain
Alex
2
Também ifconfig.me/ip e wtfismyip.com/text
Dmitry Fedorkov
6

Você pode consultar qualquer site que exiba seu IP para esta tarefa. Usando checkip.dyndns.com , pois é text.only.

Exemplo:

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

Eu tinha a mesma pergunta hoje e não estava satisfeito com as respostas que vi aqui ou no Google, então escrevi um script do PowerShell para me enviar uma notificação do Slack sempre que meu endereço IP mudar .

Se você preferir receber um email, clique nos links do script para ver uma versão diferente que ofereça suporte a emails do Outlook.

Espero que isso ajude alguém e ganhe um voto. :-)

Salve o texto a seguir em um arquivo .ps1. Edite-o conforme apropriado com seu próprio URL de webhook do Slack. Salve . Clique com o botão direito do mouse no arquivo para "Executar com o PowerShell".

Ou você pode agendá-lo para ser executado diariamente ou com frequência.

#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 o Agendador de tarefas funcione:

Eu tive que executar o PowerShell como administrador e, em seguida Get-ExecutionPolicy, executar , o que me disse que minha atual ExecutionPolicy era "Restrita".

Então eu corri Set-ExecutionPolicy RemoteSigned(como mostrado aqui, mas isso me deixa nervoso: https://stackoverflow.com/a/26955050/470749 ).

Em um prompt de comando básico do Windows, tentei executar o seguinte comando algumas vezes: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(uma vez para armazenar o IP e uma segunda vez para verificar se havia sido alterado).

(Até conseguir que isso funcione, não se preocupe em tentar usar o Agendador de tarefas.)

Em seguida, agendei uma tarefa com C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeo programa e -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1os argumentos.

Ryan
fonte
É uma ótima solução, mas infelizmente o OP notou que ele está usando o CentOS, portanto, tecnicamente, isso não responde à pergunta.
MaQleod
0

As respostas anteriores, excluindo a implementação do PS, não informam se o IP foi alterado. (Quero amar o PowerShell. Ryan fez um bom trabalho ao identificar por que não gosto: permissões de segurança de execução são incômodas).

A análise do IP não é necessária, desde que qualquer saída adicional não seja alterada quando o IP não for alterado. Por exemplo, checkip.dyndns.com retorna algo como Endereço IP atual: ddd.ddd.ddd.ddd. Portanto, basta comparar a saída inteira.

Além disso, se você estiver usando curl, poderá ocultar o progresso usando o sinalizador -s. Como está escrito no stderr, ele não polui o stdout.

Então, aqui está um script .cmd simples, que usa curl para salvar a saída. Ele então usa FC para compará-lo com a saída anterior, se houver. Não preciso definir opções de FC para Unicode, distinção entre maiúsculas e minúsculas etc., pois a saída deve ser uma correspondência binária, quando o IP não foi alterado. O Unix tem cmp em vez 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 pode ser alterado para se adequar, por exemplo, prefixo com "% TMP% \" Este script deve funcionar no Agendador de tarefas, com pequenas alterações.

Andrew Dennison
fonte
0

Em resposta ao OP: "Estou perdendo uma maneira simples e elegante de recuperar meu IP público e verificar se ele mudou?"

Uma resposta realmente simples é não. Atualize periodicamente seu IP.

Parece um desperdício, mas soluções "mais inteligentes" são apenas mais complexas e menos confiáveis, sem economizar CPU, largura de banda, etc. Enviar 1500 bytes ou menos (um pacote) uma vez por hora é muito barato. Um ano inteiro consumirá 365 * 24 * 1.500 = 13 Meg Bytes ou cerca de 3 minutos do Rifleman na Netflix.

O custo de CPU / largura de banda de obter seu ip externo e ocasionalmente postar seu novo ip é provavelmente mais alto do que apenas postar redundantemente seu ip periodicamente. Venho postando meu ip para duckdns a cada hora há anos, sem problemas. Obviamente, se você começar a fazer isso por um segundo, seu serviço de domínio poderá descobrir e ficar irritado. Da mesma forma, qualquer serviço que você usar para procurar seu ip não ficará satisfeito se você fizer isso.

Um último pensamento, a pergunta que você faz é parte do problema que você mencionou. O gatilho para atualizar o seu DNS dinâmico pode ser quando o seu nome de domínio não for resolvido para o servidor. Você pode usar o ping, mas se o seu endereço IP antigo for reutilizado, o novo proprietário da concessão de IP poderá responder ao ping.

Com isso em mente, você pode tentar periodicamente fazer o download de um pequeno arquivo mágico / de assinatura do seu servidor. Realmente, pode ser qualquer arquivo estático que diz que você encontrou seu servidor, até sua página inicial funcionaria, mas um nome incomum seria muito melhor que o default.html.

Se o d / l falhar, atualize seu IP, limpe o cache do DNS e tente novamente. A atualização pode demorar alguns minutos, dependendo do seu serviço DNS. Essa abordagem elimina a dependência de outro site IP externo e testa o que você realmente deseja saber: outras pessoas podem acessar meu site?

Andrew Dennison
fonte
0

Como uma opção alternativa que pode ajudá-lo, escrevi um script python projetado para monitorar alterações externas no endereço IP. Eu o uso no Linux, mas como é python, ele deve funcionar no Windows muito bem depois de configurar o ambiente Python apropriado. Atualmente, ele salva o endereço IP externo "atual" em um arquivo e, quando executado, pega um novo endereço IP e o verifica em relação ao antigo. Foi projetado para enviar um e-mail a você, se uma alteração for detectada.

Ele foi projetado para ser executado como cronjob (Linux) ou tarefa agendada (Windows) e não é executado como um daemon em segundo plano por si só.

Aqui está o link para o repositório do github: https://github.com/begleysm/ipwatch

Espero que ajude!

begleysm
fonte