MyDNS(pinocchio.mydns.jp)トラブル対応 記録

対象ホスト:pinocchio.mydns.jp / 作業端末:Dell Latitude E5420 (Ubuntu) / 目的:DDNS復旧+恒久運用化

最終結論(このページのゴール)

1. 症状と初期観測

観測

curl -4 ifconfig.me
# => 218.42.96.86(当時のグローバルIPv4)

nslookup pinocchio.mydns.jp
# => 関係のないIPv4が複数返る(Aレコードが“変”な状態)

MyDNS管理画面ログ(要旨)

2. 原因の整理(今回ハマったポイント)

項目内容結論
IPv6優先 Linux環境ではIPv6が優先されやすく、ログインはIPv6で通ることがある。 OK(仕様として自然)。ただし更新はIPv4で確実化が必要。
URLパラメータ認証 MID=...&PWD=... をURLに入れる方式で 401(Basic認証要求)に遭遇。 NG。以後は Basic認証に統一。
旧スクリプト directip.html + ifconfig.me で IP を自前取得し、結果を /dev/null に捨てていた。 NG。黙って失敗しやすく、再発要因。
cron のPATH cron はログインシェルではなく PATH が最小。Anacondaの curl しかないと “curlが見つからない”。 対策必須。OS標準curlを導入し /usr/bin/curl を明示。

3. 正解方式の確定(手動更新)

手動更新(1コマンド)

紙に書く場合は2行に分けてもよい(\で継続)。実体は1コマンド。

curl -4 -u mydns798820:******** \
"https://www.mydns.jp/login.html?HOST=pinocchio.mydns.jp"

成功時の特徴

4. 旧スクリプトの退避(事故防止)

旧方式は削除せず退避

mv ~/mydns_update.sh ~/mydns_update.sh.bad

「消さないが実行しない」=事故防止+後日比較用(教材化にも使える)。

5. OS標準curlの導入(Anaconda依存排除)

インストール

sudo apt install curl

インストール先確認

dpkg -L curl | grep '/bin/curl$'
# => /usr/bin/curl

注意: which curl が Anaconda を指すことはあり得る(base環境がPATH先頭)。運用スクリプトは /usr/bin/curl を明示して解決。

6. 最終スクリプト(成功/失敗でログ形式を変える)

ファイル:/home/murata/mydns_update.sh

PASS は必ず自分で置換(このHTMLを共有する場合は秘匿)。

#!/bin/bash
set -eu

ID="mydns798820"
PASS="********"   # ←自分のパスワードに置換
HOST="pinocchio.mydns.jp"
LOG="/home/murata/mydns_update.log"

if /usr/bin/curl -4 -sS -u "${ID}:${PASS}" \
  "https://www.mydns.jp/login.html?HOST=${HOST}" > /tmp/mydns_ok.$$ 2>&1
then
    # 成功時:タイムスタンプだけ
    date '+%Y-%m-%d %H:%M:%S OK' > "$LOG"
else
    # 失敗時:エラー内容を記録
    {
        date '+%Y-%m-%d %H:%M:%S ERROR'
        cat /tmp/mydns_ok.$$
    } > "$LOG"
fi

rm -f /tmp/mydns_ok.$$

権限(秘密情報を含むため)

chmod 700 ~/mydns_update.sh
chmod 700 ~/mydns_update.sh.*   # .bad / .save も含めて保護した場合

手動テスト

~/mydns_update.sh >/dev/null && echo OK

7. crontab(最終形:1行・ログ制御はスクリプト側に集約)

編集

crontab -e

登録する行(これだけ)

*/10 * * * * /bin/bash /home/murata/mydns_update.sh

確認

crontab -l

ポイント: cron 側の > mydns_update.log 2>&1 は付けない。ログはスクリプト内で責任を持って書く。

8. 運用確認(最小)

ログ確認(上書きなので「最新1回分」)

cat ~/mydns_update.log

期待値

DNS確認(念押し)

nslookup pinocchio.mydns.jp

9. 今回の教訓(短く)

10. 付録:よくある質問

Q. 2行で書いた curl は 1行に繋げる必要がある?

A. はい。\ は「次行も同じコマンド」の意味。見やすさのため2行で書いてよいが、実体は1コマンド。

Q. sudo は必要?

A. crontab -e(ユーザーcrontab)なら不要。root crontab を触るときのみ sudo が必要。

Q. Anaconda の curl が見えてしまう

A. 対話環境では PATH 先頭が anaconda になることがある。運用では /usr/bin/curl を明示して解決。


このHTMLは「作業の再現」「後日の引き継ぎ」「教材化」を意識して作成。 パスワード等の秘匿情報は必ずマスクして保存・共有すること。

```