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の方がクセが少なく最初は扱いやすいかもしれません。設定ファイルの編集には管理者権限が必要な場合が多いので注意してください。
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の後の"(ダブルクォート)で囲った中にゾーン名称を記述しします。さらに、ゾーン名と検索名称(ドメイン)が一致した際に、確認しにいく明細がファイルの場所を指定します。
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アドレスから名前を取得する逆引きという機能も提供できます。その際は逆引きの情報も記載します。逆引きの場合は.in-addr.arpaという識別子を付けオクテットを逆に並べるので、たとえば192.168.1.0ネットワークの逆引き情報を記載するのなら、次のような記述になります。
named.conf.local
... zone "1.168.192.in-addr.arpa" IN { type master; file "/etc/bind/straycatcafe.reverse.dat"; };
ゾーン情報に含まれるもの
電話帳が住所、氏名、電話番号等様々な情報を保持するように、ゾーン情報にも種類(type)があります。その主なものは次の通りです。
項目 | type |
---|---|
DNSサーバ自身の情報 | SOA |
DNSサーバの名称→アドレス | NS |
端末の名称→アドレス | A |
端末のアドレス→名称 | PTR |
端末の別名 | CNAME |
メールサーバ情報 | MX |
他のテキスト情報 | TXT |
明細データ
ゾーン定義部(named.conf.local)で記述した明細ファイル内のデータ基本書式は次のようになります。
- owner
owner部分はドメインだったり、端末の名称が入ったりします。名称の最後に.(ドット)がついていない場合は、@に格納されている文字列が末尾に付与されます。
例えば、「sample」と記載したら、内部的には「sample.stray.cat.cafe」として扱われます。「sample.」とした場合は「sample」として扱われますが、それだと検索時に一致することはありません。省略せずに書くとしたら「sample.stray.cat.cafe.」となります。
また、一つ前の行とownerの部分が同じ場合は何も書かなくてもいいです。
- ttl
ttlは情報の有効期限の秒数となります。他のDNSサーバに自分のゾーン情報を教えるときに使われます。他のDNSサーバはここで設定した有効期限が過ぎるまでデータを保持します。
記述しなかった場合は最初に$TTLで設定した基本値が用いられます。
- class
classは現時点で用いられるのは「IN」のみです。「インターネット」の意味だそうです。
- type
typeには、前述の表にあるtypeを記述します。これにより次のdataで入力するデータの意味が変わります。
- data
dataの部分にはtypeに合わせて各種データを入力します。先ほどownerの部分でもありまししたが、NS、SOA、CNAME設定ではでは最後に.(ドット)がつかない場合は、@に格納されている文字列が最後に追加付与されます。
筆者が設定した実際のデータは次のようになっていました。
「$TTL = 86400」の部分だけ先の基本書式に則していません。データの基本有効期限を秒数で指定しています。
途中で利用されている@についてですが、 ゾーン情報の明細ファイル中の@(アットマーク)にはこのファイルの読み出し元(named.conf.local)で設定されたzone名称が格納されていて、代替文字として使用できます。ここでは「stray.cat.cafe.」が格納されています。
SOA
今回の設定で必要なtypeに絞ってdataの書式を確認していきます。まず、SOAです。
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
NSレコードでゾーンのネームサーバ名を指定しています。ゾーンに対する設定なのでownerは@と省略することができます。また、ownerはひとつ前の行と同じならownerの記述自体を省略することができます。
SOAレコードで設定したネームサーバ名は、NSレコードに存在しなければなりません。
data部の名称は省略形で書く事ができます。
A
Aレコードは、名前(ドメイン)からIPアドレスを結びつける設定を記載します。名前は省略形で記載できます。
CNAME
CNAMEレコードは、名前に別名をつけられます。名前、別名ともに省略形で記載できます。
名前に対するIPアドレスが固定されているなら、CNAMEレコードを使わずにAレコードに置き換えることもできます。
PTS
逆引きの時だけ他のエントリーと様子が違います。まず、通常の場合と逆引きの場合では、検索する値が違います。ファイルも別となり検索値はIPアドレスの数値となります。
設定の確認とサービスの再起動
DNSの設定は多岐にわたるので、間違いが起きやすいです。その為に設定チェックツールが用意されています。
とするとエラーがあった場合はその場所がメッセージとして表示されます。
設定が終わったら、サービスを再起動させましょう。
筆者の環境ではbind9というサービス名でしたが、バージョンによって変わるかもしれません。サービス名が不明な時はsystemctl list-unit-files --type=serviceとするとサービスの一覧が確認できますのでリストの中から探してください。
DHCPの設定の変更
今回の環境ではDHCPサーバを使っているので、そこから案内させるDNSサーバのIPアドレスを変更しないといけません。
ここに記載された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から抜ける場合は
とします。
また次のようにすることでも同じ結果が得られます。
nslookup -type=txt wellcome.my.house