2025年5月31日

RaspberryPiとUnboundを使ったローカルDNSキャッシュサーバの構築


海に佇む朱の鳥居
海に佇む朱の鳥居        


WSL2などを使ってローカル内に独自システム環境を構築すると,Webサーバのためのローカルドメインがどうしても使いたくなります。

IPアドレスでアクセスも出来ますが,IPアドレスがwebブラウザ上で表記されるのも良くありません。

これを解決する方法としては正規ドメインをドメインレジストラから取得する方法と,独自のDNSキャッシュサーバを作成してプライベートドメインを設定する方法があります。
  • ドメインレジストラとは、ドメイン名の登録申請を受け付け、レジストリ(ドメインデータベースを管理する機関)に登録する業者
正規のドメインを使うのが最も良いのですが費用がかかります。一方,プライベートドメインの場合は名前衝突問題が発生するので注意が必要です。

名前衝突の可能性が低いドメイン名(gTLD で使われていない)を使い,かつインターネットと分離したローカル内で名前解決できる環境を整備しなくてはなりません。
  • gTLD (generic Top Level Domain; 分野別トップレベルドメイン)とは,特定の国や地域によらず、世界中から誰でも登録できるトップレベルドメインのことです。
そこで,古くなったRaspberryPiとDNSキャッシュサーバ用のソフトである「Unbound」を使って,ローカルDNSキャッシュサーバを作成しプライベートドメインを実証してみました。

【実証前提条件】
  • Raspberry Pi1 Model B Rev.2 512 MB of RAM
  • OS :  Raspbian GNU/Linux 12 (bookworm) (CMD : lsb_release -a)
  • Ubound : Version 1.17.1 (CMD : unbound -h | grep Version)

それでは学習を始めます。






  1.はじめに

ドメイン名を提供するDNS(Domain Name System)について説明します。

【DNSとは】
インターネットはIPアドレスで動いているので,ドメイン名をIPアドレスに変換する仕組みが必要です。このドメイン名とIPアドレスを結びつけているのが,DNS(Domain Name System)といわれるシステムです。

このDNSを提供しているサーバをDNSサーバといい,DNSサーバには権威DNSサーバとDNSキャッシュサーバの2種類が主にあります。

【権威DNSサーバ】
  • 権威DNSサーバはドメイン名の「正規の情報」を監理するサーバです。

【DNSキャッシュサーバ】
  • DNSキャッシュサーバは、DNSの情報を一時的な「キャッシュ」として保存しておくサーバです。一度取得した情報を蓄積しますので,同様の問合せに対し早く回答することが可能です。

ドメインレジストラが扱うサーバが権威DNSサーバです。インターネット上のドメイン名やIPアドレスなどを全世界的に管理・調整する「非営利法人ICANN(Internet Corporation for Assigned Names and Numbers)」と連携しています。

また,権威DNSサーバを構築するアプリは「BIND」が主流ですが,構築が難しくバグも多いので,プライベートなDNSキャッシュサーバを作るのには向きません。

今回は,簡易的なローカル向けDNSキャッシュサーバを作るため,「Unbound」というアプリを利用します。

【Unboundとは】
「Unbound」は、DNS (Domain Name System) のキャッシュサーバーに特化したオープンソースソフトウェアです。オランダのNLnet Labsが開発,高速で動作しDNSキャッシュポイズニング攻撃などからシステムを保護する機能が充実しています。


今回の「Unbound」のインストール機器は,Webアプリが動くWindowsPCに同居させても良いのですが,Webアプリの点検時にDNSキャッシュサーバも同時に停止するのは困るため,たまたまあった古いRaspberryPiを利用しました。

また,プライベートドメインは名前衝突のないドメイン名(gTLD で使われていない)を使う必要がありますが,目下のところ「.home」と「.corp」が無難なようです。

世界中でプライベート用に使うトップドメインの取決めがあれば助かるのですが,それが出来るまでの間は上記で代用します。




  2.RaspberryPi OSのインストール

RaspberryPiへのOSインストールは,以下のブログを参考にしてください。RaspberryPi財団からイメージメディアを作るソフトをダウンロードします。

RaspberryPi OSのインストールとVNC利用

RaspberryPi OSのインストールとVNC利用

RaspberryPiOSのインストール方法とVNC利用方法を説明する。IoTセンサーの接続基盤を構築する。


RaspberryPiへのOSインストールは,機種によりインストール方法が変わりますので,柔軟に対応してください。

また,RaspberryPiのイメージメディアを作る過程で次のことにご留意ください。
  • ホスト名,ユーザ名,パスワードを忘れずにメモしておく。
  • SSHサーバは使えるよう設定する。
  • キーボードレイアウトを「jp」版にする。
特に機器の内部メモリが小さい場合は,極力GUI「Graphical User Interface」を使わずCLI「Command Line Interface」で対応した方が良いのですが,固定IPアドレスの設定などはDeskTop画面からでないと面倒です。

DNSキュッシュサーバとして使うのでRaspberryPiのIPアドレスは固定にします。財団はルータのDHCP設定で行うのを推奨していますが,対応できないルータもありますので,ここではRaspberryPiに「192.168.0.XXX」を直接設定します。

ルータのDHCPアドレスと競合しないように離れた番号を設定して下さい。

また,VNCツールを使ってDeskTop画面を開く時はVNCサーバを起動する必要があります。

対応機種OSによってはVNCサーバは既にインストール済みですが,無い場合は,次のコマンド群を入力してVNCサーバをインストールします。

Linuxコード

sudo apt update
sudo apt upgrade
sudo apt install realvnc-vnc-server


VNCサーバの起動は,CLIプロンプト「$」から次のコマンドを入力して「Configuration Tool」画面を開きます。

Linuxコード

sudo raspi-config

メニューの「3 Interface Options」>「P3 VNC」と進んで,後は画面の指示に従ってVNCサーバを立ち上げてください。

PaspberryPiにVNCツールでつないでも,VT(ビデオターミナル)でつないでもいいですから,DeskTop画面を開いて固定IPアドレスを設定します。

DeskTop画面さえ開けば,右上の「↑↓」アイコンから,「高度なオプション(A)」>「接続を編集する」>「有線接続1又は無線接続」>「左下の設定マーク」>「IPv4設定」と進んで,IPアドレスを設定します。

「IPv6設定」も出来ますが,ローカルの場合は全てIPv4で統一した方が簡単です。

ここまでで,RaspberryPiにOSが正常にインストールされたものと仮定します。




   3.Unboundのインストールと主な機能

「Unbound」のインストール方法は,RaspberryPi OSのLinuxプロンプトから次のコマンド群でインストールします。

Linuxコード

sudo apt update
sudo apt install unbound


「Unbound」の状態確認は,次のコマンドを入力します。

Linuxコード

sudo systemctl status unbound


「Unbound」が電源起動時に自動起動・解除するには,次のコマンド群で設定します。

Linuxコード

sudo systemctl enable unbound
sudo systemctl disable unbound

Unboundを単に起動・停止・再起動する場合は,次のコマンド群を適宜入力します。

Linuxコード

sudo systemctl start unbound
sudo systemctl stop unbound
sudo systemctl restart unbound

「Unbound」は小規模から大規模までのDNSキュシュサーバとして利用する事が出来ます。
そのため,下記のように多様な機能に対応できるようになっています。

 
項  目 説  明
(A)  Unbound入出力パラメータとlocal-zoneの設定   インタフェースIPアドレスとその範囲,TCP,UDPおよびローカルドメイン名と対するIPアドレスの設定
(B)  RootHintsファイル作成
ルートDNSサーバのIPアドレス等の情報を格納したファイルを作成する(今回は自動更新しない)
(C)  ログローテーション設定   ログデータが大量に発生するため,ログファイルのローテート回数などを指定し不要なログを消去する
(D)  DNSSECとDOTによるForward-Zoneの設定    DNSSEC(DNS応答に電子署名を追加し、問い合わせ側で検証することでDNSの攻撃耐性を向上させる技術)とDOT(DNS over TLS:DNSクエリを暗号化して保護し機密性を高める技術(キャッシュポイズニング保護))の設定
(E)  リモートコントロール設定 Unboundを停止せずに,外部からリモートでUnboundを制御するための設定
(F)  パフォーマンス設定 サーバのコア数,スレッド数,キャッシュサイズ,キャッシュ保持時間などを指定する
(G)  ラウンドロビンの利用 大きなトラフィック負荷をサーバのIPレベルで分散する手法(今回はローカルで負荷が軽いため設定しない)

今回のDNSキャッシュサーバは,ファイヤーウォール等で守られたローカルネット内で利用するものであり,インターネットに直接晒さず,負荷もそれ程高くありません。

そのため,ローカルDNSに最低限必要と思われる(A)~(F)について設定することにします。本格的に構築する際は,セキュリティや性能面などを十分に考慮してください。

また,DNSキャッシュサーバのOSや「Unbound」のバージョンによって,TLSのCA証明書の格納場所やファイル名が違ったり,「Unbound」設定ファイルの構成が違ったりしますのでご注意下さい。




  4.Unbound入出力パラメータとlocal-zoneの設定(A)

今回の「Unbound」バージョンでは,「/etc/unbound/unbound.conf」ファイルに以下のように設定されていました。

/etc/unbound/unbound.conf

# Unbound configuration file for Debian.
#
# See the unbound.conf(5) man page.
#
# See /usr/share/doc/unbound/examples/unbound.conf for a commented
# reference config file.
#
# The following line includes additional configuration files from the
# /etc/unbound/unbound.conf.d directory.
include-toplevel: "/etc/unbound/unbound.conf.d/*.conf"
#

これを見ると,「/etc/unbound/unbound.conf.d」フォルダの下に「*.conf」形式でファイルを作れば,設定ファイルとして「Unbound」アプリに読み込まれることが分かります。

そこで,今回はこのフォルダの下に,「unbound.conf」という設定ファイルを作成し,その中に以下の設定を行いました。

/etc/unbound/unbound.conf.d/unbound.conf

server:
        # 待受IPアドレスの設定
        interface: 192.168.0.XXX
        interface: 127.0.0.1
        # ポート番号の設定
        port: 53
        # IPアドレス・プロトコル等の利用設定
        do-udp: yes
        do-tcp: yes
        do-ip4: yes
        do-ip6: yes
        # アクセスするIPアドレスの許可設定
        access-control: 0.0.0.0/0 refuse
        access-control: 127.0.0.1/8 allow
        access-control: 192.168.0.0/16 allow
        access-control: ::0/0 refuse
        access-control: ::1/128 allow
        #ログファイルの設定
        logfile: "/var/log/unbound/unbound.log"
        use-syslog: no
        log-queries: yes
        log-time-ascii: yes
        # バージョンは隠す
        hide-identity: yes
        hide-version: yes
        # roothintsファイルを指定する
        # sudo curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache
        root-hints: "/etc/unbound/root.hints"
        # ローカルゾーンの設定
local-zone: "local-domain.home." transparent
        # ドメインは末尾のドットを忘れないように
        # <domain>. [TTL] IN <Type> <IPアドレス>
        local-data: "local-domain.home. 300 IN A 192.168.0.XXX"
        local-data: "www.local-domain.home. 300 IN A 192.168.0.XXX"
        # 逆引きの設定
        # <IP> [TTL] <domain>.
        local-data-ptr: "192.168.0.XXX 300 www.local-domain.home."
        #

内容を若干説明します。
  • interfaceは,「Unbound」で待ち受けるIPアドレスを設定。「XXX」には固定IPアドレスの具体的数字を入力します。
  • portは,DNS用のポート番号「53」を指定します。
  • do-udp,do-tcp,do-ip4,do-ip6は,利用は「yes」,非利用は「no」です。
  • access-controlは,「Unbound」にアクセスするIPアドレスを制限します。拒否は「refuse」です。「allow」の場合は再帰クエリアクセスのみ許可します。「allow_snoop」は,再帰・非再帰クエリどちらにも応答します。「キャッシュ」の内容を調べる時などに使います。「refuse」で全て拒否した後に,使いたいIPアドレスのみ許可します。
  • logfileは,ログを出力するファイルを指定します。syslogを使う場合は指定しなくてもいいですが,故障時の分析等で該当箇所を探すのが大変なので個別ファイルにします。
  • use-syslogは,syslogにログを出力する時は「yes」。今回は「no」にしました。
  • log-queriesは,クエリをログに出すときは「yes」にします。
  • log-time-asciiは,ログの時間を「アスキー」で表現する時は「yes」にします。
  • hide-identityは,クエリに応答する際に、自身の識別情報を隠す設定です。
  • hide-versionは,クエリに応答する際に、Unboundのバージョンを隠す設定です。
  • root-hintsは,ルートDNSのアドレス情報を格納するファイルを指定します。今回は「sudo curl -o /etc/unbound/root.hints  https://www.internic.net/domain/named.cache」で作成しました。
  • local-zoneは,「local-domain.home.」を任意のローカルドメイン名に変更して下さい。「transparent」は,local-dataに該当するデータが無い場合にインターネット上に通常の再帰問い合わせ処理をします。再帰問合せをしないでNXDOMAINかNODATAを返したい場合は「static」とします。
  • local-dataは,順引き(任意のローカルドメイン→任意のIPアドレス)の設定を示します。ttl時間はクライアントがキャッシュした DNS レコードを保持する時間(秒)を示します。省略した場合は3600秒です。ドメインの末尾には”.”ピリオドが必要です。「XXX」にはローカルドメインに対応する任意のアドレスを入れてください。
  • local-data-ptrは,逆引き(任意のIPアドレス→任意のローカルドメイン名)の設定になります。「XXX」にはローカルドメインに対応する任意のアドレスを入れてください。
