|||||||||||||||||||||

なんぶ電子

- 更新: 

DebianにプライベートDNSサーバを設定

ローカルネットワーク用のDNSサーバのインストールと設定をします。今回はIPv4に限った話をします。DNSサーバーにDebian10(buster)、動作チェックにWindows10を使って話を進めます。

DNSサーバBIND

BINDはLinuxで多く使われているDNSサーバです。DNSサーバとはIPアドレスでネットワークに存在している各端末をgoogle.comのような名前に変換して記憶しておく電話帳のような役割をします。

BINDをインストールしてみます。

$ su
...
# apt update
...
# apt install bind9 
...

DebianにおいてBINDの設定ファイルは/etc/bind/ディレクトリにあり設定ファイルはnamed.confとなります。しかし、named.confの中身は他のファイルを読み込む設定となっていますので、そのままにしておきます。

設定ファイル:named.conf.options

まず、編集する設定ファイルは/etc/bind/named.conf.optionsです。このファイルはBINDの稼働環境や利用制限の為の設定ファイルとなります。設定になれないうちは初期ファイルのバックアップを取っておきましょう。

# cp /etc/bind/named.conf.option
/etc/bind/named.conf.option.bkup

ファイルの編集にはエディタを使います。コマンドライン用のエディタには「nano」や「vi」があります。これらはそのままコマンドになっており、引数にファイルを指定する事で編集ができます。nanoの方がクセが少なく最初は扱いやすいかもしれません。設定ファイルの編集には管理者権限が必要な場合が多いので注意してください。

# nano /etc/bind/named.conf.options

named.conf.options

options {
  directory "/var/cache/bind";
  listen-on { 192.168.102.254; };
  allow-query { localhost; 192.168.102.0/24; };
  forwarders { 8.8.8.8; };
  recursion yes;
  //listen-on-v6 { any };
}

これらの設定を順にみていきます。

  • directory

    directoryの項目でデータの格納場所を指定します。初期設定では、「/var/cache/bind」となっていると思います。

  • listen-on

    listen-on の後に続く{}内にサーバが待ち受けるアドレスを指定します。;に続けて複数アドレスを指定できます。ネットワークカードが複数ありサーバーに複数のアドレスが割り振られているような場合、応答するアドレスを制限するのに利用します。

  • allow-query

    {}内でここで設定したアドレス、ネットワークからしか問い合わせを受け付けません。localhostは自PCを意味します。先のlisten-onはサーバー側のアドレスの制限で、allow-queryはクライアント側の制限となります。

  • forwarders

    自分の管理外の名前(ドメイン)だった場合に、問い合わせを転送する先を指定します。プロバイダから案内されているDNSサーバのアドレスか、Public DNSを入力してください。8.8.8.8はGoogleのPublic DNSです。

  • recursion

    再帰問い合わせをする設定です。自分が管理する名前以外の要求もforwardersを使って探しにいくかという設定になります。ここではyesを指定しています。

  • listen-on-v6

    IPv6での稼働の設定になります。ここでは設定しないので//でコメントアウトして無効にしています。

設定ファイル:named.conf.local

次に、編集する設定ファイルは/etc/bind/named.conf.localです。こちらも元のファイルのバックアップを取っておくのが丁寧ですが、筆者の環境ではコメントだけの空ファイルでしたので省略します。

ひとつのDNSサーバが管理するネットワークのことをゾーンといいます。このファイルにはそのゾーン情報を記載します。ダイジェストだけ記載して詳細は別ファイルに格納します。

zoneの後の"(ダブルクォート)で囲った中にゾーン名称を記述しします。さらに、ゾーン名と検索名称(ドメイン)が一致した際に、確認しにいく明細がファイルの場所を指定します。

#nano /etc/bind/named.conf.local

named.conf.local

zone "stray.cat.caffe" IN {
  type master; 
  file "/etc/bind/straycatcafe.dat";
};

これらの記述で、「stray.cat.cafe」という名前(ドメイン)を管理するmaster(マスターデータ)は、/etc/bind/straycatcafe.datというファイルに書かれているという定義になります。

また、DNSサーバでは名前(ドメイン)からIPアドレスを解決するだけでなく、IPアドレスから名前を取得する逆引きという機能も提供できます。その際は逆引きの情報も記載します。

ゾーン情報に含まれるもの

電話帳が住所、氏名、電話番号等様々な情報を保持するように、ゾーン情報にも種類(type)があります。その主なものは次の通りです。

項目 type
DNSサーバ自身の情報 SOA
DNSサーバの名称→アドレス NS
端末の名称→アドレス A
端末のアドレス→名称 PTR
端末の別名 CNAME
メールサーバ情報 MX
他のテキスト情報 TXT

明細データ

ゾーン定義部(named.conf.local)で記述した明細ファイル内のデータ基本書式は次のようになります。

owner ttl class type data
  1. owner

    owner部分はドメインだったり、端末の名称が入ったりします。名称の最後に.(ドット)がついていない場合は、@に格納されている文字列が末尾に付与されます。

    例えば、「sample」と記載したら、内部的には「sample.stray.cat.cafe」として扱われます。「sample.」とした場合は「sample」として扱われますが、それだと検索時に一致することはありません。省略せずに書くとしたら「sample.stray.cat.cafe.」となります。

    また、一つ前の行とownerの部分が同じ場合は何も書かなくてもいいです。

  2. ttl

    ttlは情報の有効期限の秒数となります。他のDNSサーバに自分のゾーン情報を教えるときに使われます。他のDNSサーバはここで設定した有効期限が過ぎるまでデータを保持します。

    記述しなかった場合は最初に$TTLで設定した基本値が用いられます。

  3. class

    classは現時点で用いられるのは「IN」のみです。「インターネット」の意味だそうです。

  4. type

    typeには、前述の表にあるtypeを記述します。これにより次のdataで入力するデータの意味が変わります。

  5. data

    dataの部分にはtypeに合わせて各種データを入力します。先ほどownerの部分でもありまししたが、NS、SOA、CNAME設定ではでは最後に.(ドット)がつかない場合は、@に格納されている文字列が最後に追加付与されます。

筆者が設定した実際のデータは次のようになっていました。

「$TTL = 86400」の部分だけ先の基本書式に則していません。データの基本有効期限を秒数で指定しています。

途中で利用されている@についてですが、 ゾーン情報の明細ファイル中の@(アットマーク)にはこのファイルの読み出し元(named.conf.local)で設定されたzone名称が格納されていて、代替文字として使用できます。ここでは「stray.cat.cafe」が格納されています。

SOA

今回の設定で必要なtypeに絞ってdataの書式を確認していきます。まず、SOAです。

@ IN SOA ネームサーバ名 メールアドレス (連番 更新頻度 再試行待機 破棄期限 下限ttl)

SOAはDNSサーバの情報を記述します。ゾーンに対して設定しますので、今回の設定ではownerは@に固定されると思います。IN、SOAの後のdata部には、まずネームサーバ名を入れます。ネームサーバ名はゾーンのネームサーバにつけたい名前を任意で設定してください。

省略せずに書く場合はピリオドを最後につけて「nameserver.stray.cat.cafe.」とします。省略形を用いるなら、「nameserver」とだけ書いてください。ただしSOAレコードのdata部は省略形を使わないのが一般的です。

次はメールアドレスです。ゾーン管理者のメールアドレスを入力するのですが、@(アットマーク)は.(ドット)に置き換えてください。

例えばメールアドレスがsample@stray.cat.cafeの場合は「sample.stray.cat.cafe.」とします。こちらもサーバ名同様に省略ができます。今回は外部に公開しないサーバですのでメールアドレスは適当でかまいません。

次は()内に数値を入れます。基本的に外部やサブのDNSと連携する際に使われる情報です。サンプルでは見やすくするために各値の後に改行を入れています。

  • 連番

    「連番」は、更新のたび増やしていく数値です。初回は何番でもいいです。

  • 更新頻度

    更新頻度は新旧確認をさせる間隔で秒数で記載します。

  • 再試行待機

    再試行待機は更新頻度での問い合わせが失敗した際に再試行するまでの時間(秒数)です。

  • 破棄期限

    連携側は、正常に更新できない状態が続いたとき、破棄期限に設定した秒数を経過するとすべてのデータを破棄します。

  • 下限ttl

    下限ttlは行(レコード)毎にも設定できるttlの下限値を秒数で設定します。レコードでの設定でこれより低い値にした場合はここで設定した値になります。

()内の数値については連携時に使い今回の設定ではほぼ使いませんので、サンプルの通りに書き写すだけでもいいです。

NS

@ IN NS ネームサーバ名

NSレコードでゾーンのネームサーバ名を指定しています。ゾーンに対する設定なのでownerは@でいいと思いますが、ひとつ前の行でowner(@)を書いているなら記述自体不要です。

SOAレコードで設定したネームサーバ名は、NSレコードに存在しなければなりません。

data部の名称は省略形で書く事ができます。

A

名前 IN A IPアドレス

Aレコードは、名前(ドメイン)からIPアドレスを結びつける設定を記載します。名前は省略形で記載できます。

CNAME

別名 IN CNAME 名前

CNAMEレコードは、名前に別名をつけられます。名前、別名ともに省略形で記載できます。

名前に対するIPアドレスが固定されているなら、CNAMEレコードを使わずにAレコードに置き換えることもできます。

設定の確認とサービスの再起動

DNSの設定は多岐にわたるので、間違いが起きやすいです。その為に設定チェックツールが用意されています。

# named-checkconf -z

とするとエラーがあった場合はその場所がメッセージとして表示されます。

設定が終わったら、サービスを再起動させましょう。

# systemctl restart bind9

筆者の環境ではbind9というサービス名でしたが、バージョンによって変わるかもしれません。サービス名が不明な時はsystemctl list-unit-files --type=serviceとするとサービスの一覧が確認できますのでリストの中から探してください。

DHCPの設定の変更

今回の環境ではDHCPサーバを使っているので、そこから案内させるDNSサーバのIPアドレスを変更しないといけません。

# nano /etc/dhcp/dhcpd.conf

ここに記載されたoption domein-name-serversの値を今回設定したPCのアドレスに変更しましょう。

WindowsからDNSサーバにアクセスをする

設定がうまくいっていれば、ブラウザに設定した名前を入力するとページが表示されるようになります。

また、Windowsのコマンドプロンプトからはnslookupコマンドを使うことで、直接DNSサーバにアクセスすることもできます。

> nslookup
...
wellcome.my.house
...

何も指定しない場合は、type Aのデータを返します。他のデータを検索したい場合はnslookup実行中にtype変数に検索したいtypeを代入します。例えばSOAなら次のようになります。

...
> set type=soa
...
wellcome.my.house
...

とします。

nslookupから抜ける場合は

> exit

とします。

筆者紹介


自分の写真
がーふぁ、とか、ふぃんてっく、とか世の中すっかりハイテクになってしまいました。プログラムのコーディングに触れることもある筆者ですが、自分の作業は硯と筆で文字をかいているみたいな古臭いものだと思っています。 今やこんな風にブログを書くことすらAIにとって代わられそうなほど技術は進んでいます。 生活やビジネスでPCを活用しようとするとき、そんな第一線の技術と比べてしまうとやる気が失せてしまいがちですが、おいしいお惣菜をネットで注文できる時代でも、手作りの味はすたれていません。 提示されたもの(アプリ)に自分を合わせるのでなく、自分の活動にあったアプリを作る。それがPC活用の基本なんじゃなかと思います。 そんな意見に同調していただける方向けにLinuxのDebianOSをはじめとした基本無料のアプリの使い方を紹介できたらなと考えています。

広告