動的IP変更を確認する最も簡単な方法


12

IPアドレスが変更された場合、スクリプトを使用して最も簡単に見つける方法は何ですか。


背景情報:

標準の家庭用ケーブルモデム接続があり、ISPから動的IPが割り当てられています。それは時々変わり、DHCPリース時間は不規則に見えます。

基本的に、私は自分の動的DNS処理を行っており、ホームサーバーを指すDNSレコードをワンクリックで更新できます。残っている唯一のことは、IPの変更を検出して、プロセスを完全に自動化できるようにすることです。

今ここにあなたのIPアドレスを返すことができるいくつかのウェブサイトがあります、そして私wgetはこれらのページの1つとgrepそこからのIPアドレスにcronジョブを使うことができました...接吻。

パブリックIPを取得して変更されているかどうかを確認するためのシンプルでエレガントな方法が不足していますか?

追加情報:私のモデム/ルーターは安価なレンガであり、その点で非常に興味深いことは何もしません。私のサーバーはCentos 6で動作します。

回答:


5

あなたがNATの背後にいると仮定すると、私が考えることができる最もエレガントな方法は、ルーター自体でcronジョブを実行し、ifconfig現在のWANアドレスを定期的にチェックすることです。これは、カスタムファームウェアをインストールできる場合は、「安価なブリック」でも可能です。エレガントですが、シンプルではありません。

ここで説明したように、Windowsでは、引数はCentosにも同様に有効です。NATの背後からWAN IPをポーリングすると、技術的に外部アドレスがないという問題が発生します。代わりに、ルーターの裁量で1つを経由してルーティングされます。もちろん、ルーターがあなたの管理下にある限り、この情報にアクセスできますが、このIPアドレスをローカルネットワーク上のホストに通信する普遍的な方法はありません。その結果、サーバーはルーターに、使用する外部IPを要求することはできません。

最も効率的な方法は、ルーターに魔法をかけて実際に外部サーバーに接続させ、要求の発信元のアドレスを返すように要求することです。この目的のために多くのウェブサーバーが設定されています。スクリプトについては、http://icanhazip.com/をお勧めします。これは、ユーザー側でさらに解析する必要がないためです(IPのみがプレーンテキストで返されます)。

必要に応じて、以前にリンクされた質問への回答は、実装に関する多くのヒントを提供するはずです。


良いアイデアとリンク。+1、私が知らなかったicanhazip Webサイトのみの場合、追加のHTMLのダウンロードと解析が不要になります。
Silver Quettier 2013年

1
または、checkip.net-me.net / plain
Alex


6

このタスクのIPを表示する任意のWebサイトをクエリできます。それがtext.onlyであるため、checkip.dyndns.comを使用します。

例:

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

0

今日も同じ質問があり、ここやGoogleでの回答に満足できなかったため、IPアドレスが変更されるたびにSlack通知を送信する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

タスクスケジューラを機能させるには:

管理者として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 2017

0

PSの実装を除くこれまでの回答では、IPが変更されたかどうかを実際に教えてはなりません。(PowerShellが大好きです。Ryanは、なぜ私がそうしないのかを明確にするために優れた仕事をしました。実行セキュリティ権限は厄介です)

IPが変更されていないときに追加の出力が変更されない限り、IPの解析は必要ありません。たとえば、checkip.dyndns.comは、Current IP Address:ddd.ddd.ddd.dddのようなものを返します。したがって、出力全体を単純に比較するだけで十分です。

また、curlを使用している場合は、-sフラグを使用して進行状況を非表示にすることができます。stderrに書き込まれるため、stdoutを汚染しません。

だから、これは単純な.cmdスクリプトで、curlを使用して出力を保存します。次に、FCを使用して、前の出力があればそれと比較します。IPが変更されていない場合、出力はバイナリマッチになるはずなので、Unicode、大文字と小文字の区別などのFCオプションを設定する必要はありません。Unixには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年間で365 * 24 * 1,500 = 13メグバイト、またはNetflixのライフルマンの約3分を消費します。

外部IPを取得してときどき新しいIPをポストする場合のCPU /帯域幅コストは、IPを定期的に冗長にポストする場合よりも高い可能性があります。私は何年もの間、1時間ごとに自分のIPをduckdnsに問題なく投稿しています。明らかに、これを1秒ごとに開始すると、ドメインサービスがそれを理解して迷惑になる可能性があります。同様に、あなたがあなたのIPを調べるためにあなたが使うどんなサービスも、あなたがこれをするなら幸せではありません。

最後に、あなたが尋ねる質問はあなたが言及する問題の一部です。動的DNSを更新するトリガーは、ドメイン名がサーバーに解決されない場合に発生する可能性があります。pingを使用することもできますが、古いIPアドレスが再利用された場合、新しいIPリース所有者はpingに応答する可能性があります。

これを念頭に置いて、サーバーから小さな署名/マジックファイルを定期的にダウンロードしようとすることができます。実際、これは、サーバーが見つかったことを通知する静的ファイルである可能性があり、ホームWebページでも機能しますが、珍しい名前の方がdefault.htmlよりもはるかに優れています。

d / lが失敗した場合は、IPを更新し、DNSキャッシュをクリアして、再試行してください。DNSサービスによっては、更新が有効になるまで数分かかる場合があります。このアプローチにより、他の外部IPサイトへの依存がなくなり、実際に知りたいことをテストできます。


0

役立つ可能性のある代替オプションとして、外部IPアドレスの変更を監視するように設計されたpythonスクリプトを作成しました。私はLinuxの下でそれを使用しますが、それはpythonであるため、適切なPython環境をセットアップした後、Windows上で問題なく動作するはずです。現在、「現在の」外部IPアドレスをファイルに保存し、実行時に新しいIPアドレスを取得して、古いIPアドレスと照合します。変更が検出された場合にメールで通知するように設計されています。

これは、cronjob(Linux)またはスケジュールされたタスク(Windows)として実行するように設計されており、それ自体ではバックグラウンドデーモンとして実行されません。

これはgithubリポジトリへのリンクです:https : //github.com/begleysm/ipwatch

うまくいけば、それが役立ちます!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.