その他にも,沢山のオプションがあります。詳しくは日本Unboundユーザー会を御覧下さい。

なお,Unbound.confの雛形は「/usr/share/doc/unbound/examples/unbound.conf」にありました。



【注意】
RaspberryPiのリゾルバとUnboundが競合してUnboundが思惑通り動かない場合があるかもしれません。その場合は,リゾルバの設定ファイル「/etc/resolv.conf」を手動で以下のように修正します。

/etc/resolv.conf

/etc/resolv.conf
# Generated by NetworkManager
nameserver ::1
nameserver 127.0.0.1

なお,この例では,設定ファイルを変更してもサーバ起動時に,「NetworkManager」アプリがDHCPサーバから取得したDNS情報に自動的に書き換えてしまいます。

そこで,NetworkManager設定ファイル「/etc/NetworkManager/NetworkManager.conf」の中に次の記述を加えます。

「/etc/NetworkManager/NetworkManager.conf」

[main]
dns=none

設定を変更したら,次のようにNetworkManagerを再起動して下さい。

Linuxコード

sudo systemctl restart NetworkManager


これで,リゾルバの設定ファイル「/etc/resolv.conf」は書き換えられません。




   5.RootHintsファイル作成(B)

先ほどの設定ファイル「/etc/unbound/unbound.conf.d/unbound.conf」の中において,「root-hints: "/etc/unbound/root.hints"」と設定しました。

そのため,ここでは「root.hints」ファイルを作成します。以下のコマンドを入力します。

Linuxコード

sudo curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache


本来ですと,このファイルは定期的に変わりますので自動更新する必要がありますが,今回は自動更新設定しないこととします。

またの機会に「cron」か「timer」で自動更新の仕方を学習したいと考えます。




   6.ログローテーション設定(C)

先ほどの設定ファイル「/etc/unbound/unbound.conf.d/unbound.conf」では,ログを「/var/log/unbound/unbound.log」に出力するようにしました。

ログはsyslogに出力することも出来ますが,分かりにくいのでUnbound専用のファイルを作成したところです。そのため,次のコマンドでログのためのフォルダを作ります。

Linuxコード

sudo mkdir -v /var/log/unbound
sudo chown -v unbound:unbound /var/log/unbound

「Unbound」アプリにフォルダを操作する権限を「chown」コマンドで与えています。

また,ログはエラーが発生した時の解析に有効ですが,どんどん増えますので,クリア方法を設定します。

ログローテーション設定ファイル「/etc/logrotate.d/unbound」をroot権限で,次のように作成します。

/etc/logrotate.d/unbound

