TokoroTech

勉強した技術的なこと等まとめていってます!

【構築手順】VMware Workstation Pro上にキャッシュDNSサーバ(Unbound)を構築

▼目次

▼目標(ゴール)

VMware Workstation Pro上にUbuntu 24.04(仮想マシン)を構築し、キャッシュDNSサーバ(Unbound)を構築します。 キャッシュDNSサーバを介して権威DNSサーバへ名前解決問い合わせができることを確認します。(DNSSEC設定含む)

▼用語

※※ 執筆中。。※※

▼システム要件

構成

コンポーネント構成

  • ①自宅デスクトップPC
  • ②キャッシュDNSサーバ
    ※権威DNSサーバは省略

構成図

【構成図】概要
【構成図】概要

【構成図】物理・論理
【構成図】物理・論理

導入ソフトウェア

①自宅デスクトップPC

ソフトウェア バージョン 備考
Windows11 Windows 11 Home 24H2 -
VMware(R) Workstation 17 Pro 17.6.2 build-24409262 -

②キャッシュDNSサーバ

ソフトウェア バージョン 備考
Ubuntu 24.04.2 LTS (Noble Numbat) -
Unbound Version 1.19.2 -

必要スペック(最小)

※あくまでも起動するために必要最低限のスペックであり、必要スペックは場合によって変わります。(自宅デスクトップPCは使用しているPCのスペックを記載しています。)

①自宅デスクトップPC

コンポーネント CPU RAM Root Disk Data Disk
自宅デスクトップPC AMD Ryzen 7 3700X 8-Core Processor (3.60 GHz) 64.0GB 500GB 4TB (SSD)

②キャッシュDNSサーバ

コンポーネント CPU RAM Root Disk Data Disk
Ubuntu 2コア 4GB 25GB ※任意
Unbound 1コア 128MB 100MB ※任意
合計 3コア 4.128GB 25.1GB ※任意

スペック参考資料

各種パラメータ設定

※ (★)はデフォルト値になります。

①自宅デスクトップPC

ホスト名 IPv4/プレフィックス長 デフォルトGW DNS NTP プロキシ
(★)
-
192.168.1.50/24 192.168.1.30 192.168.1.130, 8.8.8.8 (★)
time.windows.com
(★)
-

②キャッシュDNSサーバ

ホスト名 IPv4/プレフィックス長 デフォルトGW DNS NTP プロキシ
unbound 192.168.1.130/24 192.168.1.30 8.8.8.8 (★)
ntp.ubuntu.com
(★)
-

ファイアウォール設定

①自宅デスクトップPC

ポート/プロトコル サービス 送信元(src) 送信先(dest) 備考
In - - - - -
Out - - - - -

②キャッシュDNSサーバ

ポート/プロトコル サービス 送信元(src) 送信先(dest) 備考
In 53/tcp - - - -
53/udp - - - -
Out - - - - -

▼構築手順

権威DNSサーバ(PowerDNS Authoritativeサーバ)の構築・レコード設定

  1. 以下過去記事を参考にDNSサーバ(PowerDNS Authoritative Server)を構築します。 tokoro10.net

  2. DNSサーバに以下レコードを追加します。

  3. デスクトップPCの【インターネットプロトコルバージョン4(TCP/IPv4)のプロパティ】画面にて、DNSサーバ設定を以下項目のように設定します。(本記事で構築するキャッシュDNSサーバのIPアドレスを設定します。この時点ではキャッシュDNSサーバは未構築なので、権威DNSサーバを使った名前解決はできません。)

注意点

  • SOAとns01のレコード設定は必須です。
    BIND や PowerDNS では MNAME と NS がかみ合わないとMNAMEに「a.misconfigured.dns.server.invalid.」 が自動挿入され、misconfigured zone として NXDOMAIN を返すことがあります。

VMware Workstation Pro上でUbuntu構築

  1. 以下過去記事を参考にUbuntuを構築します。(以下過去記事はvSphere ESXi 8上で構築していますが、本記事ではVMware Workstation Pro上で構築しています。) tokoro10.net

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

  1. unboundパッケージのインストール

    root@unbound:~# apt install -U -y unbound
    

  2. 以下のようにUnboundの設定ファイルを作成します。(この時点ではDNSSECを適用しないため「domain-insecure」を設定しています。)

    root@unbound:~# vi /etc/unbound/unbound.conf.d/unbound.conf
    
    server:
      interface: 192.168.1.130
      port: 53
      access-control: 127.0.0.0/8 allow
      access-control: 192.168.1.0/24 allow
      use-syslog: yes
      log-queries: yes
      hide-version: yes
      hide-identity: yes
    # 指定したゾーンとその下位についてDNSSEC検証を行わないためのディレクティブ domain-insecure: "tokoro10.test."
    # AS112ゾーンのデフォルトの設定をオフにする。(本記事では"test."ドメインを使用しているため) local-zone: "test." nodefault
    stub-zone: name: "tokoro10.test." stub-addr: 192.168.1.121@53

  3. Unboundサービスを再起動します。

    root@unbound:~# systemctl restart  unbound
    

  4. 自宅デスクトップPCからnslookupして、名前解決ができることを確認します。

C:\xxxx\xxxx>nslookup -debug esxi01.tokoro10.test
------------
Got answer:
    HEADER:
        opcode = QUERY, id = 1, rcode = NXDOMAIN
        header flags:  response, auth. answer, want recursion, recursion avail.
        questions = 1,  answers = 0,  authority records = 1,  additional = 0

    QUESTIONS:
        130.1.168.192.in-addr.arpa, type = PTR, class = IN
    AUTHORITY RECORDS:
    ->  168.192.in-addr.arpa
        ttl = 10800 (3 hours)
        primary name server = localhost
        responsible mail addr = nobody.invalid
        serial  = 1
        refresh = 3600 (1 hour)
        retry   = 1200 (20 mins)
        expire  = 604800 (7 days)
        default TTL = 10800 (3 hours)

------------
サーバー:  UnKnown
Address:  192.168.1.130

------------
Got answer:
    HEADER:
        opcode = QUERY, id = 2, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 1,  authority records = 0,  additional = 0

    QUESTIONS:
        esxi01.tokoro10.test, type = A, class = IN
    ANSWERS:
    ->  esxi01.tokoro10.test
        internet address = 192.168.1.100
        ttl = 36 (36 secs)

------------
権限のない回答:
------------
Got answer:
    HEADER:
        opcode = QUERY, id = 3, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 0,  authority records = 1,  additional = 0

    QUESTIONS:
        esxi01.tokoro10.test, type = AAAA, class = IN
    AUTHORITY RECORDS:
    ->  tokoro10.test
        ttl = 3162 (52 mins 42 secs)
        primary name server = ns01.tokoro10.test
        responsible mail addr = hostmaster.tokoro10.test
        serial  = 2025061404
        refresh = 10800 (3 hours)
        retry   = 3600 (1 hour)
        expire  = 604800 (7 days)
        default TTL = 3600 (1 hour)

------------
名前:    esxi01.tokoro10.test
Address:  192.168.1.100

※名前解決問い合わせがキャッシュDNSサーバ経由か、権威DNSサーバへ直接かによって以下のようにフラグが変わってきます。

  • キャッシュDNSサーバ(192.168.1.130)から権威DNSサーバ(192.168.1.121) へ名前解決問い合わせ時のフラグ
    • qr (Query/Response): 0=質問、1=応答
    • aa (Authoritative Answer): 1=サーバがそのゾーンの権威という意味合い
    • rd (Recursion Desired) : クライアントが「再帰」を要求
  • キャッシュDNSサーバ(192.168.1.130)からキャッシュDNSサーバ(192.168.1.130) へ名前解決問い合わせ時のフラグ
    • qr (Query/Response): 0=質問、1=応答
    • rd (Recursion Desired): クライアントが「再帰」を要求
    • ra (Recursion Available): 1=サーバが再帰機能を提供している

DNSSECの設定

  1. DNSSECを適用するため、以下のように設定ファイルを修正します。(後ほど作成するトラストアンカーファイルのパスを指定しています。)

    root@unbound:~# vi /etc/unbound/unbound.conf.d/unbound.conf
    
    server:
     interface: 192.168.1.130
     port: 53
     access-control: 127.0.0.0/8 allow
     access-control: 192.168.1.0/24 allow
     use-syslog: yes
     log-queries: yes
     hide-version: yes
     hide-identity: yes
    # 指定したゾーンとその下位についてDNSSEC検証を行わないためのディレクティブ # domain-insecure: "tokoro10.test."
    # AS112ゾーンのデフォルトの設定をオフにする。(本記事では"test."ドメインを使用しているため) local-zone: "test." nodefault
    trust-anchor-file: "/etc/unbound/keys.d/tokoro10-test.key"
    stub-zone: name: "tokoro10.test." stub-addr: 192.168.1.121@53

  2. 権威DNSサーバ(pdns-admin)でDNSSECをEnabledにします。

  3. 【Enabled】をクリックし、cskを表示します。

  4. 前手順で取得した値を以下のように設定し、アンカートラストキーファイルを作成します。(以下例では、DNSKEYの値を設定しています。)

    root@unbound:~# vi /etc/unbound/keys.d/tokoro10-test.key
    
    tokoro10.test.  IN DNSKEY 257 3 13 Tdeg07kFW8H3Z8 ~(中略)~ Obvgd0Lw==
    

  5. Unboundサービスを再起動します。

    root@unbound:~# systemctl restart  unbound
    

  6. 自宅デスクトップPCからnslookupし、キャッシュDNSサーバを経由して権威DNSサーバに登録されているレコードが取得できることを確認します。

