วิธีที่ง่ายที่สุดในการตรวจสอบการเปลี่ยนแปลง IP แบบไดนามิก


12

อะไรจะเป็นวิธีที่ง่ายที่สุดในการค้นหาด้วยสคริปต์หากที่อยู่ IP ของฉันเปลี่ยนไป


ข้อมูลความเป็นมา:

ฉันมีการเชื่อมต่อเคเบิลโมเด็มที่บ้านมาตรฐานและ ISP ของฉันกำหนด IP แบบไดนามิกให้ฉัน มันเปลี่ยนแปลงไปเรื่อย ๆ เวลาการเช่า DHCP ดูเหมือนจะผิดปกติ

โดยพื้นฐานแล้วฉันกำลังทำสิ่ง DNS แบบไดนามิกของตัวเองและสามารถอัปเดตระเบียน DNS ที่ชี้ไปยังเซิร์ฟเวอร์ภายในบ้านได้ด้วยการคลิก สิ่งเดียวที่เหลือคือการตรวจจับการเปลี่ยนแปลง IP เพื่อให้ฉันสามารถดำเนินการอัตโนมัติ

ขณะนี้มีเว็บไซต์หลายแห่งที่สามารถส่งคืนที่อยู่ IP ของคุณและฉันสามารถใช้งาน cron กับwgetหนึ่งในหน้าเหล่านี้และgrepที่อยู่ IP จากมัน ... แต่ดูเหมือน overkill ในแง่ของการใช้งาน CPU / แบนด์วิดท์และไม่มาก จูบ.

ฉันขาดวิธีที่ง่ายและสง่างามในการดึงข้อมูล IP สาธารณะของฉันและตรวจสอบว่ามีการเปลี่ยนแปลงหรือไม่

ข้อมูลเพิ่มเติม: โมเด็ม / เราเตอร์ของฉันเป็นอิฐราคาถูกมันไม่มีอะไรน่าสนใจในเรื่องนี้ เซิร์ฟเวอร์ของฉันทำงานด้วย Centos 6

คำตอบ:


6

สมมติว่าคุณอยู่หลัง NAT วิธีที่ดีที่สุดที่ฉันนึกได้ก็คือทำงาน cron บนเราเตอร์เองตรวจสอบifconfigเกินไปตรวจสอบที่อยู่ WAN ปัจจุบันของมัน สิ่งนี้อาจเป็นไปได้ใน 'อิฐราคาถูก' หากคุณสามารถติดตั้งเฟิร์มแวร์ที่กำหนดเองได้ อย่างไรก็ตามหรูหราเรียบง่ายแทบจะไม่

ดังที่กล่าวไว้ที่นี่บน Windows แต่อาร์กิวเมนต์มีความถูกต้องเท่ากันกับ Centos ในการสำรวจ WAN IP จากด้านหลัง NAT คุณพบปัญหาที่คุณไม่มีที่อยู่ทางเทคนิค แต่คุณจะถูกส่งผ่านไปตามดุลยพินิจของเราเตอร์ เห็นได้ชัดว่าคุณยังคงสามารถเข้าถึงข้อมูลนี้ได้ตราบใดที่เราเตอร์อยู่ภายใต้การควบคุมของคุณ แต่ไม่มีวิธีสากลในการสื่อสารที่อยู่ IP นี้ไปยังโฮสต์บนเครือข่ายท้องถิ่น เป็นผลให้เซิร์ฟเวอร์ของคุณไม่สามารถถามเราเตอร์สำหรับ IP ภายนอกที่จะใช้งานได้

ทางเลือกที่มีประสิทธิภาพที่สุดคือการปล่อยให้เราเตอร์ทำเวทมนตร์และทำการเชื่อมต่อกับเซิร์ฟเวอร์ภายนอกจากนั้นขอให้ส่งคืนที่อยู่ที่ร้องขอมา มีการตั้งค่าเว็บเซิร์ฟเวอร์จำนวนมากโดยเฉพาะสำหรับวัตถุประสงค์นี้ สำหรับการเขียนสคริปต์ฉันสามารถแนะนำhttp://icanhazip.com/เนื่องจากไม่จำเป็นต้องแยกวิเคราะห์ส่วนของคุณเพิ่มเติม (เฉพาะ IP ที่ส่งคืนเป็นข้อความธรรมดา)

หากจำเป็นคำตอบของคำถามที่เชื่อมโยงก่อนควรให้คำแนะนำมากมายเกี่ยวกับการใช้งาน


ความคิดและลิงค์ที่ดี +1 หากเฉพาะสำหรับเว็บไซต์ icanhazip ที่ฉันไม่รู้จักและทำให้การดาวน์โหลด HTML พิเศษและการแยกวิเคราะห์ไม่จำเป็น
Silver Quettier

1
หรือ checkip.net-me.net/plain
Alex

2
นอกจากนี้ifconfig.me/ipและwtfismyip.com/text
Dmitry Fedorkov

6

คุณสามารถสืบค้นเว็บไซต์ใด ๆ ที่แสดง IP ของคุณสำหรับงานนี้ ใช้checkip.dyndns.comเพราะมัน text.only

