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 からサブドメインを新規作成します。
- ToukaCloud にログイン後、サイドバーの DDNS 管理 を開く
- 画面右上の 新規レコード作成 をクリック
- ドメイン:
ddns.max3584.netまたはddns.toukadc.netを選択 - ドメイン名: 希望するサブドメイン名を入力 (例:
myserver→myserver.ddns.max3584.net) - レコード型:
A(IPv4) またはAAAA(IPv6) を選択 - TTL: 反映待機時間 (デフォルト 3600 秒 = 1 時間)
- レコード値: 現在の IP アドレスを入力
- 作成 をクリック
nslookup myserver.ddns.max3584.net で確認できます。4. API トークンを発行する
curl や cron スクリプトから IP 自動更新を行う場合、API トークンが必要です。 トークンは セッショントークン方式で、ToukaCloud のセッションから自動取得されます。
4.1 セッションからの取得
ToukaCloud にログイン済みの状態で、ブラウザの開発者ツール (F12) を開き、Application タブから Cookies → next-auth.session-token をコピーします。
または、ToukaCloud の設定画面で API トークンを直接生成します (実装予定)。
4.2 トークンの保存
発行したトークンを安全に保管してください。トークン流出時は、 新しいトークンを発行して古いものを無効化することで対応できます。
.env ファイルで管理してください。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
fi5.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 レコード一覧表示
- DDNS 管理 を開く
- 自分が作成したレコードが一覧表示される
- 各レコードカードに TTL、レコード型、IP アドレスが表示される
8.2 レコード編集
- レコードカード上の 編集 ボタンをクリック
- 値 (IP アドレス等)、TTL を変更
- 保存 をクリック
8.3 レコード削除
- レコードカード上の 削除 ボタンをクリック
- 確認ダイアログが表示される
- 確認後、レコードが削除される
8.4 レコード上限
- ユーザーあたり最大 5 レコード (A + AAAA + CNAME + TXT + SRV の合計)
- 上限に達するとレコード追加時にエラーが表示されます
- 不要なレコードを削除してから新規作成してください
9. トラブルシューティング
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
401 Unauthorized エラーセッショントークンが無効か期限切れの可能性があります。ToukaCloud に再度ログインして、 新しいトークンを取得してください。トークンの有効期限は ToukaCloud のセッション有効期限と同じです。
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 管理画面で不要なレコードを削除してから、 新規レコードを作成してください。
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 を使用してください。
以下をご確認ください:
- ドメイン名: 英数字とハイフンのみ、最大 63 文字/ラベル
- A/AAAA: 有効な IPv4 または IPv6 アドレス形式
- CNAME: 有効なドメイン名形式
- TTL: 0 〜 86400 の範囲
以下を確認してください:
- ToukaCloud が起動しているか (
http://localhost:3000にアクセス可能か) - ネットワーク接続が確立されているか (ping google.com など)
- JSON フォーマットが正しいか (
jqやpython -m json.toolで検証) - セッショントークンが有効期限内か (ToukaCloud に再ログイン)