構成図

DNS サーバ (bind) の名前解決において、接続拒止したい宛先ドメインを RPZ (Response Policy Zones)として登録することで、接続のフィルタリングを行う。フィルター対象ドメイン以外は上位のDNSサーバにて名前解決を行う。
また、 DNS サーバは docker を用いて PC 内にコンテナとして起動したものを利用する。
フィルター対象ドメイン | nhk.or.jp nhk.jp nhk |
使用コンテナイメージ | ubuntu/bind9 |
bind の設定
ドメイン定義ファイルにフィルタリング用のドメイン名「rpz」を定義する。
【named.conf.local】
zone "rpz" {
type master;
file "rpz.zone";
};
基本的なオプションファイル定義は以下、フィルタリング用の「response-policy」を定義する。
【named.conf.options】
acl my-acl {
192.168.0.0/16;
localhost;
};
options {
forwarders {
192.168.254.254;
};
version "unknown";
allow-query { my-acl; };
allow-query-cache { my-acl; };
allow-recursion { my-acl; };
allow-transfer { none; };
response-policy { zone "rpz"; };
};
ドメインデータベースファイルを定義する。
【rpz.zone】
$ORIGIN rpz.
$TTL 3600
@ IN SOA localhost. root.localhost. (
2025031501 ; Serial
3600 ; Refresh
900 ; Retry
604800 ; Expire
3600 ; Minimum
)
@ IN NS localhost.
nhk.or.jp IN A 127.0.0.1
*.nhk.or.jp IN A 127.0.0.1
nhk.jp IN A 127.0.0.1
*.nhk.jp IN A 127.0.0.1
nhk IN A 127.0.0.1
*.nhk IN A 127.0.0.1
docker の設定
compose ファイルの準備
「docker desktop」 をインストールし、「docker compose」用のファイルを作成する。
【compose.yaml】
※「docker-compose.yaml」ファイルは非推奨とのこと
「How Compose works」
services:
bind9:
image: ubuntu/bind9:latest
restart: always
ports:
- "53:53/udp"
volumes:
- "./volumes/etc_bind/named.conf.local:/etc/bind/named.conf.local:ro"
- "./volumes/etc_bind/named.conf.options:/etc/bind/named.conf.options:ro"
- "./volumes/var_cache:/var/cache/bind:rw"
environment:
- "TZ=Asia/Tokyo"
- "BIND9_USER=bind"
ファイル の配置
各種ファイルを以下の様に配置する。
.
├─ compose.yaml
└─ volumes
├─ etc_bind
| ├─ named.conf.local
| └─ named.conf.options
|
└─ var_cache
└─ rpz.zone
docker の起動
docker compose からの起動
上記のファイル階層に「cd」コマンドで移動する。または以下の様にファイルパスを指定して
「docker compose」を実行する。
※初回起動時はコンテナイメージのダウンロードが行われる。
apple@mac docker % docker compose -f ./bind9/compose.yaml up -d
[+] Running 4/4
✔ bind9 Pulled 72.0s
✔ a2defac7906c Pull complete 1.8s
✔ 5edf575356dc Pull complete 53.9s
✔ dd4130317f5d Pull complete 65.2s
[+] Running 2/2
✔ Network bind9_default Created 0.3s
✔ Container bind9-bind9-1 Started 1.4s
apple@mac docker % docker compose -f ./bind9/compose.yaml ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
bind9-bind9-1 ubuntu/bind9:latest "docker-entrypoint.sh" bind9 2 minutes ago Up 2 minutes 53/tcp, 953/tcp, 0.0.0.0:53->53/udp
動作確認
以下の様に DNS 応答が「127.0.0.1」となることを確認する。フィルター対象外のドメインは正常に名前解決が出来ている。
apple@mac docker % dig www.nhk.or.jp @localhost
; <<>> DiG 9.10.6 <<>> www.nhk.or.jp @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34163
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.nhk.or.jp. IN A
;; ANSWER SECTION:
www.nhk.or.jp. 5 IN A 127.0.0.1
;; ADDITIONAL SECTION:
rpz. 3600 IN SOA localhost. root.localhost. 2025031501 3600 900 604800 86400
;; Query time: 322 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sat Mar 15 22:00:18 JST 2025
;; MSG SIZE rcvd: 111
apple@mac docker % dig google.com @localhost
; <<>> DiG 9.10.6 <<>> google.com @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25966
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 300 IN A 142.250.196.110
;; Query time: 241 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sat Mar 15 22:05:29 JST 2025
;; MSG SIZE rcvd: 55
docker compose からの停止
停止する場合は以下の様にする。
apple@mac docker % docker compose -f bind9/compose.yaml down
[+] Running 2/2
✔ Container bind9-bind9-1 Removed 0.6s
✔ Network bind9_default Removed 0.5s
参考URL
bindのRPZを使ってDNSレコードを偽装する
自宅ネットワークのbind9をdocker composeに移行した
ubuntu/bind9
MinIOを用いたS3ローカル開発環境の構築ガイド(AWS SDK for Java 2.x)