DNS についてアカデミックに勉強している場合、例えば tech.yamashiro.blog の Aレコードは ns1.yamashiro.blog というネームサーバが管理しているイメージになるかと思います。
しかし、実際には当ブログのゾーン情報を管理しているのは ns1.wpx.ne.jp. というネームサーバです。
実際に dig してみると以下のような結果になります。
[root@localhost ~]# dig yamashiro.blog. SOA | grep -v '^;'
yamashiro.blog. 2853 IN SOA ns1.wpx.ne.jp. root.wpx.ne.jp. 0 10800 3600 604800 3600
[root@localhost ~]# dig yamashiro.blog. NS | grep -v '^;'
yamashiro.blog. 2816 IN NS ns3.wpx.ne.jp.
yamashiro.blog. 2816 IN NS ns1.wpx.ne.jp.
yamashiro.blog. 2816 IN NS ns2.wpx.ne.jp.
今回は上記の「ns1.wpx.ne.jp.」が「ns1.yamashiro.blog.」ではないことに違和感を覚える方向けの内容となっています。何を言っているか分からない、という方はまずは以下のページを読んでみてください。
なお、検証用の名前空間を用意しましたが、ns1.wpx.ne.jp. は長くて手間がかかるので、ns1.xserver.jp. をネームサーバとします。
別ドメインのゾーン管理がなぜ可能なのか
「ns1.wpx.ne.jp.」は「wpx.ne.jp」ドメインのゾーン管理しかできないような感覚がある方は、きちんと本を読んで勉強してこられた方だと思います。DNS を説明している技術書にはそのような記載しかないので、この理解になってしまうのも仕方ないような気がします。しかし実際は上記の dig の結果のようにその理解では不十分です。
ゾーン外データを管理することは基本的に不可能
ここからは xserver.jp. ドメインに頑張ってもらいます。最初によくある間違いを潰しておきましょう。以下のように「blog.」ゾーンに「ns1.xserver.jp.」のグルーレコードを記載すれば yamashrio.blog. のネームサーバとして辿ることができるという考えです。
$ORIGIN blog.
$TTL 3600
@ IN SOA (
ns1.blog.
postmaster.blog.
2019062301
3600
900
604800
3600
)
IN NS ns1
yamashiro IN NS ns1.xserver.jp.
ns1 IN A 172.16.0.1
ns1.xserver.jp. IN A 192.168.0.100
上記のゾーンファイルはエラーになり、レコードは無視されます。ゾーン外のレコードを管理することは基本的に不可能だからです。
[root@localhost ~]# named-checkzone blog /var/named/blog.zone
/var/named/blog.zone:15: ignoring out-of-zone data (ns1.xserver.jp)
zone blog/IN: loaded serial 2019062301
OK
「ns1.xserver.jp. IN A 192.168.0.1」を削除すれば上記エラーは解消されます。ここにヒントがあります。
名前空間を辿る
下図のように名前空間を辿るのが正解になります。
注目してほしいのは、blog. のネームサーバに委任情報として 「yamashiro.blog. のネームサーバは ns1.xserver.jp. です」と伝えている点です。そしてこの NS レコードにはグルーレコード(NSレコードの A レコード)がありません。
フルサービスリゾルバは yamashiro.blog. のレコードを手に入れるために ns1.xserver.jp. を目指します。そして ns1.xserver.jp. はゾーンファイルを分けるという手段で別ドメインのゾーンデータを保持しています。
zone "xserver.jp" IN {
type master;
file "xserver.jp.zone";
};
zone "yamashiro.blog" IN {
type master;
file "yamashiro.blog.zone";
};
上記のように、xserver.jp. と yamashiro.blog. のゾーンファイルを別で保持することでゾーン外データを管理しているというわけです。
$ORIGIN xserver.jp.
$TTL 3600
@ IN SOA (
ns1.xserver.jp.
postmaster.xserver.jp.
2019062301
3600
900
604800
3600
)
IN NS ns1
ns1 IN A 192.168.0.100
$ORIGIN yamashiro.blog.
$TTL 3600
@ IN SOA (
ns1.xserver.jp.
postmaster.xserver.jp.
2019062301
3600
900
604800
3600
)
IN NS ns1.xserver.jp.
tech IN A 192.168.0.200
dig る
dig の結果は以下になります。
# dig tech.yamashiro.blog.
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> tech.yamashiro.blog.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42178
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tech.yamashiro.blog. IN A
;; ANSWER SECTION:
tech.yamashiro.blog. 3000 IN A 192.168.0.200
;; AUTHORITY SECTION:
yamashiro.blog. 3000 IN NS ns1.xserver.jp.
;; ADDITIONAL SECTION:
ns1.xserver.jp. 3000 IN A 192.168.0.100
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: 木 7月 09 17:55:22 JST 2020
;; MSG SIZE rcvd: 108
yamashiro.blog. の AUTHORITY SECTION で ns1.xserver.jp. が返ってきています。これでネームサーバが別ドメインになっている謎が解けました。