こんにちは、フルスタックエンジニアのryuです。
今回の記事では、DNSサーバーの設定でforwardersを使う方法を解説します。フォワーダーを設定すると、自分のDNSサーバーだけでは回答できない問い合わせを、別のDNSリゾルバーへ転送できます。
ただし、転送先のIPアドレスを書くだけでは安全なDNSサーバーにはなりません。
再帰問い合わせを許可するクライアントの制限、forward firstとforward onlyの違い、設定反映前の構文確認、DNSSECの扱いまで理解する必要があります。
この記事では、Ubuntu・Debian系のBINDを中心に、初心者でも確認しながら設定できるように順番に解説します。
【BIND】forwardersの設定方法解説¶
今回の記事では、bindのforwardersの設定方法について解説します。まずは、DNSのフォワードとは何なのかについて説明します。
DNSやBINDそのものがまだよくわからない方は、最初に次の記事を読むと理解しやすくなります。
【関連記事】DNSとは?名前解決の仕組みを初心者向けに解説
【関連記事】LinuxでBINDを使ってDNSサーバーを構築する方法
フォワードとは?¶
DNSのフォワードとは、自分で回答できないDNS問い合わせを、別のDNSサーバーへ転送する仕組みです。
BINDが管理しているゾーンや、すでにキャッシュへ保存されている情報で回答できない場合に、指定したフォワーダーへ問い合わせます。
フォワードの流れを分かるように、イラストを描いてみました。
まず、PCから名前解決を行います。名前解決を行うと指定されたDNSサーバーへ問い合わせを行います。しかし、問い合わせした先のDNSサーバーにレコードが無い場合、名前解決ができません。
正確には、レコードを持っていないDNSサーバーでも、再帰問い合わせを受け付けるリゾルバーであれば、ルートDNSサーバーなどへ問い合わせて回答できます。
forwardersを設定したBINDでは、その処理を自分で行う代わりに、指定したDNSリゾルバーへ任せられます。
フォワーダーを使う目的¶
フォワーダーは、問い合わせ先の集約、キャッシュの共有、内部DNSの連携などに使われます。
会社では端末からの問い合わせを社内DNSへ集約する構成があります。転送先の停止へ備え、複数台を設定することも検討します。
forwardersの動作を確認してみよう¶
forwardersの設定を行う前に、インターネットに接続しているPCでforwardersの動作を確認してみましょう。
まず、自分のPCのコマンドプロンプトを開いて、”www.google.com”と名前解決してみてください。コマンドは”nslookup”です。以下のように答えが返ってきます。
nslookup www.google.com
権限のない回答と返ってきました。私の環境では、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”ドメインの名前解決ができるように設定してください。設定の方法が分からない方はこちらの記事を参考にしてください。
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サーバーを再起動させて下さい。
画像は古い設定例で、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 firstとforward onlyでは、転送失敗後の動作が異なる- DNSSEC検証を理由なく無効化しない
- 反映前に
named-checkconfを実行する digとログで転送先・BIND・クライアントを分けて確認する
forwardersはDNSの基本機能ですが、アクセス制御や障害時の動作まで考えて設定することが大切です。
その他のインフラ知識を身に付けたい方はこちらをご覧ください!