동적 IP 변경을 확인하는 가장 간단한 방법


12

IP 주소가 변경된 경우 스크립트를 사용하여 가장 쉽게 찾을 수있는 방법은 무엇입니까?


배경 정보 :

표준 홈 케이블 모뎀 연결이 있고 ISP에서 동적 IP를 할당합니다. 매번 바뀌면 DHCP 임대 시간이 불규칙 해 보입니다.

기본적으로 동적 DNS 작업을 수행하고 있으며 클릭 한 번으로 홈 서버를 가리키는 DNS 레코드를 업데이트 할 수 있습니다. 남은 것은 IP 변경을 감지하여 프로세스를 완전히 자동화하는 것입니다.

이제 여기에 귀하의 IP 주소를 반환 할 수있는 여러 웹 사이트가 있으며이 wget페이지 중 하나에 cron 작업을 사용 grep하고 IP 주소를 사용할 수 있습니다 ... 그러나 CPU / 대역폭 사용량 측면에서 과도하게 보입니다. 키스.

공개 IP를 검색하고 변경되었는지 확인하는 간단하고 우아한 방법이 누락 되었습니까?

추가 정보 : 내 모뎀 / 라우터는 값싼 벽돌이므로 그 점에서 매우 흥미로운 것은 없습니다. 내 서버는 Centos 6에서 실행됩니다.

답변:


6

NAT 뒤에 있다고 가정하면 가장 우아한 방법은 라우터 자체에서 cron 작업을 실행하여 주기적으로 ifconfig현재 WAN 주소를 확인하는 것입니다. 맞춤 펌웨어를 설치할 수있는 경우 '저렴한 브릭'에서도 가능할 수 있습니다. 그러나 우아하고 거의 단순하지 않습니다.

여기 에서 설명했듯이 Windows에서는 인수가 Centos에 동일하게 유효합니다. NAT 뒤에서 WAN IP를 폴링 할 때 기술적으로 외부 주소가 없다는 문제가 발생합니다. 대신 라우터의 재량에 따라 하나를 통해 라우팅됩니다. 라우터가 제어 할 수있는 한이 정보에 계속 액세스 할 수 있지만이 IP 주소를 로컬 네트워크의 호스트와 통신하는 일반적인 방법은 없습니다. 결과적으로 서버는 라우터가 사용할 외부 IP를 라우터에 간단히 요청할 수 없습니다.

가장 효율적인 대안은 라우터가 마법을 수행하고 실제로 외부 서버에 연결 한 다음 요청이 시작된 주소를 반환하도록 요청하는 것입니다. 이 목적을 위해 많은 웹 서버가 특별히 설정되었습니다. 스크립팅의 경우 http://icanhazip.com/ 을 추천 할 수 있습니다. 추가 구문 분석이 필요하지 않으므로 IP 만 일반 텍스트로 반환됩니다.

필요한 경우 이전에 연결된 질문에 대한 답변은 구현에 대한 많은 팁을 제공해야합니다.


좋은 아이디어와 링크. +1, 내가 모르는 icanhazip 웹 사이트에만 해당되며 추가 HTML을 다운로드하고 구문 분석 할 필요가 없습니다.
Silver Quettier

1
또는 checkip.net-me.net/plain
Alex


6

이 작업에 대한 IP를 표시하는 웹 사이트를 쿼리 할 수 ​​있습니다. 사용 checkip.dyndns.com를 그것은 그 이후 text.only.

예:

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

0

오늘도 같은 질문이 있었고 여기 또는 Google에서 본 답변에 만족하지 못했기 때문에 IP 주소가 변경 될 때마다 Slack 알림을 보내도록 PowerShell 스크립트를 작성했습니다 .

전자 메일을 받으려면 스크립트의 링크를 클릭하여 Outlook 전자 메일을 지원하는 다른 버전을 볼 수 있습니다.

나는 이것이 누군가를 돕고 투표하기를 바랍니다. :-)

다음 텍스트를 .ps1 파일에 저장하십시오. 자신의 Slack 웹 후크 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

작업 스케줄러를 작동 시키려면 :

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를 저장하고 두 번째로 변경 여부를 확인했습니다.

(작업이 완료 될 때까지 작업 스케줄러를 사용하려고하지 마십시오.)

그런 다음 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe프로그램과 -ExecutionPolicy ByPass -File C:\code\IP_change_detection_notification.ps1인수로 작업을 예약했습니다 .


훌륭한 솔루션이지만 불행히도 OP는 CentOS를 사용하고 있다고 지적 했으므로 기술적으로 질문에 대답하지 않습니다.
MaQleod

0

