Cara termudah untuk memeriksa perubahan IP dinamis

12

Apa cara termudah untuk menemukan, dengan skrip, jika alamat IP saya telah berubah?


Info latar belakang:

Saya memiliki koneksi modem kabel rumah standar, dan ISP saya memberikan saya IP dinamis. Itu berubah setiap sekarang dan kemudian, waktu sewa DHCP tampaknya tidak teratur.

Pada dasarnya, saya melakukan hal DNS dinamis saya sendiri, dan dapat memperbarui catatan DNS yang menunjuk ke server rumah saya dengan satu klik. Satu-satunya yang tersisa adalah mendeteksi perubahan IP sehingga saya dapat sepenuhnya mengotomatiskan proses.

Sekarang ada beberapa situs web di sini yang dapat mengembalikan alamat IP Anda, dan saya bisa menggunakan pekerjaan cron ke wgetsalah satu halaman ini dan grepalamat IP darinya ... Tapi sepertinya berlebihan dalam hal penggunaan CPU / bandwidth, dan itu tidak terlalu CIUMAN.

Apakah saya kehilangan beberapa cara sederhana dan elegan untuk mengambil IP publik saya dan memeriksa apakah IPnya telah berubah?

Info tambahan: modem / router saya adalah batu bata murah, tidak ada yang sangat menarik dalam hal itu. Server saya berjalan dengan Centos 6.

Quettier Perak
sumber

Jawaban:

5

Dengan asumsi Anda berada di belakang NAT, cara paling elegan yang dapat saya pikirkan adalah menjalankan tugas cron di router itu sendiri, secara berkala memeriksa ifconfigjuga periksa alamat WAN saat ini. Ini bahkan dapat dilakukan pada 'bata murah' jika Anda dapat menginstal firmware khusus. Namun elegan, hampir tidak sederhana.

Seperti yang dibahas di sini , di Windows, tetapi argumennya sama-sama valid untuk Centos, dalam polling IP WAN dari belakang NAT, Anda mengalami masalah yang secara teknis Anda tidak memiliki alamat eksternal. Sebagai gantinya, Anda dialihkan melalui satu sesuai kebijaksanaan perute. Jelas, Anda masih akan memiliki akses ke informasi ini selama router berada di bawah kendali Anda, tetapi tidak ada cara universal untuk mengkomunikasikan alamat IP ini ke host di jaringan lokal. Akibatnya, server Anda tidak bisa hanya meminta router untuk IP eksternal yang akan digunakan.

Alternatif yang paling efisien adalah membiarkan router melakukan keajaibannya dan benar-benar membuat koneksi ke server eksternal, kemudian memintanya untuk mengembalikan alamat asal permintaan. Banyak webserver telah diatur khusus untuk tujuan ini. Untuk scripting, saya dapat merekomendasikan http://icanhazip.com/ , karena tidak memerlukan penguraian lebih lanjut pada bagian Anda (hanya IP yang dikembalikan dalam teks biasa).

Jika perlu, jawaban atas pertanyaan yang dikaitkan sebelumnya harus memberikan banyak tips tentang implementasi.

Marcks Thomas
sumber
Ide dan tautan yang bagus. +1, jika hanya untuk situs web icanhazip yang saya tidak tahu, dan membuat pengunduhan HTML tambahan dan penguraian tidak perlu.
Silver Quettier
1
Atau checkip.net-me.net/plain
Alex
2
Juga ifconfig.me/ip dan wtfismyip.com/text
Dmitry Fedorkov
6

Anda dapat meminta situs web apa pun yang menampilkan IP Anda untuk tugas ini. Menggunakan checkip.dyndns.com , karena itu text.only.

Contoh:

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

Saya memiliki pertanyaan yang sama hari ini, dan saya tidak puas dengan jawaban yang saya lihat di sini atau di Google, jadi saya menulis skrip PowerShell untuk mengirimi saya pemberitahuan Slack setiap kali alamat IP saya berubah .

Jika Anda lebih suka menerima email, Anda bisa mengklik tautan di skrip untuk melihat versi lain yang mendukung email Outlook.

Saya harap ini membantu seseorang dan mendapatkan suara. :-)

Simpan teks berikut ke file .ps1. Edit sesuai dengan URL webhook Slack Anda sendiri. Menyimpan. Klik kanan file untuk "Jalankan dengan PowerShell".

Atau Anda dapat menjadwalkannya untuk berjalan setiap hari atau seberapa sering.

#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

Untuk mengaktifkan Penjadwal Tugas:

Saya harus menjalankan PowerShell sebagai administrator dan kemudian menjalankan Get-ExecutionPolicy, yang kemudian memberi tahu saya bahwa ExecutionPolicy saya saat ini adalah "Dibatasi".

