ローカルの検証環境にルートのDNSサーバを構築

ローカルの検証環境にDNSルートサーバを含む権威サーバおよびキャッシュサーバを構築しました。検証環境内で非再帰問い合わせを完結させます。

※ここでは実際に動作したシステムの設定を掲載していますが内容について保証するものではありません。
 また異常系の動作およびセキュリティについては未確認です。流用される場合は各自の責任でお願いします。
※今回、逆引き、root化、DNSSEC、IPv6 等については考慮していません。

検証環境の構成は以下のとおりです。

<構成図>

スペック等はすべてのサーバで同じです。

仮想環境VirtualBox 6.1.26
仮想マシン仮想CPU×1、メモリ×1G
ネットワーク:NATネットワーク×1
ハードディスク:16G(thin、実際のサイズは2G以下)
OSCentOS 7.7.1908
DNSBIND 9.11.4

構築手順は以下のとおりです。

※OS、BIND等はインストール済みとします。

DNSポートの開放

FirewallでDNSポートへのアクセスを許可する
※下記はDNSルートサーバでの設定です。他のサーバの設定についてはDNSルートサーバと同様のため掲載は省略します。
[root@root-16 ~]# firewall-cmd --add-service=dns --permanent
success
[root@root-16 ~]# firewall-cmd --reload
success
[root@root-16 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: dhcpv6-client dns ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

DNSルートサーバの構築

ローカル環境にDNSルートサーバを構築し、testサブドメインを委任するための情報を登録します。
構築後、サーバ単体での動作確認を行います。

コンフィグの設定
/etc/named.confの設定
※変更箇所および構成確認に必要なコードのみ掲載しています。
options {
    // 指定したアドレスでクエリを受け付ける
    listen-on port 53 { 10.0.2.16; 127.0.0.1; };

    // 指定した問い合わせ元からのクエリを受け付ける
    //(権威なのですべて受け付ける)
    allow-query     { any; };

    // 再帰問い合わせのクエリへの対応
    // (キャッシュサーバではないので受け付けない)
    recursion no;
    allow-recursion { none; };

    // 指定した問い合わせ元に対してキャッシュの内容で回答する
    // (キャッシュサーバではないので回答しない)
    allow-query-cache { none; };
};

//zone "." IN {
//    type hint;
//    file "named.ca";
//};

// rootゾーンに関する設定
zone "." IN {
    type master;
    file "root.zone";
};

権限を確認
[root@root-16 ~]# ll /etc/named.conf
-rw-r-----. 1 root named 2163  8月 24 06:28 /etc/named.conf

構文チェック
[root@root-16 ~]# named-checkconf; echo $?
0

rootゾーンの設定
/var/named/root.zoneの設定
$TTL 3600S
@ IN SOA x.root-servers.net. root.squat.test. (
  1657574902
  60S
  120S
  360S
  120S )
                    IN NS x.root-servers.net.
x.root-servers.net. IN A  10.0.2.16
@                   IN A  10.0.2.16
test.               IN NS ns.test.
ns.test.            IN A  10.0.2.17

権限を確認
[root@root-16 ~]# ll /var/named/root.zone
-rw-r-----. 1 root named 290  8月 24 06:07 /var/named/root.zone

構文チェック
[root@root-16 ~]# named-checkzone -i local . /var/named/root.zone
zone ./IN: loaded serial 1657574902
OK

サービス再起動後の状況確認
確認1
[root@root-16 ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2022-08-31 06:22:23 JST; 1min 28s ago
    <中略>
 8月 31 06:22:23 root-16.squat.test named[1068]: managed-keys-zone: Unable to fetch DNSKEY set '.': ncache nxrrset
 ※ DNSKEYについては何も考慮していないので何やらメッセージが出てる

確認2
[root@root-16 ~]# rndc status
version: BIND 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 (Extended Support Version) 
running on root-16.squat.test: Linux x86_64 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019
boot time: Wed, 24 Aug 2022 20:59:04 GMT
last configured: Wed, 24 Aug 2022 20:59:04 GMT
configuration file: /etc/named.conf
CPUs found: 1
worker threads: 1
UDP listeners per interface: 1
number of zones: 7 (0 automatic)
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/900/1000
tcp clients: 3/150
server is up and running

DNSポートの待ち受け(LISTEN)状況を確認
53(domain)ポートを参照
[root@root-16 ~]# lsof -i:53
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
named   1350 named   21u  IPv4  19524      0t0  TCP localhost:domain (LISTEN)
named   1350 named   22u  IPv4  19526      0t0  TCP root-16.squat.test:domain (LISTEN)
named   1350 named   23u  IPv6  19528      0t0  TCP localhost:domain (LISTEN)
named   1350 named  512u  IPv4  19522      0t0  UDP localhost:domain
named   1350 named  513u  IPv4  19525      0t0  UDP root-16.squat.test:domain
named   1350 named  514u  IPv6  19527      0t0  UDP localhost:domain

動作確認
設定したゾーン情報を参照できることを確認
[root@root-16 ~]# dig @10.0.2.16 . any +norec

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.0.2.16 . any +norec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42321
;; flags: qr aa; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;.                              IN      ANY

;; ANSWER SECTION:
.                       3600    IN      SOA     x.root-servers.net. root.squat.test. 1657574902 60 120 360 120
.                       3600    IN      NS      x.root-servers.net.
.                       3600    IN      A       10.0.2.16

;; ADDITIONAL SECTION:
x.root-servers.net.     3600    IN      A       10.0.2.16

;; Query time: 0 msec
;; SERVER: 10.0.2.16#53(10.0.2.16)
;; WHEN: 木  8月 25 06:10:16 JST 2022
;; MSG SIZE  rcvd: 140

権威サーバへの非再帰問い合わせを想定した動作確認
(NOERRORでtestドメインのNSを回答している)
[root@root-16 ~]# dig @10.0.2.16 www.squat.test +norec

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.0.2.16 www.squat.test +norec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15761
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.squat.test.                        IN      A

;; AUTHORITY SECTION:
test.                   3600    IN      NS      ns.test.

;; ADDITIONAL SECTION:
ns.test.                3600    IN      A       10.0.2.17

;; Query time: 0 msec
;; SERVER: 10.0.2.16#53(10.0.2.16)
;; WHEN: 木  8月 25 06:13:01 JST 2022
;; MSG SIZE  rcvd: 76

TLDサーバ(test)の構築

ローカル環境にTLDサーバ(test)を構築し、squat.testサブドメインを委任するための情報を登録します。
構築後、サーバ単体での動作確認を行います。

コンフィグの設定
/etc/named.confの設定
※変更箇所および構成確認に必要なコードのみ掲載しています。
※ルートサーバと同様のコメントについては省略しています。
options {
    listen-on port 53 { 10.0.2.17; 127.0.0.1; };
    allow-query     { any; };
    recursion no;
    allow-recursion { none; };
    allow-query-cache { none; };
};

//zone "." IN {
//    type hint;
//    file "named.ca";
//};

// testゾーンに関する設定
zone "test" IN {
    type master;
    file "test.zone";
};

権限を確認
[root@tld-17 ~]# ll /etc/named.conf
-rw-r-----. 1 root named 2165  8月 26 09:23 /etc/named.conf

構文チェック
[root@tld-17 ~]# named-checkconf; echo $?
0

testゾーンの設定
/var/named/test.zoneの設定
$TTL 86400
@ IN SOA ns.test. root.squat.test. (
  1656218725
  28800
  14400
  3600000
  86400)
               IN NS ns.test.
ns.test.       IN A  10.0.2.17
@              IN A  10.0.2.17
squat.test.    IN NS ns.squat.test.
ns.squat.test. IN A  10.0.2.18

権限を確認
[root@tld-17 ~]# ll /var/named/test.zone
-rw-r-----. 1 root named 256  8月 26 09:41 /var/named/test.zone

構文チェック
[root@tld-17 ~]# named-checkzone -i local test /var/named/test.zone
zone test/IN: loaded serial 1656218725
OK

サービス再起動後の状況確認
確認1
[root@tld-17 ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2022-08-26 09:49:27 JST; 44s ago
   <以下略>

確認2
[root@tld-17 ~]# rndc status
version: BIND 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 (Extended Support Version) 
running on tld-17.squat.test: Linux x86_64 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019
boot time: Fri, 26 Aug 2022 00:49:27 GMT
last configured: Fri, 26 Aug 2022 00:49:27 GMT
configuration file: /etc/named.conf
CPUs found: 1
worker threads: 1
UDP listeners per interface: 1
number of zones: 7 (0 automatic)
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/900/1000
tcp clients: 3/150
server is up and running

DNSポートの待ち受け(LISTEN)状況を確認
53(domain)ポートを参照
[root@tld-17 ~]# lsof -i:53
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
named   1406 named   21u  IPv4  20347      0t0  TCP localhost:domain (LISTEN)
named   1406 named   22u  IPv4  20349      0t0  TCP tld-17.squat.test:domain (LISTEN)
named   1406 named   23u  IPv6  20351      0t0  TCP localhost:domain (LISTEN)
named   1406 named  512u  IPv4  20345      0t0  UDP localhost:domain
named   1406 named  513u  IPv4  20348      0t0  UDP tld-17.squat.test:domain
named   1406 named  514u  IPv6  20350      0t0  UDP localhost:domain

動作確認
設定したゾーン情報を参照できることを確認
[root@tld-17 ~]# dig @10.0.2.17 test any +norec

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.0.2.17 test any +norec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44826
;; flags: qr aa; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;test.                          IN      ANY

;; ANSWER SECTION:
test.                   86400   IN      SOA     ns.test. root.squat.test. 1656218725 28800 14400 3600000 86400
test.                   86400   IN      NS      ns.test.
test.                   86400   IN      A       10.0.2.17

;; ADDITIONAL SECTION:
ns.test.                86400   IN      A       10.0.2.17

;; Query time: 0 msec
;; SERVER: 10.0.2.17#53(10.0.2.17)
;; WHEN: 金  8月 26 09:52:44 JST 2022
;; MSG SIZE  rcvd: 129

権威サーバへの非再帰問い合わせを想定した動作確認
(NOERRORでsquat.testドメインのNSを回答している)
[root@tld-17 named]# dig @10.0.2.17 www.squat.test +norec

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.0.2.17 www.squat.test +norec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1848
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.squat.test.                        IN      A

;; AUTHORITY SECTION:
squat.test.             86400   IN      NS      ns.squat.test.

;; ADDITIONAL SECTION:
ns.squat.test.          86400   IN      A       10.0.2.18

;; Query time: 0 msec
;; SERVER: 10.0.2.17#53(10.0.2.17)
;; WHEN: 金  8月 26 09:53:59 JST 2022
;; MSG SIZE  rcvd: 76

squat.testドメインのNSの構築

ローカル環境にsquat.testドメインのNSを構築し、同ドメインのAレコード(wwwなど)を登録します。
構築後、サーバ単体での動作確認を行います。

コンフィグの設定
/etc/named.confの設定
※変更箇所および構成確認に必要なコードのみ掲載しています。
※ルートサーバと同様のコメントについては省略しています。
options {
    listen-on port 53 { 10.0.2.18; 127.0.0.1; };
    allow-query     { any; };
    recursion no;
    allow-recursion { none; };
    allow-query-cache { none; };
};

//zone "." IN {
//    type hint;
//    file "named.ca";
//};

zone "squat.test" IN {
    type master;
    file "squat.test.zone";
};

権限を確認
[root@ns ~]# ll /etc/named.conf
-rw-r-----. 1 root named 2177  8月 26 10:27 /etc/named.conf

構文チェック
[root@ns ~]# named-checkconf; echo $?
0

squat.testゾーンの設定
/var/named/squat.test.zoneの設定
$TTL 60
@ IN SOA ns.squat.test. root.squat.test. (
  1656218725
  28800
  14400
  3600000
  86400)
               IN NS ns.squat.test.
ns.squat.test. IN A  10.0.2.18
@              IN A  10.0.2.18
@              IN MX 10 mail
mail           IN A  10.0.2.18
www            IN A  10.0.2.18

権限を確認
[root@ns ~]# ll /var/named/squat.test.zone
-rw-r-----. 1 root named 289  8月 26 10:38 /var/named/squat.test.zone

構文チェック
[root@ns ~]# named-checkzone squat.test /var/named/squat.test.zone
zone squat.test/IN: loaded serial 1656218725
OK

サービス再起動後の状況確認
確認1
[root@ns ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2022-08-26 10:40:50 JST; 13s ago
   <以下略>

確認2
[root@ns ~]# rndc status
version: BIND 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 (Extended Support Version) 
running on ns.squat.test: Linux x86_64 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019
boot time: Fri, 26 Aug 2022 01:40:50 GMT
last configured: Fri, 26 Aug 2022 01:40:50 GMT
configuration file: /etc/named.conf
CPUs found: 1
worker threads: 1
UDP listeners per interface: 1
number of zones: 7 (0 automatic)
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/900/1000
tcp clients: 3/150
server is up and running

DNSポートの待ち受け(LISTEN)状況を確認
53(domain)ポートを参照
[root@ns ~]# lsof -i:53
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
named   1359 named   21u  IPv4  19640      0t0  TCP localhost:domain (LISTEN)
named   1359 named   22u  IPv4  19642      0t0  TCP ns.squat.test:domain (LISTEN)
named   1359 named   23u  IPv6  19644      0t0  TCP localhost:domain (LISTEN)
named   1359 named  512u  IPv4  19638      0t0  UDP localhost:domain
named   1359 named  513u  IPv4  19641      0t0  UDP ns.squat.test:domain
named   1359 named  514u  IPv6  19643      0t0  UDP localhost:domain

動作確認
設定したゾーン情報を参照できることを確認
[root@ns ~]# dig @10.0.2.18 squat.test any +norec
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.0.2.18 squat.test any +norec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7106
;; flags: qr aa; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;squat.test.                    IN      ANY
;; ANSWER SECTION:
squat.test.             60      IN      SOA     ns.squat.test. root.squat.test. 1656218725 28800 14400 3600000 86400
squat.test.             60      IN      NS      ns.squat.test.
squat.test.             60      IN      A       10.0.2.18
squat.test.             60      IN      MX      10 mail.squat.test.
;; ADDITIONAL SECTION:
ns.squat.test.          60      IN      A       10.0.2.18
mail.squat.test.        60      IN      A       10.0.2.18
;; Query time: 0 msec
;; SERVER: 10.0.2.18#53(10.0.2.18)
;; WHEN: 金  8月 26 10:42:18 JST 2022
;; MSG SIZE  rcvd: 166

権威サーバへの非再帰問い合わせを想定した動作確認
(NOERRORでwww.squat.testのAレコードを回答している)
[root@ns ~]# dig @10.0.2.18 www.squat.test +norec
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.0.2.18 www.squat.test +norec
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23675
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.squat.test.                        IN      A
;; ANSWER SECTION:
www.squat.test.         60      IN      A       10.0.2.18
;; AUTHORITY SECTION:
squat.test.             60      IN      NS      ns.squat.test.
;; ADDITIONAL SECTION:
ns.squat.test.          60      IN      A       10.0.2.18
;; Query time: 0 msec
;; SERVER: 10.0.2.18#53(10.0.2.18)
;; WHEN: 金  8月 26 10:43:35 JST 2022
;; MSG SIZE  rcvd: 92

DNSキャッシュサーバから権威サーバへの通信確認

DNSポートへの通信確認
※ 攻撃と判断される可能性があるので、管理しているサーバ以外へのncatは控えてください。

DNSルートサーバのDNSポートへの通信確認("Connected"が表示されることを確認)
[root@cache ~]# ncat -vz 10.0.2.16 53
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.2.16:53.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

TLDサーバ(test)のDNSポートへの通信確認("Connected"が表示されることを確認)
[root@cache ~]# ncat -vz 10.0.2.17 53
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.2.17:53.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

squat.testドメインのNSサーバのDNSポートへの通信確認("Connected"が表示されることを確認)
[root@cache ~]# ncat -vz 10.0.2.18 53
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.2.18:53.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

DNSキャッシュサーバの構築

ローカル環境にDNSキャッシュサーバを構築し、DNSルートサーバへの参照を外部からローカルへ切り替えます。
構築後、自身への非再帰問い合わせで動作を確認します。

コンフィグの設定
/etc/named.confの設定
※変更箇所および構成確認に必要なコードのみ掲載しています。
acl my-domain {
    10.0.2.0/24;
    localhost;
};

options {
    // 指定したアドレスでクエリを受け付ける
    listen-on port 53 { 10.0.2.19; 127.0.0.1; };

    // my-domainリストで定義した問い合わせ元からのクエリを受け付ける
    allow-query     { my-domain; };

    // 再帰問い合わせのクエリへの対応
    // (キャッシュサーバなので受け付ける)
    recursion yes;
    // ここで指定した問い合わせ元からの再帰問い合わせを受け付ける
    allow-recursion { my-domain; };
    // ここで指定した問い合わせ元に対し、キャッシュがあればキャッシュで回答する
    allow-query-cache { my-domain; };

     // DNSSECは無効
     dnssec-enable no;
     dnssec-validation no;
};

権限を確認
[root@cache ~]# ll /etc/named.conf
-rw-r-----. 1 root named 2166  8月 26 11:02 /etc/named.conf

構文チェック
[root@cache ~]# named-checkconf; echo $?
0

DNSルートサーバへの参照の設定
/var/named/named.caの設定
(参照先を外部のDNSルートサーバからローカルに構築したDNSルートサーバへ変更)
; <<>> DiG 9.11.3-RedHat-9.11.3-3.fc27 <<>> +bufsize=1200 +norec @a.root-servers.net
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46900
;; flags: qr aa; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 27

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1472
;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       518400  IN      NS      x.root-servers.net.

;; ADDITIONAL SECTION:
x.root-servers.net.     518400  IN      A       10.0.2.16

;; Query time: 24 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Thu Apr 05 15:57:34 CEST 2018
;; MSG SIZE  rcvd: 811

権限を確認
[root@cache ~]# ll /var/named/named.ca
-rw-r-----. 1 root named 658  8月 22 06:13 /var/named/named.ca

サービス再起動後の状況確認
確認1
[root@cache ~]# systemctl status named
● named.service - Berkeley Internet Name Domain (DNS)
   Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2022-08-26 12:14:37 JST; 6s ago
   <以下略>

確認2
[root@cache ~]# rndc status
version: BIND 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 (Extended Support Version) 
running on cache.squat.test: Linux x86_64 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019
boot time: Fri, 26 Aug 2022 03:14:37 GMT
last configured: Fri, 26 Aug 2022 03:14:37 GMT
configuration file: /etc/named.conf
CPUs found: 1
worker threads: 1
UDP listeners per interface: 1
number of zones: 103 (97 automatic)
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is OFF
recursive clients: 0/900/1000
tcp clients: 3/150
server is up and running

DNSポートの待ち受け(LISTEN)状況を確認
53(domain)ポートを参照
[root@cache ~]# lsof -i:53
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
named   1579 named   21u  IPv4  21515      0t0  TCP localhost:domain (LISTEN)
named   1579 named   22u  IPv4  21517      0t0  TCP cache.squat.test:domain (LISTEN)
named   1579 named   23u  IPv6  21519      0t0  TCP localhost:domain (LISTEN)
named   1579 named  512u  IPv4  21513      0t0  UDP localhost:domain
named   1579 named  513u  IPv4  21516      0t0  UDP cache.squat.test:domain
named   1579 named  514u  IPv6  21518      0t0  UDP localhost:domain

動作確認
自身への再帰問い合わせ
(NOERRORで回答)
[root@cache ~]# dig @10.0.2.19 www.squat.test

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.0.2.19 www.squat.test
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26552
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.squat.test.                        IN      A

;; ANSWER SECTION:
www.squat.test.         60      IN      A       10.0.2.18

;; AUTHORITY SECTION:
squat.test.             86400   IN      NS      ns.squat.test.

;; ADDITIONAL SECTION:
ns.squat.test.          86400   IN      A       10.0.2.18

;; Query time: 2 msec
;; SERVER: 10.0.2.19#53(10.0.2.19)
;; WHEN: 金  8月 26 12:17:18 JST 2022
;; MSG SIZE  rcvd: 92

クライアントからDNSキャッシュサーバへの通信確認

DNSポートへの通信確認
※ 攻撃と判断される可能性があるので、管理しているサーバ以外へのncatは控えてください。

DNSキャッシュサーバのDNSポートへの通信確認("Connected"が表示されることを確認)
[root@stub-20 ~]# ncat -vz 10.0.2.19 53
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.0.2.19:53.
Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds.

再帰問い合わせの動作確認

クライアントからDNSキャッシュサーバへ再帰問い合わせを行い、DNSキャッシュサーバ上でキャッシュおよびDNSパケットを確認します。

クライアントからDNSキャッシュサーバへ再帰問い合わせ
[root@stub-20 ~]# dig @10.0.2.19 www.squat.test

; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.9 <<>> @10.0.2.19 www.squat.test
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44458
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.squat.test.                        IN      A

;; ANSWER SECTION:
www.squat.test.         60      IN      A       10.0.2.18

;; AUTHORITY SECTION:
squat.test.             86400   IN      NS      ns.squat.test.

;; ADDITIONAL SECTION:
ns.squat.test.          86400   IN      A       10.0.2.18

;; Query time: 9 msec
;; SERVER: 10.0.2.19#53(10.0.2.19)
;; WHEN: 金  8月 26 13:14:20 JST 2022
;; MSG SIZE  rcvd: 92

再帰問い合わせ前後のDNSキャッシュサーバのキャッシュの状況
<再帰問い合わせ実行前>

DNSキャッシュサーバのキャッシュをクリア
[root@cache ~]# rndc flush; echo $?
0

キャッシュをダンプ
[root@cache ~]# rndc dumpdb

ダンプ先のファイルパスを確認
[root@cache ~]# grep cache_dump.db /etc/named.conf
        dump-file       "/var/named/data/cache_dump.db";

キャッシュがクリアされていることを確認
[root@cache ~]# cat /var/named/data/cache_dump.db
;
; Start view _default
;
;
; Cache dump of view '_default' (cache _default)
;
$DATE 20220826033945
;
; Address database dump
;
; [edns success/4096 timeout/1432 timeout/1232 timeout/512 timeout]
; [plain success/timeout]
;
;
; Unassociated entries
;
;
; Bad cache
;
;
; SERVFAIL cache
;
;
; Start view _bind
;
;
; Cache dump of view '_bind' (cache _bind)
;
$DATE 20220826033945
;
; Address database dump
;
; [edns success/4096 timeout/1432 timeout/1232 timeout/512 timeout]
; [plain success/timeout]
;
;
; Unassociated entries
;
;
; Bad cache
;
;
; SERVFAIL cache
;
; Dump complete

<再帰問い合わせ実行後>

再帰問い合わせでキャッシュされた内容を確認
[root@cache ~]# rndc dumpdb
[root@cache ~]# cat /var/named/data/cache_dump.db | head -n 22
;
; Start view _default
;
;
; Cache dump of view '_default' (cache _default)
;
$DATE 20220826034340
; authanswer
.                       3583    IN NS   x.root-servers.net.
; glue
x.root-servers.net.     3583    A       10.0.2.16
; glue
test.                   3583    NS      ns.test.
; glue
ns.test.                3583    A       10.0.2.17
; glue
squat.test.             86383   NS      ns.squat.test.
; glue
ns.squat.test.          86383   A       10.0.2.18
; authanswer
www.squat.test.         43      A       10.0.2.18
;

再帰問い合わせ時のDNSパケット
DNSキャッシュサーバでwiresharkを起動しDNSパケットをキャプチャ
[root@cache ~]# tshark -i1 -f 'port 53' -w /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s3'
10 ^C

キャプチャしたDNSパケットを確認
[root@cache ~]# tshark -i1 -r /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
  1 0.000000000    10.0.2.20 -> 10.0.2.19    DNS 85 Standard query 0xadaa  A www.squat.test
  2 0.000508249    10.0.2.19 -> 10.0.2.16    DNS 85 Standard query 0xfa58  A www.squat.test
  3 0.000761562    10.0.2.19 -> 10.0.2.16    DNS 70 Standard query 0x9907  NS 
  4 0.007814595    10.0.2.16 -> 10.0.2.19    DNS 118 Standard query response 0xfa58
  5 0.007833710    10.0.2.16 -> 10.0.2.19    DNS 117 Standard query response 0x9907  NS x.root-servers.net
  6 0.008024474    10.0.2.19 -> 10.0.2.17    DNS 85 Standard query 0x1a8e  A www.squat.test
  7 0.008582782    10.0.2.17 -> 10.0.2.19    DNS 118 Standard query response 0x1a8e
  8 0.009221115    10.0.2.19 -> 10.0.2.18    DNS 85 Standard query 0xad4a  A www.squat.test
  9 0.009759276    10.0.2.18 -> 10.0.2.19    DNS 101 Standard query response 0xad4a  A 10.0.2.18
 10 0.009868167    10.0.2.19 -> 10.0.2.20    DNS 134 Standard query response 0xadaa  A 10.0.2.18

※ .16:root, .17:tld(testのNS), .18:squat.testのNS, .19:Cache, .20:Client

1   クライアントからDNSキャッシュサーバへの再帰問い合わせ
2,3 DNSキャッシュサーバからDNSルートサーバへの非再帰問い合わせ
4,5 DNSルートサーバからDNSキャッシュサーバへの回答
6   DNSキャッシュサーバからTLDサーバ(testドメインのNS)への非再帰問い合わせ
7   TLDサーバからDNSキャッシュサーバへの回答
8   DNSキャッシュサーバからsquat.testドメインのNSへの非再帰問い合わせ
9   squat.testドメインのNSからDNSキャッシュサーバへの回答
10  DNSキャッシュサーバからクライアントへの回答

雑談

Posted by Mongolian Chop