PS 구현을 제외한 이전 답변은 실제로 IP가 변경되었는지 여부를 알려주지 않습니다. (Python을 좋아하고 싶습니다. Ryan은 왜 그렇지 않은지를 식별하는 데 도움이되었습니다. 실행 보안 권한이 성가신 것입니다).

IP가 변경되지 않은 경우 추가 출력이 변경되지 않는 한 IP 구문 분석은 필요하지 않습니다. 예를 들어 checkip.dyndns.com은 현재 IP 주소 ddd.ddd.ddd.ddd와 같은 것을 반환합니다. 따라서 단순히 전체 출력을 비교하는 것으로 충분합니다.

curl을 사용하는 경우 -s 플래그를 사용하여 진행률을 숨길 수도 있습니다. stderr에 기록되므로 stdout을 오염시키지 않습니다.

따라서 다음은 curl을 사용하여 출력을 저장하는 간단한 .cmd 스크립트입니다. 그런 다음 FC를 사용하여 이전 출력과 비교합니다 (있는 경우). IP가 변경되지 않은 경우 출력이 이진 일치해야하므로 유니 코드, 대 / 소문자 구분 등을 위해 FC 옵션을 설정할 필요가 없습니다. 유닉스에는 FC 대신 cmp가 있습니다.

@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 % \"접두사와 같이 적절하게 변경 될 수 있습니다.이 스크립트는 작업 스케줄러에서 약간만 변경되어 작동합니다.


0

OP에 대한 답변 : "공용 IP를 검색하고 변경되었는지 확인하는 간단하고 우아한 방법이 누락 되었습니까?"

정말 간단한 대답은 아닙니다. IP를 주기적으로 업데이트하십시오.

그것은 낭비적인 것처럼 보이지만 "스마트 한"솔루션은 CPU, 대역폭 등을 절약하지 않고 더 복잡하고 신뢰성이 떨어집니다. 1 시간에 한 번 1500 바이트 이하 (패킷)를 보내는 것이 매우 저렴합니다. 1 년 내내 Netflix에서 365 * 24 * 1,500 = 13 메가 바이트 또는 약 3 분의 Rifleman을 소비합니다.

외부 IP를 가져오고 때때로 새 IP를 게시하는 CPU / 대역폭 비용은 IP를 주기적으로 중복 게시하는 것보다 높습니다. 나는 몇 시간 동안 문제없이 duckdns에 내 IP를 게시했습니다. 분명히 1 / 초를 시작하면 도메인 서비스가 알아 내고 성 가실 수 있습니다. 마찬가지로 IP를 찾는 데 사용하는 서비스는이 작업을 수행해도 행복하지 않습니다.

마지막으로, 당신이 묻는 질문은 당신이 언급 한 문제의 일부입니다. 도메인 이름이 서버로 확인되지 않는 경우 동적 DNS를 새로 고치는 트리거가 될 수 있습니다. ping을 사용할 수 있지만 이전 IP 주소가 재사용되면 새 IP 임대 보유자가 ping에 잘 응답 할 수 있습니다.

이를 염두에두고 서버에서 작은 서명 / 마법 파일을 정기적으로 다운로드 할 수 있습니다. 실제로 이것은 서버를 찾았다는 것을 알려주는 정적 파일 일 수 있으며 홈 웹 페이지조차도 작동하지만 비정상적인 이름은 default.html보다 훨씬 낫습니다.

d / l이 실패하면 IP를 업데이트하고 DNS 캐시를 지우고 다시 시도하십시오. DNS 서비스에 따라 업데이트가 적용 되려면 몇 분 정도 걸릴 수 있습니다. 이 접근 방식은 다른 외부 IP 사이트에 대한 의존도를 제거하고 실제로 실제로 알고 싶은 내용을 테스트합니다. 다른 사람이 내 사이트에 연결할 수 있습니까?


0

도움이 될 수있는 대체 옵션으로 외부 IP 주소 변경을 모니터링하도록 설계된 Python 스크립트를 작성했습니다. 나는 리눅스에서 그것을 사용하지만 파이썬이기 때문에 적절한 파이썬 환경을 설정 한 후에는 Windows에서 잘 작동해야합니다. 현재 "현재"외부 IP 주소를 파일에 저장하고 실행될 때 새 IP 주소를 얻은 다음 이전 IP 주소와 비교하여 확인합니다. 변경이 감지되면 이메일을 보내도록 설계되었습니다.

cronjob (Linux) 또는 예약 된 작업 (Windows)으로 실행되도록 설계되었으며 자체적으로 백그라운드 데몬으로 실행되지 않습니다.

다음은 github 저장소에 대한 링크입니다. https://github.com/begleysm/ipwatch

잘만되면 그것은 도움이된다!


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.