VALUEDOMAINのDynamicDNSを自動で更新する(PowerShell編)

2014年4月25日

ただのコピー記事だけど、自分用メモとして。
やりたいこと
・自宅サーバのIPアドレスが固定じゃないので、変更を検知してDNSレコードを随時更新したい
・自宅サーバはWin32環境(WS2008R2)、DNSサーバはVALUEDOMAINを使用
Win32ならDiCE使えって話だけど、このページのスクリプトを使ってみた。DiCE有料版でサービス使わなくてもログオフ状態で更新できるよ。
POWERSHELL スクリプトで VALUE-DOMAIN の DDNS を更新
http://awoni.net/blog/2009/10/362/

導入方法

(※Windows Server 2008 R2で確認)
まずはこのファイルをローカルのどこかに置いて、14行目までを自由にカスタマイズ。

ddnsupdate.ps1

# ドメイン名
$DOMAIN = "example.com"
# パスワード
$PASS = "password"
# サブドメイン名 すべての場合は*
$HOSTNAME = "targetserver"
# IP アドレスを取得するページのURL
$IP_URL = "http://example.com/getremoteaddress.php"
# Value-Domain のDDNSサーバの登録ページのURL
$DDNS_URL = "http://dyn.value-domain.com/cgi-bin/dyn.fcg?"
# ログファイルを保存するディレクトリ
$DATAPATH = "C:\path\to\"
$IP_FILE = "old_ip.txt"
$LOG = "log.txt"
# ログの出力
function write_log($message)
{
    $now = Get-Date;
    Add-Content ($DATAPATH + $LOG) ($now.ToString("yyyy/MM/dd HH:mm:ss") + " " + $message)
}
# 記録しているIPアドレスの取得
if (Test-Path ($DATAPATH + $IP_FILE))
{
    $old_ip = Get-Content ($DATAPATH + $IP_FILE)
}
else
{
    $old_ip = "0.0.0.0"
}
echo $old_ip
# IPアドレスの取得
$wc = New-Object System.Net.WebClient
try
{
    $new_ip = $wc.DownloadString($IP_URL)
    $wc.Close;
}
catch
{
    write_log("11:IPアドレスが取得できません。")
    try
    {
        $new_ip = $wc.DownloadString($DDNS_URL + "ip")
        $wc.Close;
    }
    catch
    {
        write_log("12:IPアドレスが取得できません。")
        echo "12:IPアドレスが取得できません。"
        return;
    }
}
echo $new_ip
if ($old_ip -eq $new_ip)
{
    write_log("00:IPアドレスの変更がありません")
    echo "00:IPアドレスの変更がありません"
}
else
{
    # アドレスが変更されている場合にVALUE-DOMAINのDDNSサーバーの更新
    $wc = New-Object System.Net.WebClient
    try
    {
        $status = $wc.DownloadString($DDNS_URL + "d=" + $DOMAIN + "&p=" + $PASS + "&h=" + $HOSTNAME)
        echo $status
    }
    catch
    {
        write_log("12:サーバに接続できません。")
    }
    $st = $status.Split("`n")
    if ($st[0] -eq "status=0")
    {
        Set-Content ($DATAPATH + $IP_FILE) $new_ip
        write_log("0:OK IP:" + $new_ip)
    }
    else
    {
        write_log($st[0] + ":" + $st[1])
    }
}

[DOWNLOAD]
(※ダウンロード後に拡張子をtxtからps1に変更して下さい)
設定について少し解説。

# ドメイン名
$DOMAIN = "example.com"
# パスワード
$PASS = "password"
# サブドメイン名 すべての場合は*
$HOSTNAME = "targetserver"

これらはVALUEDOMAINで使っているものを入力。

# IP アドレスを取得するページのURL
$IP_URL = "http://example.com/getremoteaddress.php"

IP_URLはリモートアドレスを取得できるURLを入力。
巷にはいくつかあるが、ひとまず自前で用意。

getremoteaddress.php


3行だけ。このgetremoteaddress.phpを任意のリモートサーバに置く。アクセス可能な場所なら自宅サーバでなくても良い。別にリモートホスト取得できてHTTPで返却さえできればPHPでなくても良い。

# ログファイルを保存するディレクトリ
$DATAPATH = "C:\path\to\"
$IP_FILE = "old_ip.txt"
$LOG = "log.txt"

このあたりはローカルの問題なのでお好みで。
設定完了したら右クリック→「PowerShellで実行」してみて動くかどうか確認。たぶん初期状態だと署名を求められて動かない。
そんな時は管理者権限でWindows PowerShellを実行して、以下コマンドを実行。

> Set-ExecutionPolicy Unrestricted

powershell1
やばげなメッセージが出るので、セキュリティリスクを受け入れてもいい人は「Y」を入力。自己責任でやっちゃえない人は回れ右しましょう。
再度実行してみて、ps1ファイルと同じディレクトリにログファイル(log.txt)とIPアドレスメモ(old_ip.txt)が置かれたらちゃんと動いた証。実行時刻と「0:OK」が記録されていれば更新成功。
あとはタスクスケジューラにでも登録して、バックグラウンド更新させましょう。
powershell2
実行するスクリプトは「C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe」で、引数として「-c C:\path\to\ddnsupdate.ps1」などとフルパスでファイル名を指定してやればOK。

参考

POWERSHELL スクリプトで VALUE-DOMAIN の DDNS を更新 – Webアプリ作成日記
WSH/サンプル/DDNS更新スクリプト – jomura.net

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です