ネットワークパフォーマンスの向上:LinuxでDnsmasqを使ったローカルDNSサーバーのセットアップ

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

DNSアプローチの比較:Dnsmasqが際立つ理由

Linux環境でのDNS解決には、いくつかの選択肢があります。それぞれに長所と短所があり、これらの違いを理解することで、Dnsmasqのような軽量ソリューションが真に優れている点が浮き彫りになります。

従来の本格的なDNSサーバー:BIND

複雑なエンタープライズネットワークでは、BIND (Berkeley Internet Name Domain) のような堅牢なDNSサーバーが業界標準と見なされることがよくあります。ゾーン転送、DNSSEC、複雑なルーティング、高可用性といった広範な機能を誇ります。しかし、この強力さには大きなトレードオフが伴います。BINDはリソースを大量に消費し、設定と保守が非常に複雑です。小規模オフィスやホームラボのためにBINDをセットアップしようとすると、大槌でクルミを割るような不必要に過剰な作業に感じられるでしょう。

パブリックDNSリゾルバー:Google DNS、Cloudflare DNS

Google DNS (8.8.8.8) や Cloudflare DNS (1.1.1.1) のようなパブリックDNSリゾルバーは、明確な利点を提供します。通常、ISP提供のDNSよりも高速な解決を提供し、多くの場合、強化されたプライバシー機能が付属しており、通常、より優れた信頼性を誇ります。

これらのサービスは、一般的なインターネット閲覧には優れています。しかし、主な制限は、内部ドメイン解決を全くサポートしていない点です。カスタムホスト名(例:dev.local)に依存するローカルサービスや開発環境を運用している場合、パブリックリゾルバーはそれらを見つける方法を知りません。

Systemd-Resolved

多くのモダンLinuxディストリビューション、特にsystemdを利用しているものは、systemd-resolvedを頻繁に使用します。このサービスはローカルDNSリゾルバーとして機能し、クエリをキャッシュし、様々なDNSプロトコルをサポートします。

これは、/etc/resolv.confに直接依存するよりも大幅な改善を表しています。しかし、systemd-resolvedはいくつかのローカルホスト管理を提供しますが、そのキャッシュはDnsmasqよりも積極的でない場合があります。さらに、カスタム内部ドメイン用に設定することは、Dnsmasqのより分かりやすいアプローチほど柔軟で、普遍的に理解されているとは限りません。

Dnsmasq:軽量のチャンピオン

Dnsmasqは本当にちょうどいい位置を占めています。軽量で設定が簡単なDNSフォワーダーおよびDHCPサーバーとして特別に構築されています。特に、外部リゾルバーからのDNSクエリのキャッシュと、内部ネットワークリソースのローカルDNS解決において優れた能力を発揮します。その本質的なシンプルさは、最小限のシステムリソースしか消費しないことを意味し、小さなRaspberry Piから、BINDの計り知れないパワーを必要としないプロダクションサーバーまで、あらゆるものにとって理想的な選択肢となります。

Dnsmasq:長所、短所、そして実践

4GBのRAMを持つプロダクションUbuntu 22.04サーバーでDnsmasqを6ヶ月間運用した後、このアプローチが処理時間を大幅に削減したと自信を持って言えます。これは、頻繁にアクセスされる内部サービスやキャッシュされた外部ルックアップで特に顕著でした。信頼できる主力として機能してきました。私の観察結果を詳細に説明します:

Dnsmasqを使用する利点

  • 軽量なリソース使用量: Dnsmasqはフットプリントが非常に小さく、リソースが限られたシステムに最適です。実際、私のサーバーではDnsmasqが動作していることをほとんど認識しません。
  • 簡単な設定: メインの設定ファイル、/etc/dnsmasq.confは、非常に分かりやすくコメントされています。基本的なDNSキャッシュとローカル解決は、わずか数分で運用可能になります。
  • DNSキャッシング: DnsmasqはDNSクエリを効率的にキャッシュし、頻繁にアクセスされるウェブサイトや内部サービスへのその後のルックアップを大幅に高速化します。これは、ページ読み込みの高速化とコマンド実行の迅速化に直接つながります。
  • ローカルDNS解決: ローカルの/etc/hostsファイルや追加のホストファイルからホスト名を直接シームレスに解決でき、本格的なDNSサーバーの複雑さなしに内部ドメインを管理する簡単な方法を提供します。
  • DHCPサーバー機能: DNS機能に加えて、DnsmasqはDHCPサーバーとしても機能し、ネットワーククライアントにIPアドレスを自動的に提供します。この機能は、専用のDHCPデーモンが過剰となる小規模ネットワークにとって非常に役立ちます。
  • PXEブートのサポート: ディスクレスワークステーションを管理する方や自動インストールを必要とする方にとって、DnsmasqはPXEブートを便利にサポートします。

