序章

DNS(ドメインネームシステム)は、Webサイトやサーバーの構成方法を学ぶときに、正しく理解するのが難しいコンポーネントであることがよくあります。 ほとんどの人はおそらくホスティング会社またはドメインレジストラが提供するDNSサーバーを使用することを選択しますが、独自のDNSサーバーを作成することにはいくつかの利点があります。

このガイドでは、Ubuntu16.04マシンにBind9DNSサーバーをキャッシュまたは転送DNSサーバーとしてインストールおよび構成する方法について説明します。 これらの2つの構成には、マシンのネットワークにサービスを提供するときに両方の利点があります。

前提条件と目標

このガイドを完了するには、最初にいくつかの一般的なDNS用語に精通している必要があります。 このガイドをチェックして、このガイドで実装するいくつかの概念について学習してください。

同様の目標を達成する2つの別個の構成(キャッシュと転送DNSサーバー)を示します。

フォローするには、2台のコンピューターにアクセスできる必要があります(そのうちの少なくとも1台はUbuntu 16.04サーバーである必要があります)。 1つはクライアントとして機能し、もう1つはDNSサーバーとして構成されます。 サーバーを適切な予備状態にするには、Ubuntu16.04初期サーバーセットアップガイドに従ってください。

構成例の詳細は次のとおりです。

役割 IPアドレス
DNSサーバー 192.0.2.2
クライアント 192.0.2.100

クエリにDNSサーバーを使用するようにクライアントマシンを構成する方法を示します。 ニーズに応じて、2つの異なる構成でDNSサーバーを構成する方法を示します。

DNSサーバーのキャッシュ

最初の構成は、キャッシングDNSサーバー用です。 このタイプのサーバーは、再帰クエリを処理し、一般に他のサーバーからDNSデータを追跡するといううんざりする作業を処理できるため、リゾルバーとも呼ばれます。

キャッシングDNSサーバーは、クライアントのクエリに対する回答を追跡すると、クライアントに回答を返します。 ただし、レコードのTTL値で許可されている期間、回答をキャッシュに保存します。 その後、キャッシュを後続のリクエストのソースとして使用して、ラウンドトリップの合計時間を短縮できます。

ネットワーク構成に含まれる可能性のあるほとんどすべてのDNSサーバーは、DNSサーバーをキャッシュします。 これらは、ほとんどのクライアントマシンに実装されている適切なDNSリゾルバーライブラリの不足を補います。 キャッシングDNSサーバーは、多くの状況に適しています。 ISPのDNSまたはその他の公開されているDNSサーバーに依存したくない場合は、独自のキャッシュサーバーを作成することをお勧めします。 クライアントマシンに物理的に近接している場合は、DNSクエリ時間も改善される可能性が非常に高くなります。

DNSサーバーの転送

ここで説明する2番目の構成は、転送DNSサーバーです。 転送DNSサーバーは、クライアントの観点からはキャッシングサーバーとほぼ同じように見えますが、メカニズムと作業負荷はまったく異なります。

転送DNSサーバーには、クライアントのDNS解決時間を改善するためにキャッシュを維持するという同じ利点があります。 ただし、実際には、再帰クエリ自体は実行されません。 代わりに、すべてのリクエストを外部の解決サーバーに転送し、結果をキャッシュして後のクエリに使用します。

これにより、転送サーバーはキャッシュから応答できますが、再帰クエリのすべての作業を実行する必要はありません。 これにより、サーバーは再帰ルーチン全体を実行する必要がなく、単一の要求(転送されたクライアント要求)のみを実行できます。 これは、外部帯域幅の転送にコストがかかる環境、キャッシュサーバーを頻繁に変更する必要がある環境、またはローカルクエリを1つのサーバーに転送し、外部クエリを別のサーバーに転送する場合に有利です。

DNSサーバーにBindをインストールします

使用する構成の選択に関係なく、Bind DNSサーバーを実装する最初のステップは、実際のソフトウェアをインストールすることです。

BindソフトウェアはUbuntuのデフォルトのリポジトリ内で利用できるため、ローカルパッケージインデックスを更新し、aptを使用してソフトウェアをインストールする必要があります。 ドキュメントといくつかの一般的なユーティリティも含まれます。

  1. sudo apt-get update
  2. sudo apt-get install bind9 bind9utils bind9-doc

Bindコンポーネントがインストールされたので、サーバーの構成を開始できます。 転送サーバーは、キャッシュサーバー構成を出発点として使用するため、最終目標に関係なく、最初にサーバーをキャッシュサーバーとして構成します。

キャッシングDNSサーバーとして構成する

最初に、キャッシングDNSサーバーとして機能するようにBindを構成する方法について説明します。 この構成では、クライアントがクエリを発行したときに、サーバーが他のDNSサーバーから再帰的に回答を探すように強制されます。 これは、応答全体が見つかるまで、関連する各DNSサーバーに順番にクエリを実行していることを意味します。

バインド構成ファイルは、デフォルトで/etc/bindのディレクトリに保存されます。 今すぐそのディレクトリに移動します。

  1. cd /etc/bind

このディレクトリ内のファイルの大部分については気にしません。 メインの構成ファイルはnamed.confと呼ばれます(namedbindは同じアプリケーションの2つの名前です)。 このファイルは、named.conf.optionsファイル、named.conf.localファイル、およびnamed.conf.default-zonesファイルを単にソースします。

キャッシングDNSサーバーの場合、named.conf.optionsファイルのみを変更します。 sudo権限を使用してテキストエディタでこれを開きます。

  1. sudo nano named.conf.options

読みやすくするためにコメントを削除すると、ファイルは次のようになります。

/etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

        dnssec-validation auto;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

キャッシングを設定するための最初のステップは、アクセス制御リスト(ACL)を設定することです。

再帰クエリを解決するために使用されるDNSサーバーとして、悪意のあるユーザーによってDNSサーバーが悪用されることは望ましくありません。 DNS増幅攻撃と呼ばれる攻撃は、サーバーが分散型サービス拒否攻撃に参加する可能性があるため、特に厄介です。

DNS増幅攻撃は、悪意のあるユーザーがインターネット上のサーバーまたはサイトを停止しようとする1つの方法です。 そうするために、彼らは再帰クエリを解決するパブリックDNSサーバーを見つけようとします。 彼らは被害者のIPアドレスを偽装し、DNSサーバーに大きな応答を返すクエリを送信します。 そうすることで、DNSサーバーは、被害者のサーバーに向けられた大きなペイロードで小さな要求に応答し、攻撃者の利用可能な帯域幅を効果的に増幅します。

パブリックで再帰的なDNSサーバーをホストするには、多くの特別な構成と管理が必要です。 サーバーが悪意のある目的で使用される可能性を回避するために、信頼できるIPアドレスまたはネットワーク範囲のリストを構成します。

optionsブロックの上に、aclという新しいブロックを作成します。 構成しているACLグループのラベルを作成します。 このガイドでは、グループをgoodclientsと呼びます。

/etc/bind/named.conf.options
acl goodclients {
};

options {
    . . .

このブロック内に、このDNSサーバーの使用を許可する必要があるIPアドレスまたはネットワークをリストします。 この例では、サーバーとクライアントの両方が同じ/ 24サブネット内で動作しているため、例をこのネットワークに限定します。 これを調整して、外部の関係者ではなく、自分のクライアントを含める必要があります。 また、これを自動的に実行しようとするlocalhostlocalnetsを追加します。

/etc/bind/named.conf.options
acl goodclients {
    192.0.2.0/24;
    localhost;
    localnets;
};

options {
    . . .

要求を解決するクライアントのACLができたので、optionsブロックでこれらの機能を構成できます。 このブロック内に、次の行を追加します。

/etc/bind/named.conf.options
. . .

options {
    directory "/var/cache/bind";

    recursion yes;
    allow-query { goodclients; };
    . . .

再帰を明示的にオンにしてから、ACL仕様を使用するようにallow-queryパラメーターを構成しました。 allow-recursionなどの別のパラメーターを使用して、ACLグループを参照することもできます。 存在し、再帰がオンの場合、allow-recursionは再帰サービスを使用できるクライアントのリストを指示します。

ただし、allow-recursionが設定されていない場合、Bindはallow-query-cacheリスト、allow-queryリスト、最後にデフォルトのlocalnetsおよび[ X142X]