DNS 権威サーバが持つゾーンには serial と呼ばれるバージョンの値があります。この値が大きくなったときにゾーンが更新されたとみなされて,複製先にアップデートされるわけですが,この serial の値は常に増加しなければいけないので,減らしてしまうと更新が適切に行なわれなくなってしまいます。
; <<>> DiG 9.10.6 <<>> @1.1.1.1 mdns.jp. SOA
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24378
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;mdns.jp. IN SOA
;; ANSWER SECTION:
mdns.jp. 3600 IN SOA ns-a1.mdns.jp. hostmaster.mdns.jp. 1 10800 3600 604800 3600
;; Query time: 22 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Thu Sep 19 00:18:22 JST 2024
;; MSG SIZE rcvd: 89
しかし,現実の運用ではしばしば (ときにはミスによって) この serial を減らさなければならない状況になることがあります。
- 誤った値に増加させてしまった場合: YYYYMMDDNN 形式で serial を運用していて, 2024年なのに 2025010101 みたいな値にしてしまったり
- 形式を変えたい場合: YYYYMMDDNN 形式で運用していたが,単純なカウンタにしたい/あるいは time_t の値にしたい,など
DNS ゾーン serial の演算
DNS ゾーンの serial は,32-bit 符号なし整数ですが,これは剰余環の演算が定義されていて,4294967295
(2^32 - 1
) に1を足すと 0 になります。そして,この「輪っか」の数のなかで,近いほうの隣り同士に注目して,その並びのなかでプラス側に位置する数を大きいとするのです。(RFC1982)
したがって, serial を増やすときに 2147483648 以上の幅で (2147483648 を含みます) serial を増加させると,減ったものとみなされて正常に動作しないことがあるのでしてはいけません。
従って, serial を減少/リセットさせたいときは, 2147483648 未満の幅で, 0 に戻るまで増やしていけば良いのです。(本当に0にするとバグるリゾルバ等があると言われているので0ではなく1に戻すことを推奨します)
例: 2024010101 → 3024010101 → 1
また,変更を行うときだけは TTL を小さな値に変更するとラクです。前のバージョンの TTL がフルで経過するまでは次の変更を行ってはいけません。
参考