自宅サーバを立てる際の家庭内名前解決の落とし穴

# 自宅でサーバを立てました
小規模サーバの名器と名高い HP NL54L を、遅ればせながら私も購入しました。遅ればせながらというか、もうほとんど賞味期限が切れてますが… :stuck_out_tongue_closed_eyes:

現時点における FreeNAS の最新版 9.3 STABLE をインストール。これ自体は順調に行きましたが、それよりも NL54L を動かすのに少々すったもんだしました。それは別稿にて。

FreeNAS を勉強しながら、jail を利用して各種サーバを構築中です。非力なサーバですので、あまり大がかりな事をさせたくはありませんが。お父ちゃんの極小な小遣いでパワフルなサーバマシンを買うのは難しいんですよ… :sweat_smile:

# bind 9
最初に立てたのがDNSサーバ。名前解決できなければ何も始まりません。公開分に関しては、ドメインを購入した会社で済ませます。やりたい事は家庭内の名前解決。マシンの名前アクセスと、自宅で立てた公開Webサイトの家庭内アクセスです。

FreeNAS の中身は FreeBSD で、ぐーぐる先生によれば bind はデフォルトで含まれているモジュールとの事。bind9 の設定もぐぐれば事細かな日本語情報を入手できます。その通りに設定すれば一仕事終わり。簡単カンタン♪

…なのですが、ここからがハマリ所。

## 状況
私のコダワリにより、我が家では以下のようにドメインを使い分けたい。

* 公開Webサイトは、私の購入したセカンドドメインのサブドメインとする。つまり、購入した example.com に対して www.example.com を公開サイトとしたい。将来的には www1.example.com, www2.example.com,... と増やす予定。

* 各マシンはサブドメイン machine.example.com の中に置く。つまり、マシンのFQDNは taro.machine.example.com, hanako.machine.example.com,... としたい。当然、仮想マシンを作る度に増えていく事になる。

こうして書くと読み辛いですね:sweat: ま、そんなに難しい事はありません。 named.conf に zone を作って、折角なので view で括ってみたりして、 zone としては example.com と machine.example.com の2つを用意します。逆引きはマシン名だけ出来ればいい（ですよね？）ので、1つだけ逆引きを用意。ますます読み辛いですね:sweat:

まとめると、下記のようになります。この内容についてはそこら中で解説されているので、特に説明はいりませんね。もし誤りがあったら、是非ご指摘お願いします。

```/etc/namedb/named.conf
options { 《省略》 };
key "rndc-key" { 《省略》 };

view "internal" {
  match-clients { localnets; };
  recursion     yes;

  zone "example.com" {
    type        master;
    file        "/etc/namedb/master/example.com";
  };
  zone "machine.example.com" {
    type        master;
    file        "/etc/namedb/master/machine.example.com";
  };
  zone "1.0.10.in-addr.arpa" {
    type        master;
    file        "/etc/namedb/master/named.local";
  };
};
```

```/etc/namedb/master/example.com
; 2015.12.27. by Katz
$TTL    1d
@       SOA        dns.example.com. email.example.com. (
        2015122700 ; serial
        1d         ; refresh
        1h         ; retry
        1w         ; expire
        1d         ; Negative cache TTL
)
        NS         dns.example.com.
dns     A          10.0.1.109
freenas CNAME      taro.machine
```

```/etc/namedb/master/machine.example.com
; 2015.12.27. by Katz            
$TTL    1d
@       SOA        dns.example.com. email.example.com. (
        2015122700 ; serial
        1d         ; refresh
        1h         ; retry
        1w         ; expire
        1d         ; Negative cache TTL
)
        NS         dns.example.com.          
taro    A          10.0.1.108   
hanako  CNAME      dns.example.com.
```

```/etc/namedb/master/named.local
; 2015.12.27. by Katz          
$TTL    1d
@       SOA        dns.example.com. email.example.com. (
        2015122500 ; serial
        1d         ; refresh
        1h         ; retry
        1w         ; expire
        1d         ; Negative cache TTL
)
        NS         dns.example.com.       
        PTR        machine.example.com.
        A          255.0.0.0          
108     PTR        taro.machine.example.com.
109     PTR        hanako.machine.example.com.
```

見る人が見れば見当が付くと思いますが…

* taro.machine.example.com が物理マシン NL54L です。これにFreeNASをインストールしました。
* hanako.machine.example.com は jail で用意した仮想マシンです。ここで bind を動かしてDNSサーバにしています。

## ハマリポイント1.
実はこの時点で、既にハマリポイントがあったのでした。各zoneファイルの NS レコードです。

上記では dns.example.com を指定し、zoneファイル example.com にて A レコードで設定しています。結論から言うと、そうでないと freenas.example.com だけ解決できなくなります。

本当は下記のようにしたかったんですが。

* NSレコードに hanako.machine.example.com. を指定
* もしくは、zoneファイル example.com で `dns CNAME hanako.machine` と設定
* zoneファイル machine.example.com で `hanako A 10.0.1.109` と設定

設定としてはこの方が美しいんですが、どういう訳か freenas.example.com を解決できなくなるんですね。もしかすると bind の挙動に精通すると原因がわかるようになるのかも知れませんが、今の私の知識ではお手上げです。調べても、こういう設定をしている方はいらっしゃらないようでした。

## ハマリポイント2.

Windowsにて。nslookup は問題無いんですが、 ping と IE で名前解決が出来ません。

こちらは割と有名な問題だったようです。結論から言うと、Microsoftは一体何やってんだって話:astonished:
下記Webページが参考になりました。

[Windows nslookupで名前解決できるのにpingで名前解決できない問題の真相](http://linux-japan.co.jp/tech-blog/blog/2014/05/25/windows-nslookup%E3%81%A7%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%AE%E3%81%ABping%E3%81%A7%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%95%8F/)

私の場合、ルータの設定で余計な事をしていました。（うちのルータは AirMac Extreme‎ です）

* プライマリDNSサーバ: dns.example.com のIPアドレス(10.0.1.109)
* セカンダリDNSサーバ: ISP が通知してきたプライマリDNSサーバ

解決策は下記の通り。

* named.conf に下記を記入。

```/etc/namedb/named.conf
options {
        《色々なoptions設定》
        forwarders {
             《ISPのプライマリDNSサーバのIPアドレス》;
             《ISPのセカンダリDNSサーバのIPアドレス》;
        };
        forward only;
};
```

* ルータの設定で、セカンダリDNSサーバを指定しない。

これで万事解決しました。やった！:+1: