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

2014-04-25 18:05 | 技術 | VALUEDOMAINのDynamicDNSを自動で更新する(PowerShell編) はコメントを受け付けていません。

ただのコピー記事だけど、自分用メモとして。

やりたいこと
・自宅サーバの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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# ドメイン名
$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に変更して下さい)

設定について少し解説。

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

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

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

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

getremoteaddress.php

<?php
    echo getenv("REMOTE_ADDR");
?>

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

11
12
13
14
# ログファイルを保存するディレクトリ
$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



Comments are closed.

  • このページについて

    yagitchの日本語練習帳です。本のレビューとか技術的なメモとか。詳細≫
  • 過去の記事