Dnsmasqを使用する際の欠点

  • 大規模企業向けではない: Dnsmasqは、DNSSEC署名、高度なゾーン転送、堅牢な高可用性構成のような機能を要求する大規模で複雑なエンタープライズ環境向けには設計されていません。
  • 限られた高度な機能: BINDと比較すると、Dnsmasqは非常に特定のDNSシナリオに必要な多くの高度な機能が当然ながら不足しています。しかし、ほとんどの家庭や小規模オフィス設定では、これらの高度な機能はめったに必要ありません。
  • Systemd-Resolvedとの設定重複: モダンLinuxシステムでは、Dnsmasqとsystemd-resolvedが競合しないように特別な注意を払う必要があります。さもないと不必要な複雑さを引き起こす可能性があります。

推奨されるセットアップ:Dnsmasqが最適な場合

私の実体験に基づくと、Dnsmasqはいくつかの特定のシナリオで優れた選択肢であることが証明されています:

  • ホームネットワーク: すべてのデバイスに対してより高速で信頼性の高いDNS解決を提供でき、NAS、メディアサーバー、スマートホームガジェットなどのデバイスの簡単な内部ホスト名管理と組み合わせて使用できます。
  • 開発環境: 外部DNSクエリをキャッシュし、仮想ホストやコンテナのカスタムドメインを効率的に解決することで、ローカル開発ワークフローを高速化します。
  • 小規模オフィス/支店ネットワーク: Dnsmasqは、専用のハードウェアや複雑で高価なソフトウェアを必要とせずに、DNSとDHCPの両方を管理するシンプルで費用対効果の高い方法を提供します。
  • 単一マシンの最適化: 単一のLinuxマシンでDNS解決を高速化し、少数のローカルホスト名を管理することが目的であっても、Dnsmasqは依然として優れた軽量ソリューションです。

実装ガイド:LinuxにDnsmasqをセットアップする

それでは、典型的なLinuxシステムにDnsmasqをインストールして設定するプロセスを順を追って説明しましょう。私の焦点は、効率的なDNSキャッシングとローカルホスト名解決を優先し、システムにsystemd-resolvedが既に存在する場合でも適切に共存するように設計されたセットアップです。

ステップ1:Dnsmasqのインストール

まず、dnsmasqパッケージをインストールする必要があります。正確なコマンドは、Linuxディストリビューションによって若干異なります:

Debian/Ubuntuベースのシステムの場合:


sudo apt update
sudo apt install dnsmasq

RHEL/CentOS/Fedoraベースのシステムの場合:


sudo dnf install dnsmasq # または古いCentOSではsudo yum install dnsmasq

ステップ2:Dnsmasqの基本設定

Dnsmasqの主要な設定ファイルは/etc/dnsmasq.confにあります。これは大量のコメントが含まれており役立ちますが、真にクリーンな状態で始めるには、元のファイルをバックアップし、新しいファイルを作成することをお勧めします。あるいは、既存のファイル内で関連する行のコメントを解除して変更するだけでも構いません。

まず、元のファイルをバックアップしましょう:


sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo touch /etc/dnsmasq.conf
sudo nano /etc/dnsmasq.conf

以下は、DNSキャッシングとローカルホスト名解決を有効にする基本的な設定です。listen-addressは、お使いのサーバーの特定のIPアドレスに適合させることを忘れないでください。Dnsmasqをローカルマシンでのみ使用する予定であれば、127.0.0.1で十分です。しかし、ネットワーク上の他のデバイスがそれを利用する必要がある場合は、サーバーのLAN IP(例:192.168.1.10)を使用するようにしてください。


# DnsmasqがリッスンするインターフェースまたはIPアドレスを指定します
listen-address=127.0.0.1
# 他のデバイスがそれを使用できるようにしたい場合は、ここにLAN IPを追加してください:
# listen-address=127.0.0.1,192.168.1.10

# /etc/resolv.confへのクエリを直接転送しないでください。
# 以下の'server'ディレクティブを使用して、アップストリームDNSサーバーを明示的に指定します。
no-resolv

# アップストリームDNSサーバーを指定します。CloudflareとGoogleは優れた信頼性の高い選択肢です。
server=1.1.1.1
server=1.0.0.1
server=8.8.8.8
server=8.8.4.4

# キャッシュサイズ:これはDnsmasqがキャッシュするDNSエントリの最大数を定義します。デフォルトは150です。
# 1000のような大きなキャッシュは、積極的に使用されるシステムにとって非常に有益です。
cache-size=1000

