料金表Loading...
利用ガイドに戻る

DDNS (動的 DNS)

ToukaCloud の無料動的 DNS サービス — 自宅の IP を固定サブドメインで公開する

1. 概要

DDNS (Dynamic DNS) は、自宅やオフィスのプロバイダから割り当てられた動的 IP アドレスを、 ToukaCloud の固定サブドメインで常に公開するサービスです。 ルーター、NAS、監視カメラなどから自分のドメイン経由でアクセスできるようになります。

  • 無料: ライセンス購入不要、ToukaCloud アカウントがあればすぐ使える
  • 対応ゾーン: *.ddns.max3584.net*.ddns.toukadc.net
  • 対応レコード型: A (IPv4), AAAA (IPv6), CNAME, TXT, SRV
  • 上限: ユーザーあたり最大 5 レコード
  • API 対応: REST API で IP を自動更新可能 (curl, cron, スクリプト対応)
  • Web UI: ToukaCloud ダッシュボードでレコード管理可能

2. 前提条件

  • ToukaCloud アカウントがあること (ログイン不要、メール認証のみ)
  • DDNS UI にアクセスして、サブドメインを作成すること (初回セットアップ)

3. サブドメインを取得する

Web UI からサブドメインを新規作成します。

  1. ToukaCloud にログイン後、サイドバーの DDNS 管理 を開く
  2. 画面右上の 新規レコード作成 をクリック
  3. ドメイン: ddns.max3584.net または ddns.toukadc.net を選択
  4. ドメイン名: 希望するサブドメイン名を入力 (例: myservermyserver.ddns.max3584.net)
  5. レコード型: A (IPv4) または AAAA (IPv6) を選択
  6. TTL: 反映待機時間 (デフォルト 3600 秒 = 1 時間)
  7. レコード値: 現在の IP アドレスを入力
  8. 作成 をクリック

4. API トークンを発行する

curl や cron スクリプトから IP 自動更新を行う場合、API トークンが必要です。 トークンは セッショントークン方式で、ToukaCloud のセッションから自動取得されます。

4.1 セッションからの取得

ToukaCloud にログイン済みの状態で、ブラウザの開発者ツール (F12) を開き、Application タブから Cookiesnext-auth.session-token をコピーします。

または、ToukaCloud の設定画面で API トークンを直接生成します (実装予定)。

4.2 トークンの保存

発行したトークンを安全に保管してください。トークン流出時は、 新しいトークンを発行して古いものを無効化することで対応できます。

5. IP 自動更新 (curl / cron)

IP アドレス変更時に自動で DNS レコードを更新するスクリプト例です。

5.1 現在の IP を取得

