Dinamik IP değişikliğini kontrol etmenin en basit yolu


12

IP adresim değiştiyse, bir komut dosyasıyla bulmanın en kolay yolu ne olurdu?


Arkaplan bilgisi:

Standart bir ev kablosu modem bağlantım var ve ISS'im bana dinamik bir IP atar. Her seferinde değişiyor, DHCP kiralama süreleri düzensiz görünüyor.

Temel olarak, kendi dinamik DNS işimi yapıyorum ve bir tıklamayla ev sunucuma işaret eden DNS kayıtlarını güncelleyebilirim. Kalan tek şey işlemi tamamen otomatik hale getirebilmem için bir IP değişikliğini tespit etmektir.

Şimdi burada IP adresinizi döndürebilen birkaç web sitesi var ve wgetbu sayfalardan birine ve grepondan IP adresine bir cron işi kullanabilirim ... Ama CPU / bant genişliği kullanımı açısından aşırı gibi görünüyor ve çok fazla değil ÖPMEK.

Genel IP adresimi almanın ve değişip değişmediğini kontrol etmenin basit ve zarif bir yolunu mu kaçırıyorum?

Ekstra bilgi: Modemim / yönlendiricim ucuz bir tuğla, bu konuda çok ilginç bir şey yapmıyor. Sunucum Centos 6 ile çalışıyor.

Yanıtlar:


6

NAT'ın arkasında olduğunuzu varsayarsak, düşünebileceğim en zarif yol, yönlendiricinin kendisinde bir cron işi çalıştırmak ifconfigve geçerli WAN adresini periyodik olarak kontrol etmek. Özel ürün yazılımı yükleyebiliyorsanız bu 'ucuz tuğlada' bile mümkün olabilir. Ancak zarif, neredeyse basit.

Bahsedildiği gibi burada , Windows üzerinde, ancak argüman yoklama NAT arkasından WAN IP içinde, CentOS için aynı derecede geçerlidir, size teknik olarak harici adresi yok o sorun çıkıyor. Bunun yerine, yönlendiricinin takdirine bağlı olarak birinden yönlendirilirsiniz. Açıkçası, yönlendirici kontrolünüz altında olduğu sürece bu bilgilere erişmeye devam edersiniz, ancak bu IP adresini yerel ağdaki ana bilgisayarlara iletmenin evrensel bir yolu yoktur. Sonuç olarak, sunucunuz yönlendiriciden kullanacağı harici IP'yi isteyemez.

En etkili alternatif, yönlendiricinin sihrini yapmasına ve aslında harici bir sunucuya bağlantı kurmasına ve ardından isteğin kaynaklandığı adresi döndürmesini istemektir. Bu amaç için özel olarak birçok web sunucusu kurulmuştur. Komut dosyası oluşturmak için, http://icanhazip.com/ adresini önerebilirim , çünkü sizin tarafınızdan daha fazla ayrıştırma gerektirmez (yalnızca IP düz metin olarak döndürülür).

Gerekirse, daha önce bağlantılı olan sorunun cevapları, uygulama hakkında birçok ipucu sağlamalıdır.


İyi fikirler ve bağlantılar. +1, sadece bilmediğim icanhazip web sitesi için ve ekstra HTML indirme ve ayrıştırma gereksiz yapar.
Silver Quettier

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


6

Bu görev için IP'nizi gösteren herhangi bir web sitesini sorgulayabilirsiniz. Checkip.dyndns.com adresini kullanarak , çünkü text.only.

Misal:

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

0

Bugün aynı soruyu sordum ve burada veya Google'da gördüğüm cevaplardan memnun kalmadım , bu yüzden IP adresim değiştiğinde bana bir Slack bildirimi göndermek için bir PowerShell betiği yazdım .

Bir e-posta almayı tercih ederseniz, Outlook e-postalarını destekleyen farklı bir sürüme bakmak için komut dosyasındaki bağlantıları tıklayabilirsiniz.

Umarım bu birine yardımcı olur ve oy alır. :-)

Aşağıdaki metni bir .ps1 dosyasına kaydedin. Kendi Slack webhook URL'nizle uygun şekilde düzenleyin. Kayıt etmek. "PowerShell ile Çalıştır" dosyasına sağ tıklayın.

Veya günlük olarak veya sık sık çalışacak şekilde planlayabilirsiniz.

#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

Görev Zamanlayıcı'nın çalışmasını sağlamak için:

PowerShell'i yönetici olarak çalıştırmam ve daha sonra çalıştırmam gerekiyordu Get-ExecutionPolicy, bu da bana şu anki ExecutionPolicy'nin "Kısıtlı" olduğunu söyledi.