C:\xxxx\xxxx>nslookup -debug esxi01.tokoro10.test
------------
Got answer:
    HEADER:
        opcode = QUERY, id = 1, rcode = NXDOMAIN
        header flags:  response, auth. answer, want recursion, recursion avail.
        questions = 1,  answers = 0,  authority records = 1,  additional = 0

    QUESTIONS:
        130.1.168.192.in-addr.arpa, type = PTR, class = IN
    AUTHORITY RECORDS:
    ->  168.192.in-addr.arpa
        ttl = 10800 (3 hours)
        primary name server = localhost
        responsible mail addr = nobody.invalid
        serial  = 1
        refresh = 3600 (1 hour)
        retry   = 1200 (20 mins)
        expire  = 604800 (7 days)
        default TTL = 10800 (3 hours)

------------
サーバー:  UnKnown
Address:  192.168.1.130

------------
Got answer:
    HEADER:
        opcode = QUERY, id = 2, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 1,  authority records = 0,  additional = 0

    QUESTIONS:
        esxi01.tokoro10.test, type = A, class = IN
    ANSWERS:
    ->  esxi01.tokoro10.test
        internet address = 192.168.1.100
        ttl = 29 (29 secs)

------------
権限のない回答:
------------
Got answer:
    HEADER:
        opcode = QUERY, id = 3, rcode = NOERROR
        header flags:  response, want recursion, recursion avail.
        questions = 1,  answers = 0,  authority records = 1,  additional = 0

    QUESTIONS:
        esxi01.tokoro10.test, type = AAAA, class = IN
    AUTHORITY RECORDS:
    ->  tokoro10.test
        ttl = 3446 (57 mins 26 secs)
        primary name server = ns01.tokoro10.test
        responsible mail addr = hostmaster.tokoro10.test
        serial  = 2025061404
        refresh = 10800 (3 hours)
        retry   = 3600 (1 hour)
        expire  = 604800 (7 days)
        default TTL = 3600 (1 hour)

------------
名前:    esxi01.tokoro10.test
Address:  192.168.1.100

※DNSSECを設定した状態で、再び名前解決問い合わせ時のフラグを確認します。(結果は以下の通りで、キャッシュDNS経由の場合は「ad」フラグが増えています。)

  • キャッシュDNSサーバ(192.168.1.130)から権威DNSサーバ(192.168.1.121) へ名前解決問い合わせ時のフラグ
    • qr (Query/Response): 0=質問、1=応答
    • aa (Authoritative Answer): 1=サーバがそのゾーンの権威という意味合い
    • rd (Recursion Desired) : クライアントが「再帰」を要求
  • キャッシュDNSサーバ(192.168.1.130)からキャッシュDNSサーバ(192.168.1.130) へ名前解決問い合わせ時のフラグ
    • qr (Query/Response): 0=質問、1=応答
    • rd (Recursion Desired): クライアントが「再帰」を要求
    • ra (Recursion Available): 1=サーバが再帰機能を提供している
    • ad (Authenticated Data):  DNSSEC検証に成功し"正当なデータ"と判断 (※キャッシュDNSサーバ側で検証する)

▼その他

nslookup時の権限のない回答とは

DNS パケットには AA ビット (Authoritative Answer) という 1bit のフラグがあります。

  • AA ビット 意味 nslookup の表示例
    • 1 (ON) 返答したサーバー自身が そのゾーンの権威 (authoritative) である。(※権限ありの回答)
    • 0 (OFF) 返答したサーバーは キャッシュ or 代理 で答えている。(※権限のない回答)

▼参考

gihyo.jp www.cloudflare.com unbound.jp gihyo.jp

END