ตัวอย่าง:

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

0

ฉันมีคำถามเดียวกันนี้ในวันนี้และผมก็ไม่พอใจกับคำตอบที่ผมเห็นที่นี่หรือที่ Google ดังนั้นผมเขียนสคริปต์ PowerShell เพื่อส่งการแจ้งเตือนหย่อนเมื่อใดก็ตามที่การเปลี่ยนแปลงที่อยู่

หากคุณต้องการรับอีเมลคุณสามารถคลิกลิงก์ในสคริปต์เพื่อดูเวอร์ชันอื่นที่รองรับอีเมล Outlook

ฉันหวังว่านี่จะช่วยให้ใครบางคนและได้รับคะแนน :-)

บันทึกข้อความต่อไปนี้เป็นไฟล์. ps1 แก้ไขตามความเหมาะสมด้วย Slack webhook URL ของคุณ บันทึก คลิกขวาที่ไฟล์เพื่อ "เรียกใช้ด้วย PowerShell"

หรือคุณสามารถกำหนดให้มันรันทุกวันหรือบ่อยครั้งก็ได้

#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

ในการทำให้ Task Scheduler ทำงาน:

ฉันต้องเรียกใช้ PowerShell ในฐานะผู้ดูแลระบบแล้วจึงเรียกใช้Get-ExecutionPolicyซึ่งบอกฉันว่า ExecutionPolicy ปัจจุบันของฉันคือ "ถูก จำกัด "