#Unboundのログローテーション設定
/var/log/unbound/*.log {
  daily
  rotate 2
  create 644 unbound unbound
  dateext
  missingok
  notifempty
  compress
  delaycompress
  sharedscripts
  postrotate
   /usr/sbin/unbound-control log_reopen > /dev/null 2>&1 || true
  endscript
}

これは,logファイルのローテート処理を制御する設定ファイルになります。主な内容は次のとおりです。
  • daily: 1日に1度ローテーションする。(他にweekly ,monthly等あり
  • rotate 2 : ローテートを2回まで保存する。
  • create 644 unbound unbound : ローテーション後に空のファイルを作る。
  • dateext : 古いログファイル名の語尾に日付8桁 (-YYYYMMDD)を付加
  • missingok : ログファイルがなくても処理続行 
  • notifempty : ログファイルが空ならローテーションしない
  • compress : ローテーションしたログをgzipで圧縮する
  • delaycompress : ローテーション1世代目は圧縮しない
  • sharedscripts : ローテーション毎に以下のスクリプトを1回だけ実行する。
  • prerotate : ローテーション前にendscriptまでのスクリプトをsharedscriptsが無ければログファイル毎に実行する
  • postrotate : ローテーション後にendscriptまでのスクリプトをsharedscriptsが無ければログファイル毎に実行する。今回のスクリプトは,新規ログファイルへ出力するようリモートコントロールで「reopen」させています。


ログローテーションの設定が終了したら以下のコマンドを入力してテストします。

Linuxコード

sudo logrotate -d /etc/logrotate.d/unbound

エラーが無ければOKです。




  7.DNSSECとDOTによるForward-zoneの設定(D)

【DNSSEC設定】
DNSSECとは,電子署名を検証することでDNSデータが改ざんされていないことを確認するための仕組みです。

電子署名を検証するには,それに対応した公開鍵の設定が必要になります。Unbound 1.4.7以降では次のようにunbound-anchorユーティリティを使ってroot.keyファイルを生成できます。以下のコマンドを入力してください。

Linuxコード

sudo unbound-anchor -a "/etc/unbound/root.key"
sudo chown unbound:unbound /etc/unbound/root.key

なお,「unbound-anchor」ユーティリティがインストールされていない場合があります。その場合は,以下のコマンドでインストールしてください。

Linuxコード

sudo apt install unbound-anchor


今回の「Unbound」のバージョンでは,「/etc/unbound/unbound.conf.d/root-auto-trust-anchor-file.conf」という設定ファイルが以下のようになっています。

/etc/unbound/unbound.conf.d/root-auto-trust-anchor-file.conf

server:
    # The following line will configure unbound to perform cryptographic
    # DNSSEC validation using the root trust anchor.
    auto-trust-anchor-file: "/var/lib/unbound/root.key"

このファイルの設定から,自動的に「root.key」が取り込まれるようになります。

DNSSEC が機能しているかどうかをテストするには、unbound を再起動後に次の手順を実行します。dns.googleはDNSSECをサポートしているGoogleのDNSパブリックサーバです。

Linuxコード

sudo unbound-host -D -v dns.google

応答メッセージのIP アドレスの横に (secure) という文字があるはずです。

なお,「unbound-host」ユーティリティはインストールされていない場合があります。その時は,「sudo apt install unbound-host」コマンドでインストールして下さい。


【DNS over TLS設定】
次に,DNS over TLS (以下DoTという)とは、DNSクエリと応答を暗号化してユーザーのプライバシーを保護し、DNSキャッシュポイズニングなどの攻撃から守るためのセキュリティ強化策です。

DOTを有効化するには以下のように設定します。今回は,「/etc/unbound/unbound.d」フォルダの下に「dot.conf」ファイルを新規作成し,次のように記述しました。

/etc/unbound/unbound.d/dot.conf

server:
    tls-port: 853
    tls-cert-bundle: "/etc/ssl/certs/ca-certificates.crt"
forward-zone:
    name: "."
    forward-tls-upstream: yes
    #
    forward-addr: 103.2.57.5@853#public.dns.iij.jp
    forward-addr: 103.2.57.6@853#public.dns.iij.jp
    #

若干,説明します。

【server:】
「tls-port:」は,853を指定します。
「tls-cert-bundle:」は,各OSが提供するca-certificatesパッケージから「ca-certificates.crt」証明書を指定します。これはサーバ証明書の有効性を検証するために必要になります。

「ca-certificates.crt」証明書は,複数のCA(認証局)の証明書を一つにまとめたもので,ほとんどのLinuxディストリビューションでは、OSパッケージをインストールすることでこのCA証明書バンドルが入手できます。

各OSにおけるCA証明書バンドルのデフォルト保存場所は以下のとおりです。
  • Fedora Linux は,/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
  • Debian/Ubuntu は,/etc/ssl/certs/ca-certificates.crt
CA証明書バンドルが見つからない場合は、ディストリビューションのドキュメントを参照します。

オプションを正しく設定していない場合は,「tls-cert-bundle」証明書検証エラー が発生し、Unbound がリモート リゾルバへの接続を拒否する可能性があります。

【forward-zone:】
「name: "."」は,全ての問い合わせに対してフォワードすることを示します。

「forward-tls-upstream:」は,「Unbound」が上流DNSサーバとの通信にTLS (Transport Layer Security) を使用するかどうかを制御します。yesに設定すると「Unbound」はDNSサーバーへの接続にTLSを使用し、DNSクエリを暗号化します。

「forward-addr:」は,<DNSサーバのIPアドレス>@853#<DNSサーバのホスト名>で記述します。今回は,DNS-over-TLS (DoT) が接続可能なIIJ Public DNSサービス(2027年3月31日まで)を利用して実証しました。

このDNSサービスは,DNS-over-TLS (DoT) による名前解決サービスになりますので,このDNSを使えればDOTは有効に機能していると考えられます。




  8.リモートコントロール設定(E)

リモートコントロールとは,DNSサーバーUnboundを、UNIX系オペレーティングシステム上のコマンドラインインターフェース (CLI) ツール「unbound-control」を使って、ネットワーク越しに操作・制御することです。

今回の「Unbound」のバージョンでは,「/etc/unbound/unbound.conf.d/」フォルダの下に
「remote-control.conf」という以下のような設定ファイルが用意されていました。

/etc/unbound/unbound.conf.d/remote-control.conf

remote-control:
  control-enable: yes
  # by default the control interface is is 127.0.0.1 and ::1 and port 8953
  # it is possible to use a unix socket too
  control-interface: /run/unbound.ctl
  #
  # Enable remote control with unbound-control(8) here.
  # set up the keys and certificates with unbound-control-setup.
  control-enable: yes
  # what interfaces are listened to for remote control.
  # give 0.0.0.0 and ::0 to listen to all interfaces.
  control-interface: 127.0.0.1
  control-interface: ::1
  # port number for remote control operations.
  control-port: 8953
  # unbound server key file.
  server-key-file: "/etc/unbound/unbound_server.key"
  # unbound server certificate file.
  server-cert-file: "/etc/unbound/unbound_server.pem"
  # unbound-control key file.
  control-key-file: "/etc/unbound/unbound_control.key"
  # unbound-control certificate file.
  control-cert-file: "/etc/unbound/unbound_control.pem"#

この設定ファイルの中身をみると,「unbound-control-setup」ユーテリティを使って,鍵と証明書をセットアップしないといけないようです。以下のコマンドを入力してください。

Control用鍵の生成

sudo unbound-control-setup


これにより「/etc/unbound/」フォルダの下に以下の鍵と証明書が作られます。
  • unbound_control.key
  • unbound_control.pem
  • unbound_server.key
  • unbound_server.pem

なお,詳しくは日本Unboundユーザー会を御覧下さい。




  9.パフォーマンス設定(F)

ここまでで,設定はほぼ終了しましたが,最後の設定としてパフォーマンスの設定をします。

今回のDNSキャッシュサーバは,ローカル内で使うもので,負荷もそれほど高くないので,基本的な設定のみとします。

「/etc/unbound/unbound.conf.d/」フォルダの下に,以下のような「performance.conf」を作ることにします。

/etc/unbound/unbound.conf.d/performance.conf

server:
    # CPU論理コア数(CMD:sudo nproc)
    num-threads: 1
    # キャッシュのスラブ数指定(num-threadsに近い「2の累乗」)
    msg-cache-slabs: 2
    rrset-cache-slabs: 2
    infra-cache-slabs: 2
    key-cache-slabs: 2
    # キャッシュサイズの指定( rrset-cache-size = msg-cache-sizeの2倍)
    rrset-cache-size: 128m
    msg-cache-size: 64m
    # オープンポート数とスレッド毎の同時対応クエリ数を設定
    # outgoing-range = num-queries-per-threadの2倍
    outgoing-range: 8192
    num-queries-per-thread: 4096
    # スレッド毎のTCPのクエリ上限数を設定
    incoming-num-tcp: 1000
    outgoing-num-tcp: 1000
    # DNS 応答メッセージを最小限にするための設定
    minimal-responses: yes
    # クエリ/応答のパケット数を削減させる
    qname-minimisation: yes
    # TCPポートをリサイクルする
    so-reuseport: yes
    # キャッシュの最大・最小存続時間(単位:秒)
    cache-max-ttl: 14400
    cache-min-ttl: 1200
    #

今回の設定では,ラズパイ機器の性能が低いので,メモリーやCPUをなるべく使わない方向で効果のありそうなオプションを設定しました。

「Unbound」には,通常の機器であれば,さらに性能を向上させるオプションがあります。本格的にDNSキャッシュサーバを構築する時には考慮してください。

他のオプションとしては,カーネルバッファを大きくする「so-revfuf:,so-sndbuf:」,人気キャッシュを残す「prefetch:,prefetch-key:」,ラウンドロビンを使う「rrset-roundrobin:」などがあります。


全ての設定を作成・変更したら,次のチェックと再起動を適宜行います。

Linuxコード

sudo unbound-checkconf


エラーが無ければ,Uboundを再起動します。

Linuxコード

sudo systemctl restart unbound




  10.動作確認

「Unbound」の設定が一通り終わりましたので,動作確認をします。これには,主にDNSSECの確認とDOT(DNS over TLS)の確認をします。


【DNSSECの確認】

確認コマンドはいろいろあるのですが,「dig」コマンドが簡単そうなので,DNSSECをサポートしているGooglepublicDNS(ホスト名:dns.google)を使って,以下のコマンドをLinuxプロンプトから入力してください。

Linuxコード

sudo dig +dnssec dns.google

DNSSECの署名検証を確認する場合は,+dnssecオプションを付加して実行し,HeaderのstatusがNOERROR`、flagsにadが含まれ、ANSWER SECTIONにAレコードと対応するRRSIGレコードが含まれていることを確認します。(「dig +dnssec . SOA」コマンドでも確認可能)


【DOT(DNS over TLS)の確認】

この確認は,RaspberryPiのデバイスを通るメッセージを確認する方法がありますが,クエリ等が暗号化されているためそれを分析するのは難しいです。

今回の「forward-zone:」設定では,IIJのPublicDNSサービスを利用しており,DOTをサポートしていないと繋がらないようですから,インターネット上のドメインがアドレス解析できるのであれば,DOT設定出来ていると考えていいかと思います。

参考にRaspberryPiのデバイスを通るメッセージの確認方法は,次のコマンドを入力して「tcpdump」アプリを入手します。


Linuxコード

sudo apt install tcpdump


次のコマンドをDNSキャッシュサーバのコマンドプロンプトに入力して,ダンプを出力します。

Linuxコード

sudo tcpdump -vv -x -X -s 1500 -i <RaspberryPiのdev情報> 'port 853'


「RaspberryPiのdev情報」は,「sudo ip r」コマンドなどで入手してください。

その状態で,他の端末から次のコマンドなどを入力すれば,流れるクエリ情報が見えるはずです。ただし,平文ではないのでよく分からないです。


Linuxコード

dig +dnssec @192.168.0.XXX dns.google SOA


なお,「XXX」には,ローカルDNSキャッシュサーバのアドレスを入れてください。


最後にローカルDNSキャッシュサーバの待ち受け状態を確認します。以下のコマンドを入力してください。


Linuxコード

sudo ss -lutnp

各ポートセッションで待ち受けしているのがわかります。




   11.まとめ

現在のところ,順調に稼働しており,ローカルネット内でドメインが利用できるようになりました。

残るは,このドメインへのSSL証明書の付与です。これについては正規の証明書を取ることも可能ですが,ローカル内なので自己証明書を作ることにしました。

今回は,実証にかなり時間がかかり大変でした。一応,セキュリティ対応も施しましたが,あくまでもローカルで使う前提ですので,ファイヤーウォールで保護されたネットワーク内で使うようにします。

また,RaspberryPiの性能が低いので心配しましたが,今のところ低負荷では問題ないようです。


それでは,楽しいITリテラシーライフをお過ごしください。


(ご注意)情報の正確性を期していますが,実施される場合には自己責任でお願いします。


0 件のコメント:

コメントを投稿