Cách đơn giản nhất để kiểm tra thay đổi IP động


12

Điều gì sẽ là cách dễ nhất để tìm, với một tập lệnh, nếu địa chỉ IP của tôi đã thay đổi?


Thông tin cơ bản:

Tôi có một kết nối modem cáp nhà tiêu chuẩn và ISP của tôi gán cho tôi một IP động. Nó thay đổi mọi lúc, thời gian thuê DHCP dường như không đều.

Về cơ bản, tôi đang thực hiện điều DNS động của riêng mình và có thể cập nhật các bản ghi DNS trỏ đến máy chủ nhà của tôi bằng một cú nhấp chuột. Điều duy nhất còn lại là phát hiện thay đổi IP để tôi hoàn toàn có thể tự động hóa quy trình.

Bây giờ có một số trang web ở đây có thể trả về địa chỉ IP của bạn và tôi có thể sử dụng công việc định kỳ cho wgetmột trong những trang này và grepđịa chỉ IP từ đó ... Nhưng có vẻ như quá mức về việc sử dụng CPU / băng thông, và nó không được lắm HÔN.

Tôi có thiếu một số cách đơn giản và thanh lịch để lấy IP công cộng của mình không và kiểm tra xem nó có thay đổi không?

Thông tin thêm: modem / bộ định tuyến của tôi là một cục gạch giá rẻ, nó không có gì rất thú vị trong vấn đề đó. Máy chủ của tôi chạy với Centos 6.

Câu trả lời:


5

Giả sử bạn đứng sau NAT, cách thanh lịch nhất mà tôi có thể nghĩ đến là chạy một công việc định kỳ trên chính bộ định tuyến, kiểm tra định kỳ ifconfigquá kiểm tra địa chỉ mạng hiện tại của nó. Điều này thậm chí có thể có trên 'cục gạch giá rẻ' nếu bạn có thể cài đặt phần sụn tùy chỉnh. Tuy nhiên thanh lịch, khó đơn giản.

Như đã thảo luận ở đây , trên Windows, nhưng đối số có giá trị như nhau đối với Centos, khi bỏ phiếu IP IP từ phía sau NAT, bạn gặp phải vấn đề về mặt kỹ thuật là bạn không có địa chỉ bên ngoài. Thay vào đó, bạn được chuyển qua một cái theo ý của bộ định tuyến. Rõ ràng, bạn vẫn sẽ có quyền truy cập vào thông tin này miễn là bộ định tuyến nằm dưới sự kiểm soát của bạn, nhưng không có cách phổ biến nào để truyền thông tin địa chỉ IP này đến các máy chủ trên mạng cục bộ. Do đó, máy chủ của bạn không thể yêu cầu bộ định tuyến cho IP bên ngoài mà nó sẽ sử dụng.

Cách thay thế hiệu quả nhất là chỉ để cho bộ định tuyến thực hiện phép thuật của mình và thực sự tạo kết nối với máy chủ bên ngoài, sau đó yêu cầu nó trả lại địa chỉ mà yêu cầu bắt nguồn từ đó. Rất nhiều máy chủ web đã được thiết lập riêng cho mục đích này. Đối với kịch bản, tôi có thể đề xuất http://icanhazip.com/ , vì nó không yêu cầu phân tích thêm về phần của bạn (chỉ IP được trả về trong văn bản thuần túy).

Nếu cần thiết, các câu trả lời cho câu hỏi được liên kết trước đó phải cung cấp nhiều mẹo để thực hiện.


Ý tưởng tốt và liên kết. +1, nếu chỉ cho trang web icanhazip mà tôi không biết và làm cho việc tải xuống thêm HTML và phân tích cú pháp không cần thiết.
Quettier bạc

1
Hoặc checkip.net-me.net/plain
Alex


6

Bạn có thể truy vấn bất kỳ trang web nào hiển thị IP của bạn cho nhiệm vụ này. Sử dụng checkip.dyndns.com , vì nó text.only.

Thí dụ:

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

0

Tôi đã có cùng một câu hỏi ngày hôm nay và tôi không hài lòng với câu trả lời tôi thấy ở đây hoặc trên Google, vì vậy tôi đã viết một tập lệnh PowerShell để gửi cho tôi thông báo Slack mỗi khi địa chỉ IP của tôi thay đổi .

Nếu bạn muốn nhận email, bạn có thể nhấp vào các liên kết trong tập lệnh để xem phiên bản khác hỗ trợ email Outlook.

Tôi hy vọng điều này sẽ giúp ai đó và kiếm được một phiếu bầu. :-)

Lưu văn bản sau vào tệp .ps1. Chỉnh sửa nó cho phù hợp với URL webhook Slack của riêng bạn. Tiết kiệm. Nhấp chuột phải vào tệp để "Chạy với PowerShell".

Hoặc bạn có thể lên lịch để chạy hàng ngày hoặc tuy nhiên thường xuyên.

#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

Để làm cho Trình lập lịch tác vụ hoạt động:

Tôi đã phải chạy PowerShell với tư cách quản trị viên và sau đó chạy Get-ExecutionPolicy, sau đó nói với tôi rằng ExecutPolicy hiện tại của tôi là "Bị hạn chế".

