急にDNS逆引きに失敗するようになった

あらまし

私は,KDDI au-one net というプロバイダの,イーサエコノミーという法人向けサービスを使っています.このイーサエコノミーというサービスは,3〜8bit程度のサブネットで固定IPを割り振ってくれるサービスでして,PPPoEルータのアンナンバード(un-numbered)機能を用いて接続します.簡単に言うと,プロバイダは一つだけですが,自宅PCそれぞれに固定グローバルIPアドレスを振ることができます.
私がお気に入りのサービスとしては,DNSの逆引き権限をユーザのDNSサーバに任せてくれるというところなのですが,今月末から急にIPアドレスの逆引きができなくなり,困りました.
結論から言うと,私のDNSサーバ(bind)設定にミスがあり,それが顕在化したということです.

症状と問題点予測

  • LAN側PCでは正引き・逆引き ともに正常に引ける.
  • 外部からも正引きは可能.
  • 外部から逆引きをしようとすると, 下記のようになる.

server can't find www.zzz.yyy.xxx.in-addr.arpa: SERVFAIL

ローカルからは正しく動作していたため,問題箇所を探すのに時間がかかりました.つまり,疑うべき対象が広がってしまったのです.

  1. KDDIが怪しい説: 外部から,私の持つIPアドレスに対して逆引きをするとき,KDDIの上位DNSサーバが,私のDNSサーバに逆引きクエリを投げるわけですが,その設定が正しくない.
  2. bind-1.19.1-0vl2 のバグ説: 実は,おかしくなった頃,ちょうどBINDのアップデートがかかっていたのです.そのため,バグの可能性も考えました.

仮説の検証

Web上から nslookup をかけられるテストサイトを使って,逆引きクエリを投げてみたところ,確かに DNS query が飛んできましたので,どうやら 仮説1は誤りのようです.KDDIは悪くないです.疑って正直☆スマンかった.
また,仮説2もどうやら間違っていたようです.なぜなら,bindのバージョンを下げても逆引きできなかったから.

私の設定が間違っていた

結論を申し上げると,私が NSレコードを書いたものの,そのFQDNを定義していなかったことが問題かもしれません.ドメインレジストラに,ns1.hogehoge.orgのIPアドレスはxxx.yyy.zzz.wwwと教えておきながら,それを自分のDNSサーバに定義していなかったのです.よって,zone設定ファイルに下記のように記述することで,解決しました.

ns1 IN A xxx.yyy.zzz.www

RFCを読んでいないのでよくわかりませんが,ns1の正引きができないと逆引きできない理由があるのかもしれません.よくわかりません.

なぜ今まで動いていたのか

謎です.今まではレジストラが代わりにns1.hogehoge.org の正引き結果を返していてくれたのかもしれません.

今の設定を公開

外部からの逆引き考慮した bind の設定はあまりありませんので*1,これを機に設定を公開します.
ちなみに,提供されているサブネットを管理しているプロバイダに逆引き権限を委譲されないと,そもそも逆引きクエリが自前サーバまで届かないので注意してください.イーサエコノミーの方は法人営業に相談すると良いでしょう.

なお,設定の意味などはここらへんが詳しい.

環境
  • KDDI イーサエコノミー 28bit
  • ネットワーク: xxx.yyy.zz.32/28 (としましょうか^^;)
  • ドメイン: hogehoge.org (としましょうか^^;)
/etc/named.conf
acl internal-acl {
    xxx.yyy.zzz.32/28;
    127.0.0.1;
};

options {
        directory "/var/named";
};

// ローカルクライアントからのクエリ用
view "internal-view" {
  match-clients { internal-acl; };
  allow-query { internal-acl; };
  allow-recursion { internal-acl; };

  zone "." IN {
    type hint;
    file "named.ca";
  };
  zone "localhost" IN {
    type master;
    file "localhost.zone";
    allow-update { none; };
  };

  zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "localhost.rez.zone";
    allow-update { none; };
  };

  zone "hogehoge.org" {
    type master;
    file "hogehoge.org.zone";
    allow-update { none; };
  };

  zone "32h.zzz.yyy.xxx.in-addr.arpa" {
    type master;
    file "hogehoge.org.rev.zone";
    allow-update { none; };
  };
};

// 外部からのクエリ用
view "external-zone" {
  match-clients { any; };
  allow-query { any; };
  recursion no;

  zone "hogehoge.org" {
    type master;
    file "hogehoge.org.zone";
    allow-update { none; };
  };

  zone "32h.zzz.yyy.xxx.in-addr.arpa" {
    type master;
    file "hogehoge.org.rev.zone";
    allow-update { none; };
  };
};

key "key" {
        algorithm hmac-md5;
        secret "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
};

逆引きゾーンファイル指定に 「zone "32h.zzz.yyy.xxx.in-addr.arpa" {」のように,32hとつけていますが,これはKDDIイーサエコノミーの上位DNSの逆引きゾーンファイルにてCNAMEとして定義されています.おそらく,「33 IN CNAME 33.33h.zzz.yy.xxx.in-addr.arpa.」などと定義されているのでしょう.私の場合,管理ネットワークアドレスが,xxx.yyy.zzz.32/28 ですので,"32h" なのです.私はこれをKDDIから教えてもらったのかどうか記憶にありません….この話はこちらに詳しくかかれている.

/var/named/named.ca

(略)

/var/named/localhost.zone
$TTL    86400
$ORIGIN localhost.
@                       1D IN SOA       @ root (
                                        42              ; serial (d. adams)
                                        3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum

                        1D IN NS        @
                        1D IN A         127.0.0.1
/var/named/localhost.rez.zone
$TTL    86400
@       IN      SOA     localhost. root.localhost.  (
                                      1997022700 ; Serial
                                      28800      ; Refresh
                                      14400      ; Retry
                                      3600000    ; Expire
                                      86400 )    ; Minimum
              IN      NS      localhost.

1       IN      PTR     localhost.
/var/named/hogehoge.org.zone
$TTL 86400
@       IN      SOA     ns1.hogehoge.org. admin@hogehoge.org. (
                2009020100 ; serial
                3600       ; refresh 1hr
                900        ; retry 15min
                604800     ; expire 1w
                86400      ; min 24hr
)

        IN      NS      ns1.hogehoge.org.
        IN      NS      ns2.hogehoge.org.
        IN      MX      10 mail.hogehoge.org.
hogehoge.org.      IN      A       xxx.yyy.zzz.34
server  IN      A       xxx.yyy.zzz.34
ns1     IN      A       xxx.yyy.zzz.34
ns2     IN      A       aaa.bbb.ccc.ddd
router  IN      A       xxx.yyy.zzz.33
www     IN      CNAME   server
mail    IN      A       xxx.yyy.zzz.34
ftp     IN      CNAME   server
host1   IN      A       xxx.yyy.zzz.35
  :      :      :       :
/var/named/hogehoge.org.rev.zone
$TTL 86400
@       IN      SOA     ns1.hogehoge.org. admin@hogehoge.org. (
                2009020101 ; serial
                3600       ; refresh 1hr
                900        ; retry 15min
                604800     ; expire 1w
                86400      ; min 24hr
)

        IN      NS      ns1.hogehoge.org.
        IN      NS      ns2.hogehoge.org.
        IN      PTR     hogehoge.org.
        IN      A       255.255.255.240
33      IN      PTR     router.hogehoge.org.
34      IN      PTR     server.hogehoge.org.
35      IN      PTR     host1.hogehoge.org.
  :      :      :       :

ちなみに,KDDIイーサエコノミーの場合,下記のように記述してもOKです.

  : 
32h.zzz.yyy.xxx.in-addr.arpa.            IN      NS      ns1.hogehoge.org.
32h.zzz.yyy.xxx.in-addr.arpa.            IN      PTR     hogehoge.org.
32h.zzz.yyy.xxx.in-addr.arpa.            IN      A       255.255.255.240

33.32h.zzz.yyy.xxx.in-addr.arpa.         IN      PTR     router.hogehoge.org.
34.32h.zzz.yyy.xxx.in-addr.arpa.         IN      PTR     server.hogehoge.org.
35.32h.zzz.yyy.xxx.in-addr.arpa.         IN      PTR     host1.hogehoge.org.
  :
その他注意

ちゃんと 別サーバのセカンダリDNSをたてておかないと誤作動起こすらしい.特に逆引きで.
友達とかに頼んでセカンダリ張ってもらいましょう.

*1:というより,24bitサブネットに対する設定例はよく見かけますが,28bitや29bitのような中途半端な(?)サブネットに対する設定例は見かけないのです.