Raspberry Pi 2でサーバ作ってみる(7) 〜BindでローカルDNS〜

※ここではローカル環境で使うことを想定しています。
DNSサーバを公開する場合はもっと厳密な設定とセキュリティを確保しないといけないため、もっと他のサイトを調べるようにしましょう。

参考にしたサイト
BIND9で内向きDNS構築 on Ubuntu - ペイパー・プログラマーズ・ダイアリー
Under a Violet Moon- とりあえず ブログ~,Ubuntu Server 14.04 でDNSサーバーを構築

ローカル環境用DNSを準備しておくと、固定IPマシンをIPではなく名前で指定できます。
最新版を使う方がセキュリティなどはいいんですが、ローカル用ということでインストールはapt-getで行います。

#Bind9をインストール
apt-get -y install bind9

次に設定ファイルを見ていくわけですが、
ここでいろいろハマりました。
というのも、昔CentOSでサーバ組んでたころにソースからビルドした時と微妙にファイルが違っていたため。
その時はいろいろ準備したのですが、どうやらapt-getで入れた場合は結構揃ってそう。
主要な設定ファイルは次のものです。

  • /etc/bind/named.conf
    一番最初に読み込まれる設定ファイル。他の設定ファイルをIncludeしている。
    • /etc/bind/named.conf.options
      オプション設定用ファイル。DNSを適用するネットワークの設定などを記述する。
    • /etc/bind/named.conf.local
      ゾーン情報を記述する。localと付いているので内向き?
      • /etc/bind/db.myarea (追加)
      • /etc/bind/db.myarea.rev (追加)
        それぞれ自身のネットワーク内の固定PCの正引き(名前→IP)と逆引き(IP→名前)の設定
    • /etc/bind/named.conf.default-zones
      localhostなど、デフォルトのゾーン設定を予め記述してある。
      • /etc/bind/db.root
        ルートサーバの設定
      • /etc/bind/db.local
      • /etc/bind/db.127
        それぞれ自分自身の正引き(localhost127.0.0.1)と逆引き(127.0.0.1localhost)の設定

CentOSの時より設定ファイルは多いかもしれないですが、設定の内容に応じて分割しているのでわかりやすいかも。

設定が終わったら再起動

/etc/init.d/bind9 restart

digコマンドで確認、と思ったらコマンドがない?
前のsmbpasswdみたいに、RasPiは所々コマンドがないらしい。
調べると、dnsutilsを入れるらしい。
networking - where are nslookup and dig gone? - Raspberry Pi Stack Exchange

#digコマンドのためにdnsutilsをインストール
apt-get -y install dnsutils
#とりあえずYahoo!Japanでテスト
dig @192.168.0.1 www.yahoo.co.jp

ずらっといろいろメッセージが並ぶけど、ANSWER SECTIONというのでIPアドレスが返ってくればOK。
後はローカル内のPCも名前引き、逆引きができればとりあえずOK。

一応これでファイルサーバとDNSが設定できたので、RasPiをとりあえずサーバとして使えるようになりました。
次はApacheとか。Apacheなどはいろいろ機能追加とかしたいのでソースからビルドする予定です。

;(function(document){ var pres = document.getElementsByTagName("pre") for(var i=pres.length; i--; ){  var el = makeOl(pres[i]) pres[i].appendChild(el) } function makeOl(pre){ if (pre.className.indexOf("gist") !== -1) { return } var ol = document.createElement("ol") , li = document.createElement("li") , df = document.createDocumentFragment() , br = pre.innerHTML.match(/\n/g) || 0 ol.className = "preLine" ol.setAttribute("role", "presentation") // no lang, no line-number if( pre.className && ! /lang-./.test(pre.className) ){ br.length += 1 } for(var i=br.length; i--; ){ var li2 = li.cloneNode(true) df.appendChild(li2) } ol.appendChild(df) return ol } })(document)