Sonra koştum Set-ExecutionPolicy RemoteSigned(burada gösterildiği gibi, ama beni sinirlendiriyor: https://stackoverflow.com/a/26955050/470749 ).

Sonra temel bir Windows komut isteminden, aşağıdaki komutu birkaç kez çalıştırmayı denedim: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(bir kez IP'yi saklamak ve ikinci kez değişip değişmediğini kontrol etmek için).

(Bunu çalışana kadar Görev Zamanlayıcı'yı kullanmaya çalışmayın.)

Sonra C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeprogram -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1olarak ve Argümanlar olarak bir görev planladım .


Harika bir çözüm, ancak maalesef OP CentOS kullandığını belirtti, bu yüzden teknik olarak soruyu cevaplamıyor.
MaQleod

0

PS uygulaması hariç önceki yanıtlar, IP'nin değişip değişmediğini size söylemez. (PowerShell'i sevmek istiyorum. Ryan neden yapmadığımı tanımlamak için iyi bir iş çıkardı: yürütme güvenlik izinleri sıkıntı vericidir).

IP değişmediğinde herhangi bir ek çıkış değişmediği sürece IP'nin ayrıştırılması gerekli değildir. Örneğin, checkip.dyndns.com Geçerli IP Adresi: ddd.ddd.ddd.ddd gibi bir şey döndürür. Bu nedenle, tüm çıktıyı basitçe karşılaştırmak yeterlidir.

Ayrıca curl kullanıyorsanız, -s bayrağını kullanarak ilerlemeyi gizlemek isteyebilirsiniz. Stderr'a yazıldığından, stdout'u kirletmez.

Yani, çıktıyı kaydetmek için curl kullanan basit bir .cmd betiği. Daha sonra FC'yi varsa önceki çıktıyla karşılaştırmak için kullanır. IP değişmediğinde çıkış ikili bir eşleşme olması gerektiğinden, Unicode, büyük / küçük harf duyarlılığı vb. İçin FC seçeneklerini ayarlamam gerekmez. Unix'te FC yerine cmp vardır.

@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
)

Açıkça CurrentIp.txt LastIp.txt, örneğin "% TMP% \" ile önek olarak değiştirilebilir Bu komut dosyası, küçük değişiklikler ile Görev Zamanlayıcı'dan çalışmalıdır.


0

OP'ye yanıt olarak: "Genel IP adresimi almanın ve değişip değişmediğini kontrol etmenin basit ve zarif bir yolunu mu kaçırıyorum?"

Gerçekten basit bir cevap yok. Sadece IP'nizi periyodik olarak güncelleyin.

Atık gibi görünüyor, ancak "daha akıllı" çözümler CPU, bant genişliği vb. Tasarruf etmeden daha karmaşık ve daha az güvenilirdir. Saatte 1500 bayt veya daha az (paket) göndermek çok ucuzdur. Tüm yıl Netflix'te 365 * 24 * 1.500 = 13 Meg Bayt veya yaklaşık 3 dakika Rifleman tüketecektir.

Harici ip'inizi almanın ve zaman zaman yeni ipinizi göndermenin CPU / bant genişliği maliyeti büyük olasılıkla ipinizi düzenli olarak göndermekten daha yüksektir. Ben sorunsuz bir şekilde yıllardır her saat duckdns benim ip gönderme. Açıkçası bu 1 / saniyeyi yapmaya başlarsanız alan adı hizmetiniz bunu çözebilir ve rahatsız olabilir. Aynı şekilde ipinizi aramak için kullandığınız herhangi bir hizmet bunu yaparsanız mutlu olmaz.

Son bir düşünce, sorduğunuz soru bahsettiğiniz sorunun bir parçasıdır. Dinamik dns'inizi yenilemek için tetikleyici, alan adınız sunucunuza çözümlenmediğinde olabilir. Ping kullanabilirsiniz, ancak eski ip adresiniz yeniden kullanılırsa, yeni ip kiralama sahibi ping'e iyi yanıt verebilir.

Bunu göz önünde bulundurarak, periyodik olarak sunucunuzdan küçük bir imza / sihirli dosya indirmeyi deneyebilirsiniz. Gerçekten bu, sunucunuzu bulduğunuzu, ana web sayfanızın bile çalışacağını söyleyen herhangi bir statik dosya olabilir, ancak alışılmadık bir isim default.html'den çok daha iyi olurdu.

D / l başarısız olursa, IP'nizi güncelleyin, DNS önbelleğinizi temizleyin ve tekrar deneyin. DNS hizmetinize bağlı olarak güncellemenin geçerli olması birkaç dakika sürebilir. Bu yaklaşım diğer bazı harici IP sitelerine olan güveni ortadan kaldırır ve gerçekten bilmek istediklerinizi test eder: Diğerleri siteme ulaşabilir mi?


0

Size yardımcı olabilecek alternatif bir seçenek olarak, harici IP adresi değişikliklerini izlemek için tasarlanmış bir python betiği yazdım. Linux altında kullanıyorum, ancak python olduğu için uygun Python ortamını kurduktan sonra Windows üzerinde iyi çalışmalıdır. Şu anda "geçerli" harici IP adresini bir dosyaya kaydediyor ve çalıştırıldığında yeni bir IP adresi alıyor ve eski adresle karşılaştırıyor. Bir değişiklik algılanırsa size e-posta gönderecek şekilde tasarlanmıştır.

Bir cronjob (Linux) veya zamanlanmış görev (Windows) olarak çalışmak üzere tasarlanmıştır ve kendi başına bir arka plan arka plan programı olarak çalışmaz.

İşte github deposunun bağlantısı: https://github.com/begleysm/ipwatch

Umarım yardımcı olur!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.