Sau đó, tôi chạy Set-ExecutionPolicy RemoteSigned(như được hiển thị ở đây, nhưng nó làm tôi lo lắng: https://stackoverflow.com/a/26955050/470749 ).

Sau đó, từ một dấu nhắc lệnh cơ bản của Windows, tôi đã thử chạy lệnh sau một vài lần: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -File "C:\code\IP_change_detection_notification.ps1"(một lần để lưu trữ IP và lần thứ hai để kiểm tra xem nó có thay đổi không).

(Cho đến khi bạn làm việc đó, đừng bận tâm đến việc sử dụng Trình lập lịch tác vụ.)

Sau đó, tôi đã lên lịch một nhiệm vụ với C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exetư cách là chương trình và -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1là Đối số.


Đây là một giải pháp tuyệt vời, nhưng thật không may, OP lưu ý rằng anh ta đang sử dụng CentOS, vì vậy về mặt kỹ thuật này không trả lời được câu hỏi.
MaQleod

0

Các câu trả lời trước không bao gồm triển khai PS, không thực sự cho bạn biết nếu IP đã thay đổi. (Tôi muốn yêu PowerShell. Ryan đã làm rất tốt việc xác định lý do tại sao tôi không: quyền bảo mật thực thi là phiền toái).

Phân tích IP là không cần thiết miễn là bất kỳ đầu ra bổ sung nào không thay đổi khi IP không thay đổi. Ví dụ: checkip.dyndns.com trả về một cái gì đó giống như Địa chỉ IP hiện tại: ddd.ddd.ddd.ddd. Do đó, chỉ cần so sánh toàn bộ đầu ra là đủ.

Ngoài ra nếu bạn đang sử dụng curl, bạn có thể muốn ẩn tiến trình sử dụng cờ -s. Vì nó được viết cho thiết bị lỗi chuẩn, nó không gây ô nhiễm thiết bị xuất chuẩn.

Vì vậy, đây là một tập lệnh .cmd đơn giản, sử dụng curl để lưu kết quả đầu ra. Sau đó, nó sử dụng FC để so sánh nó với đầu ra trước đó, nếu có. Tôi không cần đặt tùy chọn FC cho Unicode, phân biệt chữ hoa chữ thường, v.v., vì đầu ra phải là khớp nhị phân, khi IP không thay đổi. Unix có cmp thay vì 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
)

Rõ ràng CurrentIp.txt LastIp.txt có thể được thay đổi cho phù hợp, ví dụ tiền tố với "% TMP% \" Tập lệnh này sẽ hoạt động từ Trình lập lịch tác vụ, với những thay đổi nhỏ.


0

Trả lời OP: "Tôi có thiếu một số cách đơn giản và thanh lịch để lấy IP công cộng của mình không và kiểm tra xem nó có thay đổi không?"

Một câu trả lời thực sự đơn giản là không. Chỉ cần định kỳ cập nhật IP của bạn.

Có vẻ lãng phí, nhưng các giải pháp "thông minh hơn" chỉ phức tạp hơn và kém tin cậy hơn, không tiết kiệm CPU, băng thông, v.v. Gửi 1500 byte hoặc ít hơn (một gói) mỗi giờ một lần là rất rẻ. Cả năm sẽ tiêu tốn 365 * 24 * 1.500 = 13 Meg Byte hoặc khoảng 3 phút của Súng trường trên Netflix.

Chi phí CPU / băng thông để nhận ip bên ngoài của bạn và đôi khi đăng ip mới của bạn, rất có thể cao hơn so với việc chỉ đăng dự phòng ip của bạn theo định kỳ. Tôi đã đăng ip của tôi lên duckdns mỗi giờ trong nhiều năm, mà không có vấn đề gì. Rõ ràng nếu bạn bắt đầu thực hiện điều này 1 / giây, dịch vụ tên miền của bạn có thể phát hiện ra và gây khó chịu. Tương tự như vậy, bất kỳ dịch vụ nào bạn sử dụng để tra cứu ip của bạn sẽ không hài lòng nếu bạn làm điều này.

Một suy nghĩ cuối cùng, câu hỏi bạn đặt ra là một phần của vấn đề mà bạn đề cập. Kích hoạt để làm mới dns động của bạn có thể là khi tên miền của bạn không giải quyết với máy chủ của bạn. Bạn có thể sử dụng ping, nhưng nếu địa chỉ IP cũ của bạn được sử dụng lại, chủ sở hữu thuê ip mới có thể đáp ứng tốt với ping.

Với suy nghĩ này, bạn có thể định kỳ tải xuống một tệp chữ ký / ma thuật nhỏ từ máy chủ của mình. Thực sự đây có thể là bất kỳ tệp tĩnh nào cho bạn biết rằng bạn đã tìm thấy máy chủ của mình, thậm chí trang web của bạn sẽ hoạt động, nhưng một tên khác thường sẽ tốt hơn default.html.

Nếu d / l không thành công, thì hãy cập nhật IP của bạn, xóa bộ đệm DNS của bạn và thử lại. Có thể mất vài phút để cập nhật có hiệu lực, tùy thuộc vào dịch vụ DNS của bạn. Cách tiếp cận này loại bỏ sự phụ thuộc vào một số trang web ip bên ngoài khác và thực sự kiểm tra những gì bạn thực sự muốn biết: Những người khác có thể truy cập trang web của tôi không?


0

Là một tùy chọn thay thế có thể giúp bạn, tôi đã viết một tập lệnh python được thiết kế để theo dõi các thay đổi địa chỉ IP bên ngoài. Tôi sử dụng nó trong Linux nhưng vì nó là python nên nó hoạt động tốt trên Windows sau khi thiết lập môi trường Python thích hợp. Hiện tại nó lưu địa chỉ IP bên ngoài "hiện tại" vào một tệp và khi chạy, lấy địa chỉ IP mới và sau đó kiểm tra địa chỉ IP cũ. Nó được thiết kế để gửi email cho bạn nếu phát hiện thay đổi.

Nó được thiết kế để chạy dưới dạng cronjob (Linux) hoặc tác vụ theo lịch trình (Windows) và không tự chạy dưới dạng trình nền.

Đây là liên kết đến kho lưu trữ github: https://github.com/begleym/ipwatch

Hy vọng nó sẽ giúp!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.