จากนั้นฉันก็วิ่งSet-ExecutionPolicy RemoteSigned(ดังที่นี่ แต่มันทำให้ฉันกังวล: https://stackoverflow.com/a/26955050/470749 )

จากพรอมต์คำสั่งพื้นฐานของ Windows ฉันลองใช้คำสั่งต่อไปนี้สองครั้ง: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(หนึ่งครั้งเพื่อเก็บ IP และครั้งที่สองเพื่อตรวจสอบว่ามีการเปลี่ยนแปลงหรือไม่)

(จนกว่าคุณจะใช้งานได้อย่าพยายามใช้ Task Scheduler)

จากนั้นฉันจัดตารางงานด้วยC:\Windows\System32\WindowsPowerShell\v1.0\powershell.exeโปรแกรมและ-ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1อาร์กิวเมนต์


มันเป็นทางออกที่ยอดเยี่ยม แต่น่าเสียดายที่ OP ระบุว่าเขาใช้ CentOS ดังนั้นเทคนิคนี้ไม่ตอบคำถาม
MaQleod

0

คำตอบก่อนหน้านี้ไม่รวมการใช้ PS อย่าบอกคุณว่า IP มีการเปลี่ยนแปลงจริงหรือไม่ (ฉันต้องการที่จะรัก PowerShell ไรอันทำงานได้ดีในการระบุว่าทำไมฉันถึงไม่ทำ

การแยก IP ไม่จำเป็นตราบใดที่เอาต์พุตเพิ่มเติมไม่เปลี่ยนแปลงเมื่อ IP นั้นไม่เปลี่ยนแปลง ตัวอย่างเช่น checkip.dyndns.com ส่งคืนบางสิ่งเช่นที่อยู่ IP ปัจจุบัน: ddd.ddd.ddd.ddd ดังนั้นจึงเพียงพอที่จะเปรียบเทียบผลลัพธ์ทั้งหมด

นอกจากนี้หากคุณใช้ curl คุณอาจต้องการซ่อนความคืบหน้าโดยใช้แฟล็ก -s เนื่องจากถูกเขียนไปยัง stderr จึงไม่สร้างมลพิษ stdout

ดังนั้นนี่คือสคริปต์. cmd อย่างง่ายซึ่งใช้ curl เพื่อบันทึกผลลัพธ์ จากนั้นใช้ FC เพื่อเปรียบเทียบกับเอาต์พุตก่อนหน้าหากมี ฉันไม่จำเป็นต้องตั้งค่าตัวเลือก FC สำหรับ Unicode ความไวตัวพิมพ์เล็กและตัวอื่นเนื่องจากการส่งออกควรเป็นแบบไบนารี่แมตช์เมื่อ IP ไม่มีการเปลี่ยนแปลง Unix มี cmp แทน 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
)

เห็นได้ชัดว่า CurrentIp.txt LastIp.txt สามารถเปลี่ยนให้เหมาะสมเช่นคำนำหน้าด้วย "% TMP% \" สคริปต์นี้ควรทำงานจาก Task Scheduler โดยมีการเปลี่ยนแปลงเล็กน้อย


0

เพื่อตอบสนองต่อ OP: "ฉันไม่มีวิธีที่ง่ายและสง่างามในการรับ IP สาธารณะของฉันและตรวจสอบว่ามีการเปลี่ยนแปลงหรือไม่"

คำตอบที่ง่ายจริงๆไม่ได้ เพียงแค่อัปเดต IP ของคุณเป็นระยะ

ดูเหมือนว่าสิ้นเปลือง แต่โซลูชันที่ "ฉลาดขึ้น" นั้นซับซ้อนและเชื่อถือได้น้อยกว่าโดยไม่ต้องประหยัด CPU แบนด์วิดท์ ฯลฯ ส่ง 1500 ไบต์หรือน้อยกว่า (แพ็คเก็ต) หนึ่งชั่วโมงต่อชั่วโมงราคาถูกมาก ตลอดทั้งปีจะใช้ 365 * 24 * 1,500 = 13 Meg Bytes หรือ Rifleman บน Netflix ประมาณ 3 นาที

ค่าใช้จ่าย CPU / แบนด์วิดธ์ในการรับไอพีภายนอกของคุณและบางครั้งโพสต์ไอพีใหม่ของคุณมีแนวโน้มสูงกว่าการโพสต์ไอพีซ้ำซ้อนเป็นระยะ ฉันโพสต์ไอพีของฉันไปที่ duckdns ทุก ๆ ชั่วโมงเป็นเวลาหลายปีโดยไม่มีปัญหา เห็นได้ชัดว่าถ้าคุณเริ่มทำ 1 / วินาทีบริการโดเมนของคุณอาจคิดออกและได้รับรำคาญ เช่นเดียวกันกับบริการใด ๆ ที่คุณใช้เพื่อค้นหาไอพีของคุณจะไม่พอใจหากคุณทำเช่นนี้

หนึ่งความคิดสุดท้ายคำถามที่คุณถามเป็นส่วนหนึ่งของปัญหาที่คุณพูดถึง ทริกเกอร์สำหรับการรีเฟรช DNS แบบไดนามิกของคุณอาจเป็นเมื่อชื่อโดเมนของคุณไม่สามารถแก้ไขกับเซิร์ฟเวอร์ของคุณ คุณสามารถใช้ ping ได้ แต่หากที่อยู่ IP เก่าของคุณถูกนำกลับมาใช้ใหม่เจ้าของที่อยู่ IP ใหม่อาจตอบสนองต่อการ ping ได้เป็นอย่างดี

เมื่อคำนึงถึงสิ่งนี้คุณสามารถลองดาวน์โหลดไฟล์ลายเซ็น / เวทย์มนตร์เล็ก ๆ จากเซิร์ฟเวอร์ของคุณเป็นระยะ จริงๆแล้วอาจเป็นไฟล์คงที่ที่บอกคุณว่าคุณพบเซิร์ฟเวอร์ของคุณแม้แต่หน้าแรกของคุณก็ใช้งานได้ แต่ชื่อที่ผิดปกติจะดีกว่า default.html

หาก d / l ล้มเหลวให้อัปเดต IP ของคุณล้างแคช DNS ของคุณแล้วลองอีกครั้ง อาจใช้เวลาสักครู่เพื่อให้การอัปเดตมีประสิทธิภาพขึ้นอยู่กับบริการ DNS ของคุณ วิธีการนี้ช่วยลดการพึ่งพาเว็บไซต์ภายนอกอื่น ๆ และทดสอบสิ่งที่คุณต้องการทราบจริง ๆ : ผู้อื่นสามารถเข้าถึงเว็บไซต์ของฉัน


0

เป็นตัวเลือกอื่นที่อาจช่วยคุณได้ฉันได้เขียนสคริปต์ python ที่ออกแบบมาเพื่อตรวจสอบการเปลี่ยนแปลงที่อยู่ IP ภายนอก ฉันใช้ภายใต้ Linux แต่เนื่องจากเป็นภาษาไพ ธ อนจึงควรทำงานบน Windows ได้ดีหลังจากตั้งค่าสภาพแวดล้อมแบบ Python ที่เหมาะสม ขณะนี้จะบันทึกที่อยู่ IP ภายนอก "ปัจจุบัน" ลงในไฟล์และเมื่อเรียกใช้จะคว้าที่อยู่ IP ใหม่แล้วตรวจสอบกับที่อยู่เดิม มันถูกออกแบบมาเพื่อส่งอีเมลถึงคุณด้วยหากตรวจพบการเปลี่ยนแปลง

มันถูกออกแบบมาให้ทำงานเป็น cronjob (Linux) หรืองานที่กำหนดเวลาไว้ (Windows) และไม่ทำงานเป็น daemon พื้นหลังด้วยตัวเอง

นี่คือลิงค์ไปยังที่เก็บ github: https://github.com/begleysm/ipwatch

หวังว่ามันจะช่วยได้!


-2

ฉันใช้curl ifconfig.meแต่ไม่ใช่สิ่งที่ฉันได้ลองบนแพลตฟอร์มอื่นที่ไม่ใช่ Debian


ฉัน (และคนอื่น ๆ ) พบว่ามันช้าจากบรรทัดคำสั่ง ดูที่ "curl ifconfig.me" ช้าลงอย่างน่าขันจากบรรทัดคำสั่ง # 4 github.com/learn-co-curriculum/fe-how-the-web-works/issues/4
Andrew Dennison
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.