# IPv4 取得
CURRENT_IP=$(curl -s https://api.ipify.org)

# IPv6 取得
CURRENT_IPV6=$(curl -s https://api6.ipify.org)

5.2 REST API で更新

POST /api/pdns/[restapi]?action=create エンドポイントで、 A レコードを REPLACE (上書き) します。

curl -X POST http://localhost:3000/api/pdns/create \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <YOUR_SESSION_TOKEN>" \
  -d '{
    "domain": "ddns.max3584.net",
    "rrsets": [
      {
        "name": "myserver.ddns.max3584.net.",
        "type": "A",
        "ttl": 3600,
        "changetype": "REPLACE",
        "records": [
          {
            "content": "203.0.113.42",
            "disabled": false
          }
        ]
      }
    ]
  }'

5.3 bash スクリプト例 (cron 対応)

#!/bin/bash

# 設定
SUBDOMAIN="myserver"
DOMAIN="ddns.max3584.net"
API_URL="http://localhost:3000/api/pdns/create"
SESSION_TOKEN="<YOUR_SESSION_TOKEN>"
LOG_FILE="/var/log/ddns-update.log"

# 現在の IP を取得
CURRENT_IP=$(curl -s https://api.ipify.org)

if [ -z "$CURRENT_IP" ]; then
  echo "[$(date)] Error: Failed to get current IP" >> $LOG_FILE
  exit 1
fi

# 前回の IP を保存したファイルから読み込み
if [ -f "/tmp/last_ddns_ip.txt" ]; then
  LAST_IP=$(cat /tmp/last_ddns_ip.txt)
else
  LAST_IP=""
fi

# IP が変わった場合のみ更新
if [ "$CURRENT_IP" != "$LAST_IP" ]; then
  echo "[$(date)] Updating DNS: $SUBDOMAIN.$DOMAIN -> $CURRENT_IP" >> $LOG_FILE

  RESPONSE=$(curl -s -X POST $API_URL \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $SESSION_TOKEN" \
    -d "{
      "domain": "$DOMAIN",
      "rrsets": [
        {
          "name": "$SUBDOMAIN.$DOMAIN.",
          "type": "A",
          "ttl": 3600,
          "changetype": "REPLACE",
          "records": [
            {
              "content": "$CURRENT_IP",
              "disabled": false
            }
          ]
        }
      ]
    }")

  if echo "$RESPONSE" | grep -q '"success":true'; then
    echo "[$(date)] Update successful" >> $LOG_FILE
    echo "$CURRENT_IP" > /tmp/last_ddns_ip.txt
  else
    echo "[$(date)] Update failed: $RESPONSE" >> $LOG_FILE
  fi
else
  echo "[$(date)] IP unchanged: $CURRENT_IP" >> $LOG_FILE
fi

5.4 cron に登録

5 分ごとに更新を実行する例:

# /etc/cron.d/ddns-update (root ユーザー)
*/5 * * * * /usr/local/bin/ddns-update.sh

# または crontab -e で:
*/5 * * * * /home/user/ddns-update.sh

6. ルーター内蔵 DDNS クライアント

DD-WRT、OpenWrt などのルーター OS や、NAS・監視カメラの DDNS クライアントと連携する場合、 通常のクライアント設定では使用できません。以下の手順で、 汎用 No-IP 互換クライアントなどから IP 更新 API に接続できるようにします。

6.1 対応状況

  • No-IP 互換: dd-wrt, OpenWrt 等の汎用クライアントで利用可能 (実装中)
  • カスタムスクリプト: cURL/wget が使えるデバイスなら上記のシェルスクリプト例を使用可能
  • DDNS サービス一覧: ルーター設定画面でサービス選択時にCustom または No-IP を選択

6.2 ルーター設定例 (DD-WRT)

サービス: Custom
サーバー: api.max3584.net
ユーザー名: <SUBDOMAIN>
パスワード: <API_TOKEN>
ホスト名: myserver.ddns.max3584.net

更新 URL: /api/pdns/create?host=<host>&ip=<ip>

7. TTL とレコード反映時間

TTL (Time To Live) は、DNS キャッシュサーバーがレコードをキャッシュしておく時間 (秒単位) です。 TTL が小さいほど変更が早く反映されますが、DNS 負荷が増加します。

7.1 TTL ガイドライン

  • 60 秒: 頻繁に IP が変わる環境向け (ただし DNS 負荷増)
  • 600 秒 (10 分): 推奨 (バランス型)
  • 3600 秒 (1 時間): デフォルト (キャッシュ効率重視)
  • 86400 秒 (24 時間): 上限 (固定 IP 向け、変更が少ない場合)

7.2 反映確認

# nslookup で確認 (Windows/macOS/Linux)
nslookup myserver.ddns.max3584.net

# dig で詳細確認
dig myserver.ddns.max3584.net

# 全国の DNS キャッシュサーバー確認 (オンラインツール)
https://mxtoolbox.com/dnspropagate.html

8. サブドメイン管理

一度作成したサブドメインは、ToukaCloud の DDNS 管理画面から編集・削除できます。

8.1 レコード一覧表示

  1. DDNS 管理 を開く
  2. 自分が作成したレコードが一覧表示される
  3. 各レコードカードに TTL、レコード型、IP アドレスが表示される

8.2 レコード編集

  1. レコードカード上の 編集 ボタンをクリック
  2. 値 (IP アドレス等)、TTL を変更
  3. 保存 をクリック

8.3 レコード削除

  1. レコードカード上の 削除 ボタンをクリック
  2. 確認ダイアログが表示される
  3. 確認後、レコードが削除される

8.4 レコード上限

  • ユーザーあたり最大 5 レコード (A + AAAA + CNAME + TXT + SRV の合計)
  • 上限に達するとレコード追加時にエラーが表示されます
  • 不要なレコードを削除してから新規作成してください

9. トラブルシューティング

nslookup で IP が反映されない

TTL の時間だけ待つ必要があります。nslookup -type=A myserver.ddns.max3584.net で 返される TTL 値を確認してください。その秒数後に反映されます。 すぐに確認したい場合は、ローカルマシンの DNS キャッシュをクリアしてください:

# Windows
ipconfig /flushdns

# macOS
sudo dscacheutil -flushcache

# Linux (systemd-resolved)
sudo systemctl restart systemd-resolved
API 更新で 401 Unauthorized エラー

セッショントークンが無効か期限切れの可能性があります。ToukaCloud に再度ログインして、 新しいトークンを取得してください。トークンの有効期限は ToukaCloud のセッション有効期限と同じです。

API 更新で 400 Bad Request エラー

リクエスト JSON フォーマットが正しくない可能性があります。以下を確認してください:

  • domain フィールドが正しい値 (例: ddns.max3584.net)
  • name がドット (.) で終わっている (例: myserver.ddns.max3584.net.)
  • type が有効な値 (A, AAAA, CNAME, TXT, SRV)
  • ttl が 0 〜 86400 の範囲
  • IP アドレスが有効な形式 (IPv4 または IPv6、予約 IP ではない)
Already exists エラー

同じドメイン名のレコードが既に存在しています。 DDNS 管理画面で確認して、削除または編集してください。 同じレコードを再度作成したい場合は、必ず旧レコードを削除してから作成してください。

max 5 RR record only! エラー

ユーザーあたりの上限 5 レコードに達しています。DDNS 管理画面で不要なレコードを削除してから、 新規レコードを作成してください。

予約 IP アドレス (プライベート IP) を登録できない

ToukaCloud DDNS では、以下の予約 IP 範囲の登録を拒否します (外部公開用ドメインのため):

  • 127.x.x.x (ループバック)
  • 10.0.0.0/8 (プライベート)
  • 172.16.0.0/12 (プライベート)
  • 192.168.0.0/16 (プライベート)
  • 169.254.0.0/16 (リンクローカル)
  • 255.255.255.255 (ブロードキャスト)
  • ::1 (IPv6 ループバック)
  • fe80::/10 (IPv6 リンクローカル)
  • ff00::/8 (IPv6 マルチキャスト)

グローバル IP アドレスのみが登録可能です。ISP から割り当てられたグローバル IP を使用してください。

Web UI でレコード作成時に検証エラーが出る

以下をご確認ください:

  • ドメイン名: 英数字とハイフンのみ、最大 63 文字/ラベル
  • A/AAAA: 有効な IPv4 または IPv6 アドレス形式
  • CNAME: 有効なドメイン名形式
  • TTL: 0 〜 86400 の範囲
curl 実行後、応答がない、または接続がタイムアウト

以下を確認してください:

  • ToukaCloud が起動しているか (http://localhost:3000 にアクセス可能か)
  • ネットワーク接続が確立されているか (ping google.com など)
  • JSON フォーマットが正しいか (jqpython -m json.tool で検証)
  • セッショントークンが有効期限内か (ToukaCloud に再ログイン)