DNSのゾーンファイルのシリアル番号は、更新した日付を値として使用するのが一般的ですが、未来の日付など誤った値を設定してしまうこともあります。
そのようなときの選択肢は
- そのまま運用する
- どうにか正しい値に直す
このどちらかです。
そのまま運用するのが最も楽ですが、次に更新するときにそのことを覚えていないと、設定ミスにつながります。
1日や2日ほど未来にしてしまったくらいならすぐ追いつくのでまだ良いですが、年単位で誤っていると更新の度にずっと気を付けなければならないので、そういう場合はできれば正しい値に戻したいところです。
しかし、正しい値に戻すには一定の手順が必要です。
個人的にこの手順の理解に少し苦労したので、自分なりにまとめておこうと思います。
目次
シリアル番号を直す手順
さっそく結論ですが、ゾーンファイルのシリアル番号を直す手順は次の通りです。
※DNSとしてはBINDを使用している想定です。
※スレーブ側のサーバを操作できる場合は、スレーブ側のゾーンファイルを一旦削除してしまう方がややこしくないので、スレーブサーバを操作できない、またはいじりたくないという場合の手順になります。
シリアル番号を直すための計算式
現在のシリアル(誤った値) + 2147483647 = A
A - 4294967296 = B
パターン1 Aが4294967296より小さい(Bの値が負)
①Aをシリアル番号として一旦設定して適用
②本来設定したかった値をシリアル番号として設定して適用
パターン2 Aが4294967296より大きい(Bの値が正)
①Bをシリアル番号として一旦設定して適用
②本来設定したかった値をシリアル番号として設定して適用
計算例
たとえば、現在のシリアル番号が2026032500だとします。
本来は2025032500に設定したかったのを誤って1年先の日付にしてしまいました。
この場合は次のようになります。
2026032500 + 2147483647 = 4173516147
4173516147 - 4294967296 = -121451149
パターン1なので、4173516147を一旦シリアル番号として設定して適用します。
次に、2025032500をシリアル番号として設定して適用します。
これで本来設定しようとしたシリアル番号になります。
ポイント
押さえておくところは次の3つです。
- シリアル番号として設定できる値には上限がある
- 上限を超える場合は0から数えなおし
- 更新したとき、シリアル番号が増えた(正しく更新された)と扱われる範囲には上限がある
シリアル番号の上限について
先に述べたようにシリアル番号には上限があり、無限に増えていくわけではありません。
察しの良い方はお気づきかもしれませんが、その上限が4294967296です。
※正確には、設定できる値としては0~4294967295です。
ちなみに、なんでこの値かというと、シリアル番号が32ビットだからです。
この辺りの小難しい話はなんとなく頭の片隅に置いておくくらいで良いと思います。
では、シリアル番号が上限に達したゾーンファイルは更新できないのか、というとそうでもありません。
シリアル番号が上限を超える場合、また0から数えなおしになります。
※ただし、0は普通無効な値として使われないので、実際には上限値の次には1を設定します。
たとえば、シリアル番号の範囲が0~11までだった場合次のようになります。
このように、シリアル番号はループするようになっているので、今より前の値にするには、つまり1周回って戻ってくればいいわけです。
シリアル番号が「大きくなった」の定義
ゾーンファイルのシリアル番号は更新したら値を大きくするというのが基本的なルールです。
元々のシリアル番号と比較して、値が大きくなっている必要があります。
1000だったものを1001にするのは問題ありませんが、999にするのはNGです。
しかし、上限を超える場合は0から数えなおしになるので、単純に値を比較して元の値より大きければOKというわけにもいきません。
上限値の4294967295と、次に来る1を単純に比較したら、誰が見ても1の方が小さいです。
ここで先ほどのポイント3つ目が出てきます。
シリアル番号が更新されるとき、元のシリアル番号に+2147483647までの値の範囲が「値が大きくなった」と定義されています。
こちらもなんでこの値かというと、+31ビットの値までを「値が大きくなった」という定義にしているからです。
なお、逆に-31ビットの値までが「小さくなった」という定義になっています。
たとえば、これを先ほどと同じく、シリアル番号の範囲が0~11までだった場合で考えてみます。
現在のシリアル番号が3の場合、次のようになります。
図で言うところの「+5までが大きい値」というのが、実際のところでは「+2147483647までが大きい値」ということになります。
ここまでの話を踏まえて、たとえば現在3のシリアル番号を1に戻すとしたら次のようになります。
3→8→1と、シリアル番号がぐるりと1周しているのが分かると思いますが、最初の見出しで述べた手順はこれをやっているということになります。
なお、図を見ると、「どちらでもない」値がありますが、実際の値で言うと+2147483648がこれになります。
この値にすると元々のシリアル番号と比較して、大きくなったのか小さくなったのか判別できないためNGです。
そのため、+2147483647までが大きい値とされる上限値となります。
まとめ
よくあるというと語弊がありますが、人のやることなので、シリアル番号を誤ってしてしまうことは普通にあります。
そのまま運用してもDNSの機能に問題はありませんが、更新時に気を付けることが増えるという意味で、管理上地味に差し障りがあります。
そういった場合のために、今回のようにシリアル番号を1周させれば戻せるというのは覚えておいて良いと思います。