このチュートリアルでは、BINDDNSリゾルバーのパブリックDNSレコードを応答ポリシーゾーンでオーバーライドする方法を示します。 (RPZ)Debian/Ubuntuで。
応答ポリシーゾーンとは何ですか?
対応ポリシーゾーン (RPZ)は、DNSリゾルバーがDNSレコードを変更できるようにします。もともとは危険なウェブサイトへのアクセスをブロックする方法として開発されました。たとえば、コンピューターがマルウェアを拡散する既知の危険なサイトのIPアドレスを照会すると、DNSリゾルバーは127.0.0.1
を返すことができます。 DNS応答として、コンピュータが危険なサイトに接続できないようにします。これは元のユースケースです。そのため、応答ポリシーゾーンはDNSファイアウォールとも呼ばれます。 。
RPZは他の方法で使用できます。たとえば、
- ローカルネットワークにNextcloudのようなセルフホストサービスがある場合は、RPZを使用してNextcloudドメイン(nextcloud.your-domain.com)をローカルIPアドレスにポイントできるため、外出する必要はありません。インターネットに接続してから、ローカルネットワークに戻ってNextcloudサーバーにアクセスします。
- 親はRPZを使用して、子供がポルノサイトにアクセスするのをブロックできます。
- 不要な広告をブロックできます。
- VPSに多くのWebアプリケーションをインストールします。ウェブアプリがパブリックアクセスを目的としていない場合、ハッキングを防ぐために、BIND RPZにのみDNSレコードを追加し、ドメインレジストラでDNSレコードを公開しません。
はい、/etc/hosts
にDNSエントリを作成できます ローカルコンピューター上のファイルを使用してパブリックDNSレコードを上書きしますが、拡張性が高くありません。さらに、iOSとAndroidではローカルDNSエントリを作成できません。 BIND DNSリゾルバーがパブリックDNSレコードをオーバーライドして、BINDリゾルバーを使用するネットワーク内のすべてのデバイスがカスタムDNSレコードを使用できるようにすると便利ではないでしょうか?
前提条件
このチュートリアルに従うために、Debian/UbuntuサーバーでBINDDNSリゾルバーが実行されていることを前提としています。そうでない場合は、次のチュートリアルのいずれかを読んで、BINDリゾルバーを設定してください。
- Debian10バスターで独自のBIND9DNSリゾルバーを設定する
- Ubuntu 16.04/18.04で独自のBIND9DNSリゾルバーを設定する
- Ubuntu20.04で独自のBIND9DNSリゾルバーを設定する
BIND Resolverが起動して実行されたら、以下の手順に従ってください。
Debian/UbuntuサーバーでBIND応答ポリシーゾーンを設定する方法
まず、named.conf.options
を編集します ファイル。
sudo nano /etc/bind/named.conf.options
options {...}
に次の行を追加します 応答ポリシーゾーンを有効にする句。 (最初の行はコメントです。)
//enable response policy zone. response-policy { zone "rpz.local"; };
ファイルを保存して閉じます。次に、named.conf.local
を開きます ファイル。
sudo nano /etc/bind/named.conf.local
このファイルにRPZゾーンを追加します。
zone "rpz.local" { type master; file "/etc/bind/db.rpz.local"; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; };
注:
-
file
では、単純なファイル名ではなく絶対パスを使用することが重要です。 ディレクティブ、またはBINDは、ファイルが/var/cache/bind/
にあると想定します 。 - RPZゾーンでは、ローカルホストからのクエリのみを許可する必要があります。ローカルネットワーククライアントを追加する必要はありません。
-
12.34.56.78
を置き換えます ゾーン転送を実行できるスレーブBINDDNSリゾルバーのIPアドレスを使用します。 DNSリゾルバーが1つしかない場合は、localhost
を使用できます このように:allow-transfer { localhost; };
ファイルを保存して閉じます。次に、ゾーンファイルを作成する必要があります。ゾーンファイルを最初から作成する代わりに、ゾーンテンプレートファイルを使用できます。 db.empty
のコンテンツをコピーします 新しいファイルに。
sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local
次に、db.rpz
を編集します ファイル。
sudo nano /etc/bind/db.rpz.local
既存のコンテンツを変更する必要はありません。カスタムDNSレコードを追加するだけです。たとえば、ローカルネットワーク上にIPアドレス192.168.0.103のNextcloudサーバーがある場合は、次のDNSレコードを追加するため、NextcloudクライアントはNextcloudサーバーに接続するためにインターネットに接続する必要はありません。 。
nextcloud.your-domain.com A 192.168.0.103
子供にpornhub.comなどのポルノサイトにアクセスさせたくない場合は、このファイルに次の行を追加して、pornhub.comドメイン全体をブロックします。
*.pornhub.com CNAME .
ウェブページにGoogleAdSense広告を表示したくない場合は、次の行を追加してdoubleclick.net
をブロックできます。 ドメイン。AdSense広告の配信に使用されます。
*.doubleclick.net CNAME .
ブロックできる広告サーバードメインは次のとおりです。
*.pubmatic.com CNAME . *.mopub.com CNAME . *.eskimi.com CNAME . *.adcolony.xyz CNAME . *.adsrvr.org CNAME . *.adsymptotic.com CNAME . *.servedby-buysellads.com CNAME . srv.buysellads.com CNAME . *.powerinboxedge.com CNAME . *.defof.com CNAME . *.licasd.com CNAME . *.liadm.com CNAME .
ドメイン名のMXレコードを上書きするには、次のような行を追加します。
example.com MX 0 mail.example.com.
注 左側の名前はすべてドットで終わらせてはならず、右側の名前はすべてドットで終わらせてはなりません。
ホスト名の負荷分散が必要な場合は、以下のように複数の値を持つレコードを作成します。 DNSクライアントは2つのIPアドレスをランダムに使用し、トラフィックはそれらの間で分散されます。
host.example.com A 12.34.56.78 A 12.34.56.79
ファイルを保存して閉じます。ログをより適切に分析するために、RPZ用に別のログファイルを使用することをお勧めします。構成するには、BINDメイン構成ファイルを編集します。
sudo nano /etc/bind/named.conf
次の行をファイルに追加します。
logging { channel rpzlog { file "/var/log/named/rpz.log" versions unlimited size 100m; print-time yes; print-category yes; print-severity yes; severity info; }; category rpz { rpzlog; }; };
ファイルを保存して閉じます。次に、/var/log/named/
を作成します ディレクトリを作成し、bind
を作成します 所有者として。
sudo mkdir /var/log/named/ sudo chown bind:bind /var/log/named/ -R
次に、次のコマンドを実行して、メイン構成ファイルに構文エラーがあるかどうかを確認します。サイレント出力は、エラーが見つからないことを示します。
sudo named-checkconf
次に、RPZゾーンファイルの構文を確認します。
sudo named-checkzone rpz /etc/bind/db.rpz.local
エラーが見つからない場合は、BIND9を再起動します。
sudo systemctl restart bind9
これで、dig
を実行できます BINDサーバーでコマンドを実行して、RPZが機能しているかどうかを確認します。たとえば、応答ポリシーゾーンに含まれているドメイン名のDNSレコードをクエリします。
dig A nextcloud.your-domain.com @127.0.0.1
コマンド出力に次のようなものが表示されます。これは、DNS応答がローカルRPZから提供されたことを示しています。
;; AUTHORITY SECTION: rpz.local 86400 IN NS localhost.
BIND9クエリログを確認することもできます。
sudo tail /var/log/named/rpz.log
以下のようなものが表示されます。これは、応答がローカルRPZから提供されたことを意味します。
(example.com): rpz QNAME Local-Data rewrite example.com via example.com.rpz.local
FedoraクライアントはRPZを使用しませんか?
デフォルトでは、FedoraはRPZを使用しません。 dig
を使用できます RPZゾーンでホスト名のIPアドレスを検索するコマンドラインユーティリティですが、ホスト名にpingを実行すると、IPアドレスが見つかりません。
この問題を解決するには、/etc/nsswitch.conf
のhostsパラメータを変更する必要があります Fedoraクライアント上のファイル。
sudo nano /etc/nsswitch.conf
デフォルトでは、hostsパラメータは次のように定義されています:
hosts: files myhostname mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns
次のように変更します:
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname mymachines
ファイルを保存して閉じます。 RPZは現在機能しているはずです。
フォワーダーでのRPZの使用
fowarders
を追加した場合 options
の以下のようなディレクティブ /etc/bind/named.conf.options
の句 ファイルの場合、BINDリゾルバーはフォワーダーになります。フォワーダーはDNS要求を8.8.8.8
のようなアップストリームDNSリゾルバーに転送します 。
options { directory "/var/cache/bind"; // If there is a firewall between you and nameservers you want // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 // If your ISP provided one or more IP addresses for stable // nameservers, you probably want to use them as forwarders. // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. forwarders { 8.8.8.8; 8.8.4.4; }; ... };
応答ポリシーゾーンは、このフォワーダー設定で機能します。バインドは、最初にローカル応答ポリシーゾーンを照会します。 DNSレコードがRPZで見つからない場合、要求はアップストリームDNSリゾルバーに転送されます。独自のBINDリゾルバーがDNS名の解決に時間がかかりすぎる場合は、フォワーダーを使用してDNS解決を高速化することをお勧めします。
ゾーン転送の構成
別のBINDDNSリゾルバーがある場合は、マスターDNSリゾルバーから更新を自動的に受信するようにスレーブリゾルバーとして構成できます。
まず、/etc/bind/named.conf.local
を編集する必要があります マスターDNSリゾルバー上のファイル 。
sudo nano /etc/bind/named.conf.local
スレーブDNSリゾルバーのIPアドレスをallow-transfer
に追加します ディレクティブ。
zone "rpz.local" { type master; file "/etc/bind/db.rpz.local"; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; also-notify { 12.34.56.78; }; };
複数のスレーブDNSリゾルバーがある場合は、以下のように複数のIPアドレスを追加します。
allow-transfer { 12.34.56.78; 12.34.56.79; };
also-notify
ディレクティブは、RPZゾーンが変更されたときに、マスターDNSリゾルバーがスレーブリゾルバーに通知メッセージを送信するようにします。ファイルを保存して閉じます。変更を有効にするには、BINDを再起動します。
sudo systemctl restart bind9
マスターDNSリゾルバーでファイアウォールが実行されている場合は、スレーブDNSリゾルバーがポート53に接続できるようにする必要があります。たとえば、UFWファイアウォールを使用している場合は、次のコマンドを実行します。
sudo ufw insert 1 allow in from 12.34.56.78 to any port 53
次に、named.conf.options
を編集します スレーブDNSリゾルバー上のファイル 。
sudo nano /etc/bind/named.conf.options
options {...}
に次の行を追加します 応答ポリシーゾーンを有効にする句。 (最初の行はコメントです。)
//enable response policy zone. response-policy { zone "rpz.local"; };
ファイルを保存して閉じます。次に、named.conf.local
を編集します ファイル。
sudo nano /etc/bind/named.conf.local
このファイルにスレーブRPZゾーンを追加します。 11.22.33.44をマスターDNSリゾルバーのIPアドレスに置き換えます。
zone "rpz.local" { type slave; file "db.rpz.local"; masters { 11.22.33.44;}; allow-notify { 11.22.33.44; }; allow-transfer { none; }; allow-query { localhost; }; };
ファイルを保存して閉じます。
また、マスターDNSリゾルバーがnotify
を送信できるように、スレーブリゾルバーのファイアウォールを構成する必要があります。 メッセージ。
sudo ufw insert 1 allow in from 11.22.33.44 to any port 53
次に、次のコマンドを実行して、メイン構成ファイルに構文エラーがあるかどうかを確認します。サイレント出力は、エラーが見つからないことを示します。
sudo named-checkconf
エラーが見つからない場合は、BIND9を再起動します。
sudo systemctl restart bind9
BIND9が再起動すると、ゾーン転送がすぐに開始されます。次のコマンドでBIND9ログを確認します。
sudo journalctl -eu bind9
または
sudo journalctl -eu named
ゾーン転送が成功したことを示す以下のようなメッセージが表示されます。
transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer status: success transfer of 'rpz.local/IN' from xx.xx.xx.xx#53: Transfer completed: 1 messages, 34 records, 899 bytes, 0.248 secs (3625 bytes/sec)
注: マスターリゾルバーでRPZゾーンを変更するときはいつでも、シリアル番号を更新する必要があります。スレーブリゾルバがRPZゾーンが変更されたことを認識できるように、大きくします。
複数のRPZゾーンの作成
特定のDNSレコードをスレーブリゾルバーに転送したくない場合があります。別のRPZゾーンを作成できます。 named.conf.options
を編集します ファイル。
sudo nano /etc/bind/named.conf.options
新しいRPZゾーンを追加します。
//enable response policy zone. response-policy { zone "rpz.local"; zone "rpz.local.notransfer"; };
注 :2つのRPZゾーンに競合するDNSレコードがある場合、最初のエントリが優先されます。優先順位を逆にしたい場合は、次のように位置を切り替えます。
//enable response policy zone. response-policy { zone "rpz.local.notransfer"; zone "rpz.local"; };
ファイルを保存して閉じます。次に、named.conf.local
を開きます ファイル。
sudo nano /etc/bind/named.conf.local
このファイルに新しいゾーンの定義を追加します。
zone "rpz.local.notransfer" { type master; file "/etc/bind/db.rpz.local.notransfer"; allow-query { localhost; }; allow-transfer { localhost; }; };
ファイルを保存して閉じます。次に、ゾーンファイルを作成する必要があります。ゾーンファイルを最初から作成する代わりに、ゾーンテンプレートファイルを使用できます。 db.empty
のコンテンツをコピーします 新しいファイルに。
sudo cp /etc/bind/db.empty /etc/bind/db.rpz.local.notransfer
次に、db.rpz
を編集します ファイルを作成し、カスタムDNSレコードを追加します。
sudo nano /etc/bind/db.rpz.local.transfer
トラブルシューティングのヒント
セカンダリDNSリゾルバーがプライマリDNSリゾルバーからのRPZレコードの複製に失敗した場合、セカンダリDNSリゾルバーで次のことが発生する可能性があります。
- ファイアウォールルールが間違っています。
- BINDリゾルバーが実行されていません。
- BINDは必要なネットワークインターフェースをリッスンしていません。
BINDのビューでRPZを使用する方法
内部の信頼できるネットワークのみがRPZにアクセスできるようにする場合は、BINDのビューを使用してそれを実現できます。この設定は、マスター/スレーブゾーン転送と互換性があります。
まず、named.conf.options
を編集します ファイル。
sudo nano /etc/bind/named.conf.options
acl
を使用して内部ネットワークとゲストネットワークを定義します ディレクティブ。
options { ..... ..... } acl internal { 10.10.10.0/24; }; acl guest { 10.10.20.0/24; };
ここで10.10.10.0/24
networkは、内部の信頼できるネットワークです。 10.10.20.0/24
ゲストネットワークです。また、このファイルから次の行を削除してください。
response-policy { zone "rpz.local"; };
ファイルを保存して閉じます。
次に、named.conf.local
を編集します ファイル。
sudo nano /etc/bind/named.conf.local
ゾーン定義をview
内に配置する必要があります 以下のような条項。 view
内で応答ポリシーゾーンを有効にする必要があることに注意してください 条項。
view "internal" { match-clients { internal; }; //enable the response policy zone. response-policy { zone "rpz.local"; }; zone "rpz.local" { type master; file "/etc/bind/db.rpz.local"; allow-query { localhost; }; allow-transfer { 12.34.56.78; }; }; };
ファイルを保存して閉じます。次に、named.conf
を編集します ファイル。
sudo nano /etc/bind/named.conf.default-zones
デフォルトのゾーンをguest
に配置します ビュー。
view guest { match-clients { guest; }; allow-recursion { any; }; zone "." { type hint; file "/usr/share/dns/root.hints"; }; zone "localhost" { type master; file "/etc/bind/db.local"; }; ..... ..... };
ファイルを保存して閉じます。次のコマンドを実行して、構成ファイルに構文エラーがあるかどうかを確認します。サイレント出力は、エラーが見つからないことを示します。
sudo named-checkconf
エラーが見つからない場合は、BIND9を再起動して、変更を有効にします。
sudo systemctl restart bind9