Kemudian saya berlari Set-ExecutionPolicy RemoteSigned(seperti yang ditunjukkan di sini, tetapi itu membuat saya gugup: https://stackoverflow.com/a/26955050/470749 ).

Kemudian dari prompt perintah dasar Windows, saya mencoba menjalankan perintah berikut beberapa kali: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(satu kali untuk menyimpan IP, dan yang kedua kali untuk memeriksa apakah sudah berubah).

(Sampai Anda berhasil, jangan repot-repot mencoba menggunakan Penjadwal Tugas.)

Kemudian saya menjadwalkan tugas dengan C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exesebagai program dan -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1sebagai Argumen.

Ryan
sumber
Ini solusi yang bagus, tetapi sayangnya OP mencatat bahwa ia menggunakan CentOS, jadi ini secara teknis tidak menjawab pertanyaan.
MaQleod
0

Jawaban sebelumnya tidak termasuk implementasi PS, tidak benar-benar memberi tahu Anda jika IP telah berubah. (Saya ingin mencintai PowerShell. Ryan telah melakukan pekerjaan yang baik untuk mengidentifikasi mengapa saya tidak melakukannya: izin keamanan eksekusi adalah gangguan).

Parsing IP tidak perlu selama output tambahan tidak berubah ketika IP tidak berubah. Misalnya checkip.dyndns.com mengembalikan sesuatu seperti Alamat IP Saat Ini: ddd.ddd.ddd.ddd. Dengan demikian cukup untuk hanya membandingkan seluruh output.

Juga jika Anda menggunakan curl, Anda mungkin ingin menyembunyikan progres menggunakan flag -s. Karena ini ditulis untuk stderr, itu tidak mencemari stdout.

Jadi, berikut ini adalah skrip .cmd sederhana, yang menggunakan curl untuk menyimpan hasilnya. Kemudian menggunakan FC untuk membandingkannya dengan output sebelumnya, jika ada. Saya tidak perlu mengatur opsi FC untuk Unicode, sensitivitas huruf, dll., Karena outputnya harus sesuai dengan biner, ketika IP tidak berubah. Unix memiliki cmp, bukan 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
)

Jelas CurrentIp.txt LastIp.txt dapat diubah sesuai, misalnya awalan dengan "% TMP% \" Script ini harus bekerja dari Penjadwal Tugas, dengan perubahan kecil.

Andrew Dennison
sumber
0

Menanggapi OP: "Apakah saya kehilangan beberapa cara sederhana dan elegan untuk mengambil IP publik saya dan memeriksa apakah telah berubah?"

Jawaban yang sangat sederhana adalah jangan. Perbarui IP Anda secara berkala.

Tampaknya boros, tetapi solusi "lebih pintar" hanya lebih kompleks dan kurang dapat diandalkan, tanpa menghemat CPU, bandwidth dll. Mengirim 1500 byte atau kurang (satu paket) satu jam sekali sangat murah. Satu tahun penuh akan mengkonsumsi 365 * 24 * 1.500 = 13 Meg Bytes atau sekitar 3 menit dari Rifleman di Netflix.

Biaya CPU / bandwidth untuk mendapatkan ip eksternal Anda dan kadang-kadang memposting ip baru Anda, kemungkinan besar lebih tinggi daripada hanya memposting secara berlebihan ip Anda secara berkala. Saya telah memposting ip saya ke duckdns setiap jam selama bertahun-tahun, tanpa masalah. Tentunya jika Anda mulai melakukan ini 1 / detik layanan domain Anda mungkin mengetahuinya dan merasa kesal. Demikian juga layanan yang Anda gunakan untuk mencari ip Anda tidak akan senang jika Anda melakukan ini.

Satu pemikiran terakhir, pertanyaan yang Anda ajukan adalah bagian dari masalah yang Anda sebutkan. Pemicu untuk menyegarkan dns dinamis Anda bisa terjadi ketika nama domain Anda tidak menyelesaikan ke server Anda. Anda bisa menggunakan ping, tetapi jika alamat ip lama Anda digunakan kembali, pemegang sewa ip yang baru mungkin merespons ping.

Dengan mengingat hal ini Anda dapat secara berkala mencoba mengunduh file tanda tangan / ajaib kecil dari server Anda. Sungguh ini bisa berupa file statis yang memberitahu Anda bahwa Anda menemukan server Anda, bahkan halaman web rumah Anda akan berfungsi, tetapi nama yang tidak biasa akan jauh lebih baik daripada default.html.

Jika d / l gagal, maka perbarui IP Anda, kosongkan cache DNS Anda dan coba lagi. Mungkin diperlukan beberapa menit agar pembaruan menjadi efektif, tergantung pada layanan DNS Anda. Pendekatan ini menghilangkan ketergantungan pada beberapa situs ip eksternal lainnya, dan sebenarnya menguji apa yang benar-benar ingin Anda ketahui: Dapatkah orang lain mencapai situs saya?

Andrew Dennison
sumber
0

Sebagai opsi alternatif yang mungkin membantu Anda, saya telah menulis skrip python yang dirancang untuk memantau perubahan alamat IP eksternal. Saya menggunakannya di Linux tetapi karena itu python itu harus berfungsi pada Windows setelah mengatur lingkungan Python yang sesuai. Saat ini menyimpan alamat IP eksternal "saat ini" ke sebuah file dan, ketika dijalankan, mengambil alamat IP baru dan kemudian memeriksanya dengan yang lama. Ini dirancang untuk mengirimi Anda email jika ada perubahan yang terdeteksi.

Ini dirancang untuk dijalankan sebagai cronjob (Linux) atau tugas terjadwal (Windows) dan tidak berjalan sebagai daemon latar belakang sendiri.

Berikut tautan ke repositori github: https://github.com/begleysm/ipwatch

Semoga bermanfaat!

begleysm
sumber