# 追加のホストファイルを読み込みます。これはカスタムドメインを整理するのに非常に役立ちます。
# まだ作成していない場合は、カスタム設定用のディレクトリを作成してください。
conf-dir=/etc/dnsmasq.d,.conf

# 例:DHCPサーバー設定(DnsmasqをDHCPサーバーとして機能させる必要がある場合は、これらの行のコメントを解除して調整してください)
# dhcp-range=192.168.1.50,192.168.1.150,12h

# カスタムドメイン解決を追加します。例えば、'myservice.local'は192.168.1.20に解決されます
# address=/myservice.local/192.168.1.20

# /etc/hostsで定義された内部ホスト名が提供されるようにします。
# Dnsmasqはデフォルトで/etc/hostsを読み取りますが、ここで明示的にすることで明確性が向上します。
# このように、追加のホストファイルを含めることもできます:
# addn-hosts=/etc/dnsmasq.d/my-internal-hosts

ステップ3:内部ドメインの管理

Dnsmasqはデフォルトで/etc/hostsを読み取るため、単純なローカルホスト名には完璧に機能します。しかし、カスタム内部ドメインをより整理されたアプローチで管理する場合、特に数が多い場合は、/etc/dnsmasq.d/ディレクトリ内に個別のファイルを使用することを強くお勧めします。

例えば、/etc/dnsmasq.d/my-internal-hostsという新しいファイルを作成しましょう:


sudo nano /etc/dnsmasq.d/my-internal-hosts

次に、このファイルにカスタムエントリを次のように追加します:


# 内部ホスト
192.168.1.100   dev-server.local
192.168.1.101   git-repo.local
192.168.1.102   jenkins.local

dnsmasq.confファイル内のconf-dir=/etc/dnsmasq.d,.confディレクティブにより、これらの補足ファイルが自動的に読み込まれることに注意することが重要です。

ステップ4:Systemd-Resolvedとの統合(Ubuntu/Debianにとって重要)

systemd-resolvedがアクティブなシステム(Ubuntu 22.04など)では、Dnsmasqと正しく連携するように設定する必要があります。最も簡単な方法は、systemd-resolvedの組み込みDNS機能を無効にし、/etc/resolv.confをDnsmasqインスタンスに直接向けることです。

まず、systemd-resolvedを停止して無効にし、/etc/resolv.confのシンボリックリンクを削除します:


sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo rm /etc/resolv.conf

次に、新しい/etc/resolv.confファイルを作成し、システムにDnsmasq(127.0.0.1でリッスンしている)を使用するように指示します:


sudo nano /etc/resolv.conf

以下の内容を追加します:


nameserver 127.0.0.1

この設定により、システムはすべてのDNSクエリをDnsmasqに送信します。堅牢性を高めるために、セカンダリのパブリックDNSサーバーを追加することを検討するかもしれません。ただし、これを行うと、特定のクエリに対してDnsmasqのキャッシュがバイパスされる可能性があることに注意してください:


nameserver 127.0.0.1
nameserver 1.1.1.1

ステップ5:Dnsmasqの起動と有効化

さあ、Dnsmasqサービスを起動し、システム起動時に自動的に起動するように有効にしましょう


sudo systemctl start dnsmasq
sudo systemctl enable dnsmasq
sudo systemctl status dnsmasq

statusコマンドは、Dnsmasqがアクティブで問題なく動作していることを確認するはずです。

ステップ6:テストと検証

Dnsmasqが設定されたら、すべてが期待通りに機能していることを確認することが重要です。

DNSキャッシングのテスト:

digコマンドを使用します(Debian/Ubuntuではsudo apt install dnsutils、RHEL/CentOS/Fedoraシステムではsudo dnf install bind-utilsをインストールする必要があるかもしれません)。google.comのような一般的なドメインに対して、連続して2回クエリを実行します。クエリ時間に注意してください。2回目のクエリは大幅に高速化されるはずで、キャッシングが積極的に機能していることを明確に示しています。


time dig google.com @127.0.0.1
time dig google.com @127.0.0.1

出力のQuery time:行を探してください。Dnsmasqのキャッシュから正常に提供された場合、理想的には2回目のクエリはQuery time: 0 msecと表示されるはずです。

内部ドメイン解決のテスト:

次に、カスタム内部ドメインのいずれかをクエリして、正しく解決されることを確認します:


dig dev-server.local @127.0.0.1

ANSWER SECTIONには、/etc/dnsmasq.d/my-internal-hostsで以前に定義したIPアドレスが表示されるはずです。

これらの手順に従うことで、より高速な解決と簡単な内部ホスト名管理を提供するローカルDNSサーバーのセットアップに成功したことになります。この合理化された設定は、本格的なDNSソリューションに伴う重いオーバーヘッドなしに、ネットワーク応答性の顕著な改善を提供します。

Share: