4.8. DNS レコードを上書きするように BIND で応答ポリシーゾーンを設定する
管理者は、DNS のブロックとフィルタリングを使用して、DNS 応答を書き換えて、特定のドメインまたはホストへのアクセスをブロックできます。BIND では、応答ポリシーゾーン (RPZ) がこの機能を提供します。NXDOMAIN
エラーを返す、クエリーに応答しないなど、ブロックされたエントリーに対してさまざまなアクションを設定できます。
環境内に複数の DNS サーバーがある場合は、この手順を使用してプライマリーサーバーで RPZ を設定し、後でゾーン転送を設定して、セカンダリーサーバーで RPZ を使用できるようにします。
前提条件
- BIND は、たとえばキャッシングネームサーバーとしてすでに設定されています。
-
named
またはnamed-chroot
サービスが実行しています。
手順
/etc/named.conf
ファイルを編集し、次の変更を行います。options
ステートメントにresponse-policy
定義を追加します。options { ... response-policy { zone "rpz.local"; }; ... }
response-policy
のzone
ステートメントで RPZ のカスタム名を設定できます。ただし、次のステップのゾーン定義で同じ名前を使用する必要があります。前の手順で設定した RPZ の
zone
定義を追加します。zone "rpz.local" { type master; file "rpz.local"; allow-query { localhost; 192.0.2.0/24; 2001:db8:1::/64; }; allow-transfer { none; }; };
これらの設定状態:
-
このサーバーは、
rpz.local
という名前の RPZ のプライマリーサーバー (type master
) です。 -
/var/named/rpz.local
ファイルはゾーンファイルです。この例のように相対パスを設定すると、このパスは、options
ステートメントのdirectory
に設定したディレクトリーからの相対パスになります。 -
allow-query
で定義されたホストは、この RPZ をクエリーできます。または、IP 範囲または BIND アクセス制御リスト (ACL) のニックネームを指定して、アクセスを制限します。 - どのホストもゾーンを転送できません。ゾーン転送を許可するのは、セカンダリーサーバーをセットアップする際に限られ、セカンダリーサーバーの IP アドレスに対してのみ許可します。
-
このサーバーは、
/etc/named.conf
ファイルの構文を確認します。# named-checkconf
コマンドが出力を表示しない場合は、構文に間違いがありません。
たとえば、次の内容で
/var/named/rpz.local
ファイルを作成します。$TTL 10m @ IN SOA ns1.example.com. hostmaster.example.com. ( 2022070601 ; serial number 1h ; refresh period 1m ; retry period 3d ; expire time 1m ) ; minimum TTL IN NS ns1.example.com. example.org IN CNAME . *.example.org IN CNAME . example.net IN CNAME rpz-drop. *.example.net IN CNAME rpz-drop.
このゾーンファイル:
-
リソースレコードのデフォルトの有効期限 (TTL) 値を 10 分に設定します。時間の
h
などの時間接尾辞がない場合、BIND は値を秒として解釈します。 - ゾーンに関する詳細を含む、必要な SOA (Start of Authority) リソースレコードが含まれます。
-
このゾーンの権威 DNS サーバーとして
ns1.example.com
を設定します。ゾーンを機能させるには、少なくとも 1 つのネームサーバー (NS
) レコードが必要です。ただし、RFC 1912 に準拠するには、少なくとも 2 つのネームサーバーが必要です。 -
このドメイン内の
example.org
およびホストへのクエリーに対してNXDOMAIN
エラーを返します。 -
このドメイン内の
example.net
およびホストにクエリーを破棄します。
アクションおよび例の完全なリストは、IETF draft: DNS Response Policy Zones (RPZ) を参照してください。
-
リソースレコードのデフォルトの有効期限 (TTL) 値を 10 分に設定します。時間の
/var/named/rpz.local
ファイルの構文を確認します。# named-checkzone rpz.local /var/named/rpz.local zone rpz.local/IN: loaded serial 2022070601 OK
BIND をリロードします。
# systemctl reload named
change-root 環境で BIND を実行する場合は、
systemctl reload named-chroot
コマンドを使用してサービスをリロードします。
検証
NXDOMAIN
エラーを返すように RPZ で設定されているexample.org
のホストを解決しようとします。# dig @localhost www.example.org ... ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 30286 ...
この例では、BIND が同じホストで実行し、
localhost
インターフェイスでクエリーに応答することを前提としています。RPZ でクエリーを破棄するように設定されている
example.net
ドメイン内のホストの解決を試みます。# dig @localhost www.example.net ... ;; connection timed out; no servers could be reached ...