InfraAcademy

InfraAcademy Blog

BINDのforwarders設定方法|DNS問い合わせを安全に転送する手順を解説

| #Linux #Linux初心者 #DNS
Linuxをブラウザで試してみる

Linux・ネットワーク・AWSを、環境構築なしで実践学習できます

こんにちは、フルスタックエンジニアのryuです。

今回の記事では、DNSサーバーの設定でforwardersを使う方法を解説します。フォワーダーを設定すると、自分のDNSサーバーだけでは回答できない問い合わせを、別のDNSリゾルバーへ転送できます。

ただし、転送先のIPアドレスを書くだけでは安全なDNSサーバーにはなりません。

再帰問い合わせを許可するクライアントの制限、forward firstforward onlyの違い、設定反映前の構文確認、DNSSECの扱いまで理解する必要があります。

この記事では、Ubuntu・Debian系のBINDを中心に、初心者でも確認しながら設定できるように順番に解説します。

【BIND】forwardersの設定方法解説

今回の記事では、bindのforwardersの設定方法について解説します。まずは、DNSのフォワードとは何なのかについて説明します。

DNSやBINDそのものがまだよくわからない方は、最初に次の記事を読むと理解しやすくなります。

【関連記事】DNSとは?名前解決の仕組みを初心者向けに解説

【関連記事】LinuxでBINDを使ってDNSサーバーを構築する方法

フォワードとは?

DNSのフォワードとは、自分で回答できないDNS問い合わせを、別のDNSサーバーへ転送する仕組みです。

BINDが管理しているゾーンや、すでにキャッシュへ保存されている情報で回答できない場合に、指定したフォワーダーへ問い合わせます。

フォワードの流れを分かるように、イラストを描いてみました。

DNSフォワード流れ まず、PCから名前解決を行います。名前解決を行うと指定されたDNSサーバーへ問い合わせを行います。しかし、問い合わせした先のDNSサーバーにレコードが無い場合、名前解決ができません。

正確には、レコードを持っていないDNSサーバーでも、再帰問い合わせを受け付けるリゾルバーであれば、ルートDNSサーバーなどへ問い合わせて回答できます。

forwardersを設定したBINDでは、その処理を自分で行う代わりに、指定したDNSリゾルバーへ任せられます。

フォワーダーを使う目的

フォワーダーは、問い合わせ先の集約、キャッシュの共有、内部DNSの連携などに使われます。

会社では端末からの問い合わせを社内DNSへ集約する構成があります。転送先の停止へ備え、複数台を設定することも検討します。

forwardersの動作を確認してみよう

forwardersの設定を行う前に、インターネットに接続しているPCでforwardersの動作を確認してみましょう。

まず、自分のPCのコマンドプロンプトを開いて、”www.google.com”と名前解決してみてください。コマンドは”nslookup”です。以下のように答えが返ってきます。

nslookup www.google.com

DNS動作確認 権限のない回答と返ってきました。私の環境では、WifiルータをDNSサーバーに指定しています。しかし、Wifiルーターはgoogleドメインの名前解決はできません。そのため、別のサーバに問い合わせを行っております。だから、権限のない回答と書かれています。

ここは少し補足が必要です。

権限のない回答Non-authoritative answerは、回答元がそのドメインの権威DNSサーバーではなく、キャッシュDNSサーバーなどだったことを表します。

Wi-Fiルーターが別のDNSへ転送したことだけが、表示される直接の理由ではありません。

【関連記事】nslookupのNon-authoritative answerとは?

Linuxでは、digを使うと問い合わせ先を指定できます。

dig @192.168.1.10 www.example.com

出力上部のstatus: NOERRORを確認し、ANSWER SECTIONに回答があれば名前解決は成功しています。

bindでforwardersの設定してみる

では、実際にbindでフォワードの設定をしてみましょう。まずは環境の準備からです。Linuxサーバーにbindをインストールしましょう。

この記事では、DNSサーバー①を192.168.1.10、転送先を192.168.1.2、クライアントを192.168.1.100として進めます。

bindをLinuxサーバーにインストールする

今回はLinux2台でDNSサーバーを構築しております。以下のような環境を構築しています。

フォワード環境構築 1つのサーバーで”test.com”ドメインの名前解決ができるように設定してください。設定の方法が分からない方はこちらの記事を参考にしてください。

BINDでDNSサーバーを構築する方法

Ubuntu・Debian系では、次のコマンドでBINDをインストールできます。

sudo apt update
sudo apt install bind9 bind9-utils dnsutils

Rocky Linux・AlmaLinux・RHEL系では、次のコマンドです。

sudo dnf install bind bind-utils
Linux 主な設定ファイル サービス名
Ubuntu・Debian /etc/bind/named.conf.options bind9
Rocky・AlmaLinux・RHEL /etc/named.conf named

この記事の具体例は、Ubuntu・Debian系のファイル構成で進めます。

forwardersの設定

bindの環境を構築できたら、forwardersの設定を行いましょう。

元記事ではnamed.config.optionsと記載していましたが、正しいファイル名はnamed.conf.optionsです。

まず、設定ファイルをバックアップします。

sudo cp /etc/bind/named.conf.options \
  /etc/bind/named.conf.options.bak

続いて、設定ファイルを開きます。

sudo vi /etc/bind/named.conf.options

optionsへforwardersを記述する

すべての再帰問い合わせを同じDNSへ転送する場合は、optionsブロックへ設定します。

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

    forwarders {
        192.168.1.2;
    };

    allow-recursion {
        127.0.0.1;
        192.168.1.0/24;
    };

    dnssec-validation auto;
};

forwardersには、転送先DNSリゾルバーのIPアドレスを記述します。

複数の転送先を使う場合は、次のように並べます。

forwarders {
    192.168.1.2;
    192.168.1.3;
};

BINDでは、各行やブロックの末尾にセミコロンが必要です。

allow-recursionで利用者を制限する

allow-recursionは、このDNSサーバーへ再帰問い合わせできるクライアントを制限します。

allow-recursion {
    127.0.0.1;
    192.168.1.0/24;
};

自分のネットワークに合わせて変更してください。

インターネット全体から再帰問い合わせを許可すると、DNS増幅攻撃へ悪用される可能性があります。

DNSSEC validationは無効化しない

元記事では、dnssec-validation auto;をコメントアウトするよう案内していました。

現在は、問題の原因を確認せずDNSSEC検証を無効化する方法はおすすめしません。

dnssec-validation auto;

autoでは、BINDが用意するルートのトラストアンカーを使ってDNSSEC検証を有効にします。

検証エラーが出た場合は、サーバー時刻、転送先DNSの応答、ファイアウォール、対象ドメインの署名状態を確認しましょう。

forward firstとforward onlyの違い

forwardersと一緒に理解したいのが、forwardです。

設定 動作
forward first; まずフォワーダーへ問い合わせ、失敗するとBIND自身が通常の再帰問い合わせを試す
forward only; 指定したフォワーダーだけへ問い合わせ、失敗しても自分では解決しない

forward firstがデフォルトです。

社内の方針で必ず上位DNSを経由させたい場合は、forward onlyを設定します。

options {
    forward only;

    forwarders {
        192.168.1.2;
        192.168.1.3;
    };
};

外部DNSへの直接通信が禁止されている環境では、forward firstでも自分自身の問い合わせは成功しません。

ネットワークと運用方針に合わせて選びましょう。

特定ドメインだけ転送する方法

特定の社内ドメインだけ、別のDNSへ転送することもできます。

zone "corp.example" {
    type forward;
    forward only;
    forwarders {
        10.0.0.53;
    };
};

この方法は、別拠点やクラウド上のプライベートDNSへ、特定ドメインだけ問い合わせたいときに使います。

グローバルのforwardersとは別の転送先を、ドメイン単位で指定できるのがポイントです。

設定を反映する

設定を変更した後は、いきなり再起動せず、最初に構文を確認します。

sudo named-checkconf /etc/bind/named.conf

何も表示されなければ、基本的な構文チェックは成功です。

ゾーンファイルも変更した場合は、named-checkzoneを実行します。

sudo named-checkzone test.com /etc/bind/db.test.com

問題がなければ、Ubuntu・Debian系では設定を再読み込みします。

sudo systemctl reload bind9
sudo systemctl status bind9

Red Hat系では、サービス名がnamedです。

sudo systemctl reload named

BINDの管理コマンドを使う方法もあります。

sudo rndc reload

元記事の/etc/init.d/bind9 restartは古い形式です。

現在のsystemd環境では、構文確認後にsystemctl reloadまたはrndc reloadを使い、必要な場合だけ再起動しましょう。

元記事の設定画面

設定ファイルの中身はこんな感じになります。

DNS設定ファイル 以上でフォワードの設定が完了です。DNSサーバーを再起動させて下さい。

画像は古い設定例で、DNSSEC検証を無効化しています。

現在は画像をそのまま入力せず、この記事で示したdnssec-validation auto;を維持してください。

forwardersの動作確認

設定を反映したら、最初に転送先DNSへ直接問い合わせます。

dig @192.168.1.2 www.example.com

続いて、forwardersを設定したDNSサーバー①へ問い合わせます。

dig @192.168.1.10 www.example.com

どちらもstatus: NOERRORとなり、回答が返れば転送できている可能性が高いです。

ログを確認する

Ubuntu・Debian系では、次のコマンドでログを確認できます。

sudo journalctl -u bind9 -f

Red Hat系では、サービス名をnamedへ変更します。

sudo journalctl -u named -f

connection timed outが出る場合は、転送先IP、53番ポート、ルーティング、ファイアウォールを確認します。

forwardersが動かないときの確認項目

名前解決できない場合は、原因を順番に切り分けます。

確認項目 コマンド・確認内容
設定構文 named-checkconf
BINDの状態 systemctl status bind9
転送先の応答 dig @転送先IP ドメイン名
再帰問い合わせ allow-recursion
通信経路 ip route、53番ポート
DNSSEC 時刻、署名、転送先の対応
ログ journalctl -u bind9

REFUSEDになる場合は、転送先DNSが再帰問い合わせを許可していない可能性があります。

SERVFAILの場合は、転送先の障害、DNSSEC検証失敗、設定ミスなどを確認してください。

forwardersの設定方法まとめ

今回の記事では、BINDのforwardersについて解説しました。

要点を整理すると、次のとおりです。

  • forwardersは、回答できない問い合わせを別のDNSへ転送する
  • Ubuntu・Debian系では/etc/bind/named.conf.optionsへ設定する
  • allow-recursionで利用できるクライアントを制限する
  • forward firstforward onlyでは、転送失敗後の動作が異なる
  • DNSSEC検証を理由なく無効化しない
  • 反映前にnamed-checkconfを実行する
  • digとログで転送先・BIND・クライアントを分けて確認する

forwardersはDNSの基本機能ですが、アクセス制御や障害時の動作まで考えて設定することが大切です。

その他のインフラ知識を身に付けたい方はこちらをご覧ください!

参考資料

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る