CentOS 7でBINDをプライベートネットワークDNSサーバーとして設定する方法
CentOS 7を使用していませんか?別のバージョンまたはディストリビューションを選択してください。
紹介
サーバーの設定とインフラの管理において重要な要素の一つは、適切なドメインネームシステム(DNS)を設定することで、名前でネットワークインターフェースやIPアドレスを簡単に検索できるようにすることです。IPアドレスの代わりに完全修飾ドメイン名(FQDN)を使用してネットワークアドレスを指定すると、サービスやアプリケーションの設定が容易になり、設定ファイルの保守性が向上します。プライベートネットワークのために独自のDNSを設定することは、サーバーの管理を改善する素晴らしい方法です。
このチュートリアルでは、CentOS 7上のBIND名サーバーソフトウェア(BIND9)を使用して、内部DNSサーバーを設定する方法について説明します。このDNSサーバーは、仮想プライベートサーバー(VPS)がプライベートホスト名やプライベートIPアドレスを解決するために使用できるものです。これにより、内部ホスト名とプライベートIPアドレスを管理するための中央の方法が提供され、環境が数台のホストを超えるときには不可欠です。
このチュートリアルのUbuntuバージョンはここにあります。
前提条件
このチュートリアルを完了するには、以下が必要です:
- 同じデータセンターで運行しており、プライベートネットワークが有効になっているいくつかのサーバー
- プライマリーDNSサーバーとして機能する新しいVPS、ns1
- オプション:セカンダリDNSサーバーとして機能する新しいVPS、ns2
- 上記すべてへのルートアクセス(ステップ1-4)
DNSの概念に不慣れな場合は、DNS管理入門の最初の3部を少なくとも読むことをお勧めします。
例のホスト
例のために、以下のことを仮定します:
- 私たちは「host1」と「host2」と呼ばれる2つの既存のVPSを持っています。
- 両方のVPSはnyc3データセンターに存在します
- 両方のVPSはプライベートネットワークが有効になっており(10.128.0.0/16サブネット上にあります)
- 両方のVPSは、“example.com”で動作する私たちのウェブアプリケーションに何らかの形で関連しています。
これらの仮定に基づいて、プライベートサブネットまたはゾーンを指すために「nyc3.example.com」という命名スキームを使用することが理にかなっていると判断します。したがって、host1のプライベート完全修飾ドメイン名(FQDN)は「host1.nyc3.example.com」となります。関連する詳細は以下の表を参照してください。
| ホスト | 役割 | プライベートFQDN | プライベートIPアドレス |
|---|---|---|---|
| ホスト1 | 一般的なホスト1 | host1.nyc3.example.com | 10.128.100.101 |
| ホスト2 | 一般的なホスト 2 | host2.nyc3.example.com | 10.128.200.102 |
注: あなたの既存のセットアップは異なるでしょうが、例の名前とIPアドレスは、機能する内部DNSを提供するためのDNSサーバーの構成方法を示すために使用されます。ホスト名やプライベートIPアドレスを自分のものに置き換えることで、このセットアップを自分の環境に簡単に適応させることができるはずです。名前付けのスキームにデータセンターの地域名を使用する必要はありませんが、ここではこれらのホストが特定のデータセンターのプライベートネットワークに属していることを示すために使用しています。複数のデータセンターを利用する場合は、それぞれのデータセンター内に内部DNSを設定できます。
私たちの目標
このチュートリアルの終わりまでに、プライマリDNSサーバーであるns1と、オプションでバックアップとして機能するセカンダリDNSサーバーであるns2を持つことになります。
こちらは例の名前とIPアドレスの表です:
| ホスト | 役割 | プライベートFQDN | プライベートIPアドレス |
|---|---|---|---|
| ns1 | プライマリDNSサーバー | ns1.nyc3.example.com | 10.128.10.11 |
| ns2 | セカンダリDNSサーバー | ns2.nyc3.example.com | 10.128.20.12 |
まず、プライマリDNSサーバーであるns1をインストールするところから始めましょう。
DNSサーバーにBINDをインストールする
注意: 赤で強調されたテキストは重要です!これは、あなた自身の設定に置き換える必要があるものや、構成ファイルに修正または追加すべきものであることを示すために頻繁に使用されます。たとえば、host1.nyc3.example.comのようなものが表示された場合は、それを自分のサーバーのFQDNに置き換えてください。同様に、host1_private_IPが表示された場合は、それを自分のサーバーのプライベートIPアドレスに置き換えてください。
両方のDNSサーバー、ns1とns2に、yumを使ってBINDをインストールします:
- sudo yum install bind bind-utils
yを入力してプロンプトを確認してください。
BINDがインストールされたので、プライマリDNSサーバーを構成しましょう。
プライマリDNSサーバーを構成する
BINDの構成は複数のファイルで構成されており、これらはメインの構成ファイルであるnamed.confから含まれています。これらのファイル名は「named」で始まります。なぜなら、それがBINDが実行するプロセスの名前だからです。オプションファイルの設定から始めます。
バインドを設定する
BINDのプロセスはnamedとして知られています。そのため、多くのファイルは「named」ではなく「BIND」に言及しています。
ns1で、named.confファイルを編集のために開きます:
- sudo vi /etc/named.conf
既存のoptionsブロックの上に、「trusted」と呼ばれる新しいACLブロックを作成します。ここでは、再帰的DNSクエリを許可するクライアントのリストを定義します(すなわち、ns1と同じデータセンターにあるあなたのサーバー)。私たちの例のプライベートIPアドレスを使用して、ns1、ns2、host1、およびhost2を信頼されたクライアントのリストに追加します。
acl "trusted" {
10.128.10.11; # ns1 - can be set to localhost
10.128.20.12; # ns2
10.128.100.101; # host1
10.128.200.102; # host2
};
信頼できるDNSクライアントのリストができたので、optionsブロックを編集したいと思います。ns1のプライベートIPアドレスをlisten-on port 53ディレクティブに追加し、listen-on-v6行をコメントアウトしてください:
options {
listen-on port 53 { 127.0.0.1; 10.128.10.11; };
# listen-on-v6 port 53 { ::1; };
...
これらのエントリの下で、allow-transfer ディレクティブを「none」からns2のプライベートIPアドレスに変更します。また、allow-query ディレクティブを「localhost」から「trusted」に変更します:
...
options {
...
allow-transfer { 10.128.20.12; }; # disable zone transfers by default
...
allow-query { trusted; }; # allows queries from "trusted" clients
...
ファイルの最後に、以下の行を追加してください:
include "/etc/named/named.conf.local";
今、named.confを保存して終了してください。上記の設定は、あなたのサーバー(「信頼された」サーバー)のみがあなたのDNSサーバーにクエリを行えることを指定しています。
次に、DNSゾーンを指定するためにローカルファイルを設定します。
ローカルファイルを設定する
ns1で、named.conf.localファイルを編集のために開きます:
- sudo vi /etc/named/named.conf.local
ファイルは空であるべきです。ここで、私たちはフォワードゾーンとリバースゾーンを指定します。
以下の行を使ってフォワードゾーンを追加してください(ゾーン名は自分のものに置き換えてください):
zone "nyc3.example.com" {
type master;
file "/etc/named/zones/db.nyc3.example.com"; # zone file path
};
私たちのプライベートサブネットが10.128.0.0/16であると仮定すると、次の行を使用して逆ゾーンを追加します(私たちの逆ゾーン名は「128.10」で始まることに注意してください。これは「10.128」のオクテットの反転です):
zone "128.10.in-addr.arpa" {
type master;
file "/etc/named/zones/db.10.128"; # 10.128.0.0/16 subnet
};
サーバーが複数のプライベートサブネットにまたがっている場合でも、同じデータセンター内にある場合は、各サブネットごとに追加のゾーンとゾーンファイルを指定してください。希望するすべてのゾーンを追加し終えたら、named.conf.local ファイルを保存して終了します。
ゾーンがBINDで指定されたので、対応するフォワードゾーンファイルとリバースゾーンファイルを作成する必要があります。
フォワードゾーンファイルを作成する
フォワードゾーンファイルは、フォワードDNSルックアップのためのDNSレコードを定義する場所です。つまり、DNSが名前クエリを受け取ると、例えば「host1.nyc3.example.com」のように、フォワードゾーンファイルを参照してhost1の対応するプライベートIPアドレスを解決します。
ゾーンファイルが保存されるディレクトリを作成しましょう。私たちの named.conf.local 設定によれば、その場所は /etc/named/zones であるべきです。
- sudo chmod 755 /etc/named
- sudo mkdir /etc/named/zones
さあ、前方ゾーンファイルを編集しましょう。
- sudo vi /etc/named/zones/db.nyc3.example.com
まず、SOAレコードを追加する必要があります。ハイライトされたns1 FQDNを自分のFQDNに置き換え、次に二つ目の「nyc3.example.com」を自分のドメインに置き換えます。ゾーンファイルを編集するたびに、serial値をインクリメントする必要があり、namedプロセスを再起動する前に「3」にインクリメントします。これを基にすると、以下のように見えるはずです:
@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
その後、次の行を使ってネームサーバーレコードを追加します(名前は自分のものに置き換えてください)。第二の列は、これらが「NS」レコードであることを指定しています。
; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.
次に、このゾーンに属するホストのAレコードを追加します。これには、「.nyc3.example.com」で終わる名前を持つサーバーが含まれます(名前やプライベートIPアドレスを代入してください)。例の名前とプライベートIPアドレスを使用して、ns1、ns2、host1、およびhost2のAレコードを次のように追加します:
; name servers - A records
ns1.nyc3.example.com. IN A 10.128.10.11
ns2.nyc3.example.com. IN A 10.128.20.12
; 10.128.0.0/16 - A records
host1.nyc3.example.com. IN A 10.128.100.101
host2.nyc3.example.com. IN A 10.128.200.102
db.nyc3.example.comファイルを保存して終了します。
私たちの最終的な例のフォワードゾーンファイルは次のようになります:
- $TTL 604800
- @ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
- 3 ; Serial
- 604800 ; Refresh
- 86400 ; Retry
- 2419200 ; Expire
- 604800 ) ; Negative Cache TTL
- ;
- ; name servers - NS records
- IN NS ns1.nyc3.example.com.
- IN NS ns2.nyc3.example.com.
-
- ; name servers - A records
- ns1.nyc3.example.com. IN A 10.128.10.11
- ns2.nyc3.example.com. IN A 10.128.20.12
-
- ; 10.128.0.0/16 - A records
- host1.nyc3.example.com. IN A 10.128.100.101
- host2.nyc3.example.com. IN A 10.128.200.102
それでは、リバースゾーンファイルに移りましょう。
リバースゾーンファイルを作成する
逆ゾーンファイルは、逆DNSルックアップのためのDNS PTRレコードを定義する場所です。つまり、DNSがIPアドレスによるクエリ(例えば「10.128.100.101」)を受け取ると、対応するFQDN(この場合は「host1.nyc3.example.com」)を解決するために逆ゾーンファイルを検索します。
ns1で、named.conf.localファイルに指定された各逆引きゾーンに対して、逆引きゾーンファイルを作成します。
named.conf.localで定義された逆ゾーンに対応する逆ゾーンファイルを編集してください。
- sudo vi /etc/named/zones/db.10.128
フォワードゾーンファイルと同様に、強調表示されたns1 FQDNを自分のFQDNに置き換え、次に2つ目の「nyc3.example.com」を自分のドメインに置き換えます。ゾーンファイルを編集するたびに、シリアル値をインクリメントしてからnamedプロセスを再起動する必要があります–私たちはそれを「3」にインクリメントします。次のようになるはずです:
@ IN SOA ns1.nyc3.example.com. admin.nyc3.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
その後、次の行を使ってネームサーバーレコードを追加します(名前は自分のものに置き換えてください)。第二列は、これらが「NS」レコードであることを示しています。
; name servers - NS records
IN NS ns1.nyc3.example.com.
IN NS ns2.nyc3.example.com.
次に、編集しているゾーンファイルのサブネット上にあるすべてのサーバーに対してPTRレコードを追加します。この例では、すべてのホストが10.128.0.0/16サブネット上にあるため、すべてが含まれます。最初の列には、サーバーのプライベートIPアドレスの最後の2オクテットが逆順に表示されることに注意してください。サーバーに合わせて名前とプライベートIPアドレスを必ず置き換えてください:
; PTR Records
11.10 IN PTR ns1.nyc3.example.com. ; 10.128.10.11
12.20 IN PTR ns2.nyc3.example.com. ; 10.128.20.12
101.100 IN PTR host1.nyc3.example.com. ; 10.128.100.101
102.200 IN PTR host2.nyc3.example.com. ; 10.128.200.102
逆引きゾーンファイルを保存して終了します(さらに逆引きゾーンファイルを追加する必要がある場合は、このセクションを繰り返してください)。
私たちの最終的な例の逆ゾーンファイルは次のようになります:
- $TTL 604800
- @ IN SOA nyc3.example.com. admin.nyc3.example.com. (
- 3 ; Serial
- 604800 ; Refresh
- 86400 ; Retry
- 2419200 ; Expire
- 604800 ) ; Negative Cache TTL
- ; name servers
- IN NS ns1.nyc3.example.com.
- IN NS ns2.nyc3.example.com.
-
- ; PTR Records
- 11.10 IN PTR ns1.nyc3.example.com. ; 10.128.10.11
- 12.20 IN PTR ns2.nyc3.example.com. ; 10.128.20.12
- 101.100 IN PTR host1.nyc3.example.com. ; 10.128.100.101
- 102.200 IN PTR host2.nyc3.example.com. ; 10.128.200.102
BIND 設定構文を確認する
次のコマンドを実行して、named.conf*ファイルの構文を確認してください:
- sudo named-checkconf
名前付き構成ファイルに構文エラーがなければ、シェルプロンプトに戻り、エラーメッセージは表示されません。構成ファイルに問題がある場合は、エラーメッセージと「プライマリDNSサーバーの構成」セクションを確認し、再度named-checkconfを試してください。
named-checkzone コマンドは、ゾーンファイルの正確性を確認するために使用できます。最初の引数はゾーン名を指定し、2番目の引数は対応するゾーンファイルを指定します。これらは両方とも named.conf.local に定義されています。
例えば、“nyc3.example.com” のフォワードゾーン設定を確認するには、次のコマンドを実行します(名前をフォワードゾーンとファイルに合わせて変更してください):
- sudo named-checkzone nyc3.example.com /etc/named/zones/db.nyc3.example.com
そして「128.10.in-addr.arpa」の逆引きゾーン設定を確認するために、次のコマンドを実行してください(数字をあなたの逆引きゾーンとファイルに合わせて変更してください):
- sudo named-checkzone 128.10.in-addr.arpa /etc/named/zones/db.10.128
すべての構成ファイルとゾーンファイルにエラーがない場合、BINDサービスを再起動する準備が整ったことになります。
BINDを開始する
BINDを開始:
- sudo systemctl start named
今、それを有効にしたいと思いますので、起動時に開始するようにします。
- sudo systemctl enable named
あなたのプライマリDNSサーバーは現在設定され、DNSクエリに応答する準備が整いました。次に、セカンダリDNSサーバーの作成に移りましょう。
セカンダリDNSサーバーを構成する
ほとんどの環境では、プライマリDNSが利用できなくなった場合にリクエストに応答するセカンダリDNSサーバーを設定することが良いアイデアです。幸いなことに、セカンダリDNSサーバーは設定がはるかに簡単です。
ns2で、named.confファイルを編集します:
- sudo vi /etc/named.conf
注意:これらの指示をスキップしたい場合は、ns1のnamed.confファイルをコピーし、ns2のプライベートIPアドレスでリッスンするように変更し、転送を許可しないようにできます。
既存のoptionsブロックの上に、「trusted」と呼ばれる新しいACLブロックを作成します。ここでは、再帰的DNSクエリを許可するクライアントのリストを定義します(すなわち、ns1と同じデータセンターにあるあなたのサーバー)。私たちの例のプライベートIPアドレスを使用して、ns1、ns2、host1、およびhost2を信頼されたクライアントのリストに追加します。
acl "trusted" {
10.128.10.11; # ns1 - can be set to localhost
10.128.20.12; # ns2
10.128.100.101; # host1
10.128.200.102; # host2
};
信頼できるDNSクライアントのリストができたので、optionsブロックを編集したいと思います。ns1のプライベートIPアドレスをlisten-on port 53ディレクティブに追加し、listen-on-v6行をコメントアウトしてください:
options {
listen-on port 53 { 127.0.0.1; 10.128.20.12; };
# listen-on-v6 port 53 { ::1; };
...
allow-query ディレクティブを「localhost」から「trusted」に変更します:
...
options {
...
allow-query { trusted; }; # allows queries from "trusted" clients
...
ファイルの最後に、以下の行を追加してください:
include "/etc/named/named.conf.local";
今、named.confを保存して終了してください。上記の設定は、あなた自身のサーバー(「信頼できる」もの)だけがあなたのDNSサーバーにクエリを行えることを指定しています。
次に、DNSゾーンを指定するためにローカルファイルを設定します。
named.confを保存して終了します。
今、named.conf.localファイルを編集してください:
- sudo chmod 755 /etc/named
- sudo vi /etc/named/named.conf.local
プライマリDNSサーバーのマスターゾーンに対応するスレーブゾーンを定義します。タイプは「スレーブ」であり、ファイルにはパスが含まれておらず、プライマリDNSサーバーのプライベートIPに設定する必要があるmastersディレクティブがあります。プライマリDNSサーバーで複数の逆引きゾーンを定義した場合は、すべてここに追加してください:
- zone "nyc3.example.com" {
- type slave;
- file "slaves/db.nyc3.example.com";
- masters { 10.128.10.11; }; # ns1 private IP
- };
-
- zone "128.10.in-addr.arpa" {
- type slave;
- file "slaves/db.10.128";
- masters { 10.128.10.11; }; # ns1 private IP
- };
今、named.conf.localを保存して終了してください。
次のコマンドを実行して、設定ファイルの有効性を確認してください:
- sudo named-checkconf
それが確認できたら、BINDを開始します:
- sudo systemctl start named
ブート時にBINDを起動するように設定する:
sudo systemctl enable named
今、プライベートネットワークの名前とIPアドレス解決のためのプライマリおよびセカンダリDNSサーバーがあります。今、あなたはサーバーをプライベートDNSサーバーを使用するように設定しなければなりません。
DNSクライアントを設定する
「信頼された」ACL内のすべてのサーバーがDNSサーバーにクエリを送信する前に、各サーバーをns1およびns2をネームサーバーとして使用するように設定する必要があります。このプロセスはOSによって異なりますが、ほとんどのLinuxディストリビューションでは、/etc/resolv.confファイルにネームサーバーを追加することが含まれます。
CentOSクライアント
CentOS、RedHat、Fedora Linux VPSでは、単にresolv.confファイルを編集します:
- sudo vi /etc/resolv.conf
次に、ファイルの上部に以下の行を追加します(あなたのプライベードドメイン、ns1 および ns2 のプライベートIPアドレスに置き換えてください):
search nyc3.example.com # your private domain
nameserver 10.128.10.11 # ns1 private IP address
nameserver 10.128.20.12 # ns2 private IP address
今すぐ保存して終了してください。あなたのクライアントは、あなたのDNSサーバーを使用するように設定されました。
Ubuntuクライアント
UbuntuやDebian Linux VPSでは、起動時にresolv.confの先頭に追加されるheadファイルを編集できます。
- sudo vi /etc/resolvconf/resolv.conf.d/head
以下の行をファイルに追加してください(あなたのプライベートドメインおよびns1およびns2のプライベートIPアドレスを置き換えてください):
search nyc3.example.com # your private domain
nameserver 10.128.10.11 # ns1 private IP address
nameserver 10.128.20.12 # ns2 private IP address
それでは、resolvconfを実行して新しいresolv.confファイルを生成します:
- sudo resolvconf -u
あなたのクライアントは現在、あなたのDNSサーバーを使用するように設定されています。
テストクライアント
nslookupを使用してください。これは「bind-utils」パッケージに含まれています。クライアントが名前サーバーを問い合わせできるかどうかをテストするために使用します。「trusted」ACLに設定されたすべてのクライアントでこれを行うことができるはずです。
フォワードルックアップ
例えば、以下のコマンドを実行することで、host1.nyc3.example.com のIPアドレスを取得するための前方検索を行うことができます:
- nslookup host1
「host1」をクエリすると、「host1.nyc3.example.com」に展開されるのは、searchオプションがあなたのプライベートサブドメインに設定されているためであり、DNSクエリは他の場所でホストを探す前にそのサブドメインを見ようとします。上記のコマンドの出力は次のようになります:
Output:Server: 10.128.10.11
Address: 10.128.10.11#53
Name: host1.nyc3.example.com
Address: 10.128.100.101
リバースルックアップ
host1のプライベートIPアドレスを使ってDNSサーバーにクエリを送信して、逆引きテストを行います。
- nslookup 10.128.100.101
次のような出力が表示されるはずです:
Output:Server: 10.128.10.11
Address: 10.128.10.11#53
11.10.128.10.in-addr.arpa name = host1.nyc3.example.com.
すべての名前とIPアドレスが正しい値に解決される場合、あなたのゾーンファイルが適切に構成されていることを意味します。予期しない値を受け取った場合は、プライマリDNSサーバーのゾーンファイル(例:db.nyc3.example.comおよびdb.10.128)を確認してください。
おめでとうございます!あなたの内部DNSサーバーは今、正しく設定されました!次に、ゾーンレコードの管理について説明します。
DNSレコードの管理
内部DNSが機能しているので、DNSレコードを維持して、サーバー環境を正確に反映させる必要があります。
DNSにホストを追加する
環境にホストを追加するたびに(同じデータセンター内で)、DNSにも追加する必要があります。以下は、実行する必要がある手順のリストです:
プライマリネームサーバー
- ゾーンファイルを更新します: 新しいホストのために「A」レコードを追加し、「シリアル」の値を増加させます。
- 逆ゾーンファイル:新しいホストのために「PTR」レコードを追加し、「シリアル」の値を増加させてください。
- 新しいホストのプライベートIPアドレスを「trusted」ACL(
named.conf.options)に追加してください。
次にBINDを再読み込みします:
- sudo systemctl reload named
セカンダリネームサーバー
- 新しいホストのプライベートIPアドレスを「trusted」ACL(
named.conf.options)に追加してください。
次にBINDを再読み込みします:
- sudo systemctl reload named
新しいホストを設定してDNSを使用する
- resolv.confを設定して、DNSサーバーを使用する
nslookupを使用してテストする
DNSからホストを削除する
環境からホストを削除する場合や、単にDNSから削除したい場合は、DNSにサーバーを追加した際に追加されたすべてのものを削除してください(つまり、上記の手順の逆です)。
結論
これで、サーバーのプライベートネットワークインターフェースをIPアドレスではなく名前で参照できるようになりました。これにより、サービスやアプリケーションの設定が容易になり、プライベートIPアドレスを覚える必要がなくなり、ファイルも読みやすく理解しやすくなります。また、これで新しいサーバーを指すように設定を変更できるのは、さまざまな分散設定ファイルを編集するのではなく、プライマリDNSサーバーという1か所で済むため、メンテナンスが容易になります。
内部DNSが設定され、構成ファイルがネットワーク接続を指定するためにプライベートFQDNを使用している場合、DNSサーバーが適切に保守されていることが重要です。どちらのDNSサーバーも利用できなくなると、それらに依存するサービスやアプリケーションは正常に機能しなくなります。そのため、DNSを少なくとも1つのセカンダリサーバーで設定し、すべてのバックアップが機能していることを